2009-04-22 11 views
2

Ich versuche Datamatrix-Barcodes aus ITEXT zu generieren. Dies funktioniert für die meisten meiner Codes, aber nicht für einige Codes. Ein Beispiel dafür ist:iText Datamatrix Generation Problem

HEnSh0701003-2V1

Dies erzeugt einen nicht quadratischen Barcode aus irgendeinem Grund. Wenn ich Encoder von anderen Firmen (wie IDAutomation) verwende, bekomme ich einen gültigen quadratischen Barcode.

Hat jemand eine Idee, warum das passiert? Ich suche nach einer Lösung, damit ich die eingebettete iTest DataMatrix-Klasse verwenden kann und keine Drittanbieter verwenden muss.

Eine Probe des Codes verwende ich:

BarcodeDatamatrix bar = new BarcodeDatamatrix(); 
bar.setOptions(BarcodeDatamatrix.DM_AUTO); 
bar.generate("HEnSh0701003-2V1"); 
bcd.addCell(bar.createImage()); 

wo bcd ein PdfTable mit 2 Spalten ist.

Antwort

3

Ich lief in genau diesem Problem. Am Ende habe ich mich mit dem iText-Quellcode beschäftigt, um diesen herauszufinden. iText passt die Größe des Barcodes an den von Ihnen bereitgestellten Text an.

iText unterstützt die folgenden Größen für Data-Matrix-Barcodes: 10x10, 12x12, 8x18, 14x14, 8x32, 16x16, 12x26, 18x18, 20x20, 12x36, 22x22, 16x36, 24x24, 26x26, 16x48, 32x32, 36x36, 40x40, 44x44, 48x48, 52x52, 64x64, 72x72, 80x80, 88x88, 96x96, 104x104, 120x120, 132x132, 144x144

Wie Sie sehen können, gibt es eine Reihe von nicht quadratischen Größen. Was ich getan habe, war eine Liste von quadratischen Barcodegrößen zu erstellen und dann jede Größe auszuprobieren, während der Rückgabewert des Aufrufs generate() überprüft wurde.

// supported square barcode dimensions 
int[] barcodeDimensions = {10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144}; 

BarcodeDatamatrix barcode = new BarcodeDatamatrix(); 
barcode.setOptions(BarcodeDatamatrix.DM_AUTO); 

// try to generate the barcode, resizing as needed. 
for (int generateCount = 0; generateCount < barcodeDimensions.length; generateCount++) { 
    barcode.setWidth(barcodeDimensions[generateCount]); 
    barcode.setHeight(barcodeDimensions[generateCount]); 
    int returnResult = barcode.generate(text); 
    if (returnResult == BarcodeDatamatrix.DM_NO_ERROR) { 
     return barcode.createImage(); 
    } 
} 

throw new Exception("Error generating barcode."); 
3

Dank JonMR

Für diejenigen, die es brauchen, hier ist der gleiche Code in VB.net

Private Function GetDataMatrixBarcode(ByVal message As String) As iTextSharp.text.Image 

     Dim barcode As BarcodeDatamatrix = New BarcodeDatamatrix() 
     Dim barcodeDimensions() As Integer = New Integer() {10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144} 
     Dim returnResult As Integer 

     barcode.Options = BarcodeDatamatrix.DM_AUTO 

     For generateCount As Integer = 0 To barcodeDimensions.Length - 1 
      barcode.Width = barcodeDimensions(generateCount) 
      barcode.Height = barcodeDimensions(generateCount) 
      returnResult = barcode.Generate(message) 
      If returnResult = BarcodeDatamatrix.DM_NO_ERROR Then 
       Return barcode.CreateImage 
      End If 
     Next 

     Throw New Exception("Error generating datamatrix barcode for text '" & message & "'") 

    End Function 
1

Sie müssen

barcode.setOptions(BarcodeDatamatrix.DM_AUTO); 

zu

barcode.setOptions(BarcodeDatamatrix.DM_B256); 
ändern
+0

'DM_B256' gab mir einen schönen 14 Pixel x 14 Pixel Bitmap/PNG. was ich mit meinem Barcode-Scanner auf Android scannen konnte. –

2

Für diejenigen, die es in C# benötigen:

// supported square barcode dimensions 
     int[] barcodeDimensions = { 10, 12, 14, 16, 18, 20, 22, 24, 26, 32, 36, 40, 44, 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 }; 

     BarcodeDatamatrix barcode = new BarcodeDatamatrix(); 
     barcode.Options = (BarcodeDatamatrix.DM_AUTO); 

     // try to generate the barcode, resizing as needed. 
     for (int generateCount = 0; generateCount < barcodeDimensions.Length; generateCount++) 
     { 
      barcode.Width = (barcodeDimensions[generateCount]); 
      barcode.Height = (barcodeDimensions[generateCount]); 
      int returnResult = barcode.Generate("1234567"); 
      if (returnResult == BarcodeDatamatrix.DM_NO_ERROR) 
      { 
       Image barcodeImg = barcode.CreateImage(); 
       table.AddCell(barcodeImg); 
       table.AddCell(string.Empty); 
      } 
     } 

Btw, weiß jemand, wie rechteckige Barcodes mit diesem zu machen? Wenn ich ein rechteckiges Format wähle, gibt es einen Fehlercode von 3 (DM_Error_Invalid_Square).

+0

Sie möchten etwas wie http://jpgraph.net/download/manuals/chunkhtml/ch26.html#fig.datamatrix-rect –

1

Implementierung in Java zum Hinzufügen eines Barcodes zu einer vorhandenen PDF-Datei mit Hilfe von itext.

Jar-Dateien verwendet: itext, commons-codec-1.6.jar

InputStream inputStream = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File("c:/tmp/your_existing.pdf"))); 
FileOutputStream outStream = new FileOutputStream("c:/tmp/pdf_copy_1.pdf"); 

PdfContentByte contentByte = null; 
     int totalPages = 0; 
     PdfReader pdfReader = null; 
     PdfStamper pdfStamper = null; 

    try { 
     pdfReader = new PdfReader(inputStream); 
     totalPages = pdfReader.getNumberOfPages(); 
     pdfStamper = new PdfStamper(pdfReader, outStream); 
     String text = "SAMPLE BARCODE TEST"; 
     String barcodeData = DigestUtils.md5Hex(text); --encoding barcode text... 

     //Adding barcode to each page in pdf 
     for (int i = 1; i <= totalPages; i++) { 
      contentByte = pdfStamper.getOverContent(i); 
      if(barcodeData != null){ 
       Image img = null; 
       BarcodeDatamatrix datamatrix = new BarcodeDatamatrix(); 
       datamatrix.setWidth(10); -- BARCODE WIDTH 
       datamatrix.setHeight(10); -- BARCODE HEIGHT 
       datamatrix.generate(barcodeData); 
       img = datamatrix.createImage(); 
       img.setAbsolutePosition(175, 750); --barcode position x,y 
       contentByte.addImage(img); 
      } 
     } 

    } 
    catch (Exception e) { 
     e.printStackTrace(); 

    }