ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java Barcode4j生成条形码并添加至pdf打印

2021-01-06 22:04:24  阅读:246  来源: 互联网

标签:条码 条形码 打印机 float java code128Bean Barcode4j new pdf


需求

公司产品需要生成条形码并可以使用打印机清晰打印产品标签。最终效果类似下图

测试过程中使用的为TSC打印机。

遇到问题

起初查找了一些java条形码生成方案。毕竟常见的有Barcode4j、zxing等。由于都能达到目的且Barcode4j条形码相关内容代码更方便查找故选择了Barcode4j。下图为官网提供的demo。(注:不同的条码规格所对应的bean不同,图中为Code39,其中还有Code128等等。只需使用正确的Bean即可。)

起初测试使用hp打印机(平常打印纸张的打印机)并没有什么问题,内容也较为清楚。后来更换为TSC打印机(更为专业的条码打印机)后发现条码内容弯弯曲曲,扫码枪根本无法识别。

排查问题

首先排除打印机问题,因为打印机打印其它网站生成的条形码并没有问题(例如菜鸟打印、lodop等)。
最终打开菜鸟打印所生成的pdf查看发现条码内容为矢量图。而我们项目中生成的条形码为png格式图片,再将png条形码图片添加至itext pdf中,再将pdf输出值打印机中。
那么使用Barcode4j生成svg条形码并再将svg加入itext中是否能够解决问题?
经调试是可行的。

相关代码

Barcode4j生成svg条形码文件。

    /**
     * 绘制条形码生成到流(code128)
     *
     * @param msg 条形码内容
     */
    @SneakyThrows
    public static void generateAtCode128(String msg, String tempFilePath, Double width, Double height, Double dpi, Double fontSize) {
        if (StringUtils.isEmpty(msg)) {
            return;
        }
        Code128Bean code128Bean = new Code128Bean();
        // moduleWidth影响条码宽度,正常来说条码内容越长条码越长,若想要减小条码宽度可调整下面的值。
        // 条码越密集对打印机精度要求越高!内容多还想要条码短,需dpi更高的打印机支持。    
        code128Bean.setModuleWidth(UnitConv.in2mm(1.5f / dpi));
        code128Bean.setBarHeight(height);
        code128Bean.doQuietZone(false);
        code128Bean.setFontSize(fontSize);
        // 输出到流
        SVGCanvasProvider canvas = new SVGCanvasProvider(false, 0);
        // 生成条形码
        code128Bean.generateBarcode(canvas, msg);
        DocumentFragment frag = canvas.getDOMFragment();
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer trans = factory.newTransformer();
        Source src = new DOMSource(frag);
        Result res = new StreamResult(tempFilePath);
        trans.transform(src, res);
    }

itext添加svg文件(如果使用的是itext7 简单更代码7.0版本提供了方法,这里为itext5)

    /**
     * svg添加至pdf 中
     *
     * @param svgFilePath 
     * @param width
     * @param height
     */
    @SneakyThrows
    private void pdfWriterSvg(String svgFilePath, double width, double height, float x, float y) {
        final String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
        UserAgent userAgent = new UserAgentAdapter();
        DocumentLoader loader = new DocumentLoader(userAgent);
        BridgeContext ctx = new BridgeContext(userAgent, loader);
        ctx.setDynamicState(BridgeContext.STATIC);
        GVTBuilder builder = new GVTBuilder();
        PdfContentByte cb = pdfWriter.getDirectContent();
        PdfTemplate svgTemplate = cb.createTemplate((float) width * PAG_PROPORTION, (float) height * PAG_PROPORTION);
        PdfGraphics2D g2d = new PdfGraphics2D(svgTemplate, (float) width * PAG_PROPORTION, (float) height * PAG_PROPORTION);
        SVGDocument city = factory.createSVGDocument("file:///" + svgFilePath);
        GraphicsNode mapGraphics = builder.build(ctx, city);
        mapGraphics.paint(g2d);
        g2d.dispose();
        cb.addTemplate(svgTemplate, x, y);
    }

后续:上线后部分用户反映条码有概率打印不出来。由于我们测试使用的是200dpi精度的打印机也存在同样问题,后续让客户使用600dpi精度的打印机后就无问题。
要想在更小的纸张,打印更多的内容,打印机的精度更加关键。由于600dpi的打印机太贵(某东最便宜的看了下也要7000多),我这边也无法进行调试。
总之有条件的买工业级的打印机效果肯定会更好。

标签:条码,条形码,打印机,float,java,code128Bean,Barcode4j,new,pdf
来源: https://www.cnblogs.com/chwwww/p/14243608.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有