3

我正在尝试从 itext 中生成数据矩阵条形码。这适用于我的大多数代码,但不适用于某些代码。一个例子是:

HEnSh0701003-2V1

由于某种原因,这会产生非方形条形码。当我使用其他公司的编码器(例如 IDAutomation)时,我确实得到了一个有效的方形条形码。

有谁知道为什么会这样?我正在寻找一种解决方案,这样我就可以使用嵌入式 iTest DataMatrix 类,而不必使用第三方。

我正在使用的代码示例:

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

其中 bcd 是具有 2 列的 PdfTable。

4

5 回答 5

4

我遇到了这个确切的问题。我最终深入研究了 iText 源代码来解决这个问题。iText 正在调整条形码的大小以适合您提供的文本。

itext支持DataMatrix条形码的以下大小:10x10,12x12,8x18,14x14,8x32,16x16,12x26,18x18,20x20,12x36,22x22,16x36,24x24,22x26,16x48,32x32,36x36,40x40,44x44,48x48,52x52 , 64x64, 72x72, 80x80, 88x88, 96x96, 104x104, 120x120, 132x132, 144x144

如您所见,其中有许多非方形尺寸。我所做的是创建一个方形条形码尺寸列表,然后在检查 generate() 调用的返回值时尝试每个尺寸。

// 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.");
于 2009-06-23T18:12:50.607 回答
3

谢谢 JonMR

对于那些需要它的人,这是 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
于 2009-09-30T12:09:41.703 回答
3

对于那些在 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);
            }
        }

顺便说一句,有人知道如何用这个制作矩形条码吗?每当我选择矩形格式时,它都会给我一个错误代码 3 (DM_Error_Invalid_Square)。

于 2011-11-04T16:08:21.260 回答
1

你必须改变

barcode.setOptions(BarcodeDatamatrix.DM_AUTO);

barcode.setOptions(BarcodeDatamatrix.DM_B256);
于 2011-01-03T16:21:21.350 回答
1

在 Java 中实现使用 itext 将条形码添加到现有的 pdf 文件。

使用的jar文件: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();

    }
于 2013-11-07T14:32:49.423 回答