4

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

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

相同的条形码: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-barcode 之间总是存在差异。

目标: PNG-barcode 应该与 PDF-barcode 完全相同。

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

4

1 回答 1

0

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

我不会重复我的答案,但您可以参考我的代码。这是我的另一个stackoverflow的链接:

Barcode4j 为 png 图像

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

于 2017-07-19T08:23:50.917 回答