JasperReports со штрих-кодом Code128 (Barcode4J): PNG отличается от PDF

Я печатаю этикетку со следующим номером «1000049722ABCD2F» в качестве штрих-кода, используя шаблон Jasper и элемент штрих-кода «Code128» из Barcode4J. Распечатанный в формате 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-штрих-код.

Может ли кто-нибудь помочь мне с этим? Буду весьма признателен за это!


person Richard    schedule 21.12.2016    source источник


Ответы (1)


Вместо использования ImageWriter почему бы вам не попробовать использовать MimeTypes.MIME_PNG из org.krysalis.barcode4j.tools.MimeTypes (из самого barcode4j-2.1.jar).

Я не буду повторять свой ответ, но вы можете обратиться к моим кодам. Вот ссылка на мой другой stackoverflow:

Barcode4j как изображение PNG

и я никогда не сталкивался с этой проблемой (не могу сканировать штрих-код) с помощью программы.

person Aza Suhaza    schedule 19.07.2017