Pergunta

Eu estou tentando gerar datamatrix barcodes de dentro itext. Esta multa funciona para a maioria dos meus códigos mas não para alguns códigos. Um exemplo é:

HEnSh0701003-2V1

Isso produz um código de barras não quadrado por algum motivo. Quando eu uso codificadores de outras empresas (como IDAutomation) eu recebo um código de barras quadrado válido.

Alguém tem uma idéia de por que isso está acontecendo? Estou à procura de uma solução para que eu possa usar a classe iTest DataMatrix incorporado e não tem que usar um terceiro partido.

Uma amostra do código que estou usando:

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

onde BCD é um PdfTable com 2 colunas.

Foi útil?

Solução

Eu corri para este problema exato. Eu acabei de cavar no código-fonte iText para descobrir isso. iText é redimensionar o código de barras para ajustar o texto que você forneceu.

iText suporta os seguintes tamanhos para datamatrix códigos de barras: 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

Como você pode ver, há uma série de tamanhos não quadrados lá. O que fiz foi criar uma lista de tamanhos de código de barras quadradas e tente cada tamanho ao verificar o valor de retorno da chamada geração ().

// 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.");

Outras dicas

Graças JonMR

Para aqueles que dela necessitam, aqui é o mesmo código em 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

Para aqueles que precisam dela em C #:

// 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);
            }
        }

Aliás, alguém sabe como fazer códigos de barras retangulares com isso? Sempre que escolher um formato retangular dá-me um código de erro de 3 (DM_Error_Invalid_Square).

Você deve alterar

barcode.setOptions(BarcodeDatamatrix.DM_AUTO);

para

barcode.setOptions(BarcodeDatamatrix.DM_B256);

A implementação em Java para adicionar código de barras para arquivo pdf existente usando itext.

arquivos Jar usado: 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();

    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top