簡體   English   中英

帶條碼Code128的JasperReports(Barcode4J):PNG與PDF不同

[英]JasperReports with Barcode Code128 (Barcode4J): PNG differs from PDF

我正在使用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值,條形碼寬度,燒烤條形碼128B等),但PDF和PNG條形碼之間總是存在差異。

目標: PNG條形碼應與PDF條形碼完全相同。

任何人都可以幫我這個嗎? 我將不勝感激!

為什么不嘗試使用org.krysalis.barcode4j.tools.MimeTypes(來自barcode4j-2.1.jar本身)的MimeTypes.MIME_PNG ,而不是使用ImageWriter。

我不會重復我的回答,但你可以參考我的代碼。 這是我的其他stackoverflow的鏈接:

Barcode4j為png圖像

我從來沒有遇到過使用該程序的問題(無法掃描條形碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM