我正在尝试从itext中生成datamatrix条形码。这适用于我的大多数代码,但不适用于某些代码。一个例子是:
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。
答案 0 :(得分:4)
我遇到了这个问题。我最后深入研究iText源代码来解决这个问题。 iText正在调整条形码的大小以适合您提供的文本。
iText支持datamatrix条形码的以下尺寸: 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
如您所见,那里有许多非方形尺寸。我所做的是创建一个方形条码大小列表,然后在检查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.");
答案 1 :(得分: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
答案 2 :(得分: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)。
答案 3 :(得分:1)
你必须改变
barcode.setOptions(BarcodeDatamatrix.DM_AUTO);
到
barcode.setOptions(BarcodeDatamatrix.DM_B256);
答案 4 :(得分: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();
}