gpt4 book ai didi

java - JasperReports 条码 Code128 (Barcode4J) : PNG differs from PDF

转载 作者:搜寻专家 更新时间:2023-11-01 03:47:34 25 4
gpt4 key购买 nike

我使用 Jasper 模板和来自 Barcode4J 的条码元素“Code128”打印带有以下编号“1000049722ABCD2F”的标签作为条码。 打印为 PDF,条形码完美且可扫描。打印与 PNG 文件相同的条码,条码不可扫描,与 PDF 条码明显不同:

相同的条形码:PDF(图像的上半部分)和 PNG(图像的下半部分):

Same barcode: PDF (upper) and PNG (lower)

以下代码用于生成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 值、条码宽度、Barbecue 条码 128B 等),但 PDF 和 PNG 条码之间始终存在差异。

目标:PNG 条码应与 PDF 条码完全相同。

谁能帮我解决这个问题?我将不胜感激!

最佳答案

而不是使用 ImageWriter,为什么不尝试使用来自 org.krysalis.barcode4j.tools.MimeTypes(来自 barcode4j-2.1.jar 本身)的 MimeTypes.MIME_PNG

我不会重复我的回答,但你可以引用我的代码。这是我的另一个 stackoverflow 的链接:

Barcode4j as png image

而且我在使用该程序时从未遇到过这个问题(无法扫描条形码)。

关于java - JasperReports 条码 Code128 (Barcode4J) : PNG differs from PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41264468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com