2016-12-21 68 views
4

我使用Jascode模板和Barcode4J中的條形碼元素「Code128」打印了一個標籤,條形碼編號爲「1000049722ABCD2F」,條形碼號爲「1000049722ABCD2F」。 打印爲PDF格式,條形碼非常完美並且可以掃描。 印刷相同條形碼爲PNG文件,所述條形碼是不可掃描和它顯然從PDF條形碼不同:帶有條形碼Code128(Barcode4J)的JasperReports: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-barcode 128B等),但PDF和PNG條形碼之間總是有所不同。

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

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

回答

0

而不是使用的ImageWriter的,你爲什麼不嘗試使用MimeTypes.MIME_PNG從org.krysalis.barcode4j.tools.MimeTypes(從barcode4j-2.1.jar本身)。

我不會重複我的答案,但你可以參考我的代碼。這裏的鏈接到我的其他計算器:

Barcode4j as png image

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

相關問題