JasperReports со штрих-кодом Code128 (Barcode4J): PNG отличается от PDF
Я печатаю этикетку со следующим номером "1000049722ABCD2F" в качестве штрих-кода, используя Jasper-шаблон и элемент штрих-кода "Code128" из Barcode4J. Напечатанный в формате PDF, штрих-код идеально подходит для сканирования. При печати того же штрих-кода, что и в формате PNG, штрих-код не сканируется и, очевидно, отличается от PDF-штрих-кода:
Тот же штрих-код: PDF (верхняя часть изображения) и PNG (нижняя часть изображения):
Следующий код используется для генерации PDF-штрих-кода:
byte[] data = JasperExportManager.exportReportToPdf(jasperPrint);
Для генерации PNG не все так просто:
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(byteOutputStream);
ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("png").next();
imageWriter.setOutput(imageOutputStream);
float zoom = getZoomFactor(jasperPrint);
BufferedImage image = new BufferedImage(
(int)(jasperPrint.getPageWidth() * zoom ) + 1,
(int)(jasperPrint.getPageHeight() * zoom) + 1,
BufferedImage.TYPE_INT_RGB);
JRGraphics2DExporterNoAntialias exporter = new JRGraphics2DExporterNoAntialias();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRGraphics2DExporterParameter.GRAPHICS_2D, image.getGraphics());
exporter.setParameter(JRExporterParameter.PAGE_INDEX, Integer.valueOf(page));
exporter.setParameter(JRGraphics2DExporterParameter.ZOOM_RATIO, new Float(zoom));
exporter.exportReport();
IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image), null);
// DPI = 200, inch = 25.4
double dotsPerMilli = 200 / 25.4;
IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
horiz.setAttribute("value", Double.toString(dotsPerMilli));
IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
vert.setAttribute("value", Double.toString(dotsPerMilli));
IIOMetadataNode dim = new IIOMetadataNode("Dimension");
dim.appendChild(horiz);
dim.appendChild(vert);
IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
root.appendChild(dim);
imageMetaData.mergeTree("javax_imageio_1.0", root);
imageWriter.write(null, new IIOImage(image, null, imageMetaData), null);
imageOutputStream.close();
imageWriter.dispose();
byte[] data = byteOutputStream.toByteArray();
Я использую: barcode4j-2.1 / jasperreports-5.0.0 / 200 DPI - это необходимый размер для моего принтера этикеток
Я пытался изменить некоторые параметры (BufferedImage.TYPE-value, ширина штрих-кода, Barbecue-barcode 128B и другие), но между PDF и PNG-штрих-кодом всегда есть разница.
ЦЕЛЬ: PNG-штрих-код должен совпадать с PDF-штрих-кодом.
Может ли кто-нибудь помочь мне с этим? Буду весьма признателен за это!
1 ответ
Вместо использования ImageWriter, почему бы вам не попробовать использовать MimeTypes.MIME_PNG из org.krysalis.barcode4j.tools.MimeTypes (из самого barcode4j-2.1.jar).
Я не буду повторять мой ответ, но вы можете ссылаться на мои коды. Вот ссылка на мой другой стекопоток:
Barcode4j как изображение в формате png
и я никогда не сталкивался с этой проблемой (невозможно сканировать штрих-код) с помощью программы.