iText problema geração datamatrix
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.
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();
}