2016-12-21 2 views
4

Ich drucke ein Etikett mit der folgenden Nummer "1000049722ABCD2F" als Barcode mit einer Jasper-Vorlage und dem Barcode-Element "Code128" von Barcode4J. Gedruckt als PDF, der Barcode ist perfekt und scanbar. Drucken gleichen Barcode als PNG-Datei, ist der Barcode nicht abtastbaren und unterscheidet sich offensichtlich von der PDF-Barcode:JasperReports mit Barcode Code128 (Barcode4J): PNG unterscheidet sich von PDF

Gleiche Barcode: PDF (oberer Teil eines Bildes) und PNG (unterer Teil eines Bildes) :

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

folgenden Code wird verwendet, um die PDF-Barcode zu generieren:

byte[] data = JasperExportManager.exportReportToPdf(jasperPrint); 

PNG zu erzeugen, ist es nicht so einfach:

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(); 

Ich verwende: barcode4j-2.1/Jasper-5.0.0/200 DPI ist eine erforderliche Größe für meinen Etikettendrucker

Ich habe versucht, Ändern Sie einige Einstellungen (BufferedImage.TYPE-Wert, Barcode-Breite, Barbecue-Barcode 128B und andere), aber es gibt immer einen Unterschied zwischen PDF und PNG-Barcode.

GOAL: PNG-Barcode sollte genau dem PDF-Barcode entsprechen.

Könnte mir jemand dabei helfen? Ich würde es sehr begrüßen!

Antwort

0

Statt ImageWriter- zu verwenden, warum Sie nicht versuchen, mit MimeTypes.MIME_PNG von org.krysalis.barcode4j.tools.MimeTypes (von barcode4j-2.1.jar selbst).

Ich werde meine Antwort nicht wiederholen, aber Sie können sich auf meine Codes beziehen. Hier ist der Link zu meinem anderen Stackoverflow:

Barcode4j as png image

und ich habe Gesicht nie dieses Problems (nicht in der Lage Barcode zu scannen) mit Hilfe des Programms.

Verwandte Themen