java套打pdf做模版itext填数据

企业应用的项目开发,一定会遇到打印,也一定有套打的需求,比如打印报销单据了,打印发票了什么的。

接上次用word2003和excel2003实现快递单套打的临时解决方案后,今天说说java程序实现套打。

模版选择的是pdf,这个也是国外用的多的,需要安装Adobe Acrobat。

首先,创建pdf文件,工具栏-》页面-》裁剪。


工具栏-》页面-》背景,设置顺丰速运的快递单扫描件为背景。

双击页面,弹出页面大小设置窗口,设置大小,以顺丰为例230mm*127mm。


工具栏-》表单-》编辑,添加12个文本域。


删除背景图片,保存pdf为《顺丰速运模版2.0.pdf》

================================================

JAVA程序实现,新建一个maven工程,pom.xml增加itext的依赖

<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.9</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-pdfa</artifactId>
        <version>5.5.9</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-xtra</artifactId>
        <version>5.5.9</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.9</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>

itext-asian是支持中文字体的。

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.reset();

        ByteArrayOutputStream ba = new ByteArrayOutputStream();
        try {
            String pdfTemplate = "/Users/me/Downloads/顺丰速运模版2.0.pdf";
            PdfReader reader = new PdfReader(pdfTemplate);

            PdfStamper stamper = new PdfStamper(reader, ba);

            Image img = Image.getInstance("/Users/me/Documents/顺丰速递快递单.jpg");
            img.setAbsolutePosition(0,0);
            img.scaleToFit(reader.getPageSize(1));
            PdfContentByte under = stamper.getUnderContent(1);
//            under.addImage(img,img.getScaledWidth(),0,0,img.getScaledHeight(),0,0);
//            under.addImage(img);

            BaseFont bf = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

            AcroFields form = stamper.getAcroFields();
            form.addSubstitutionFont(bf);
            form.setFieldProperty("companyOfSender", "textfont", bf, null);
            form.setField("companyOfSender","上海XXX有限公司");
            form.setField("sender", "张XX");
            form.setField("addressOfSender", "上海市XX区XX路XX号XX大厦XX楼");
            form.setField("phoneOfSender", "13800210021");
            form.setField("companyOfReceiver", "xxxxxxxxxx");
            form.setField("receiver", "李XX");
            form.setField("province", "上海");
            form.setField("city", "上海");
            form.setField("district", "徐汇");
            form.setField("road", "虹漕路");
            form.setField("room", "XXX号XXX室");
            form.setField("phoneOfReceiver", "13999999999");
            stamper.setFormFlattening(true);

            stamper.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        resp.setContentType("application/pdf");
//        resp.setHeader("Content-disposition", "attachment; filename=report.pdf");
        resp.setContentLength(ba.size());
        ServletOutputStream out = resp.getOutputStream();
        ba.writeTo(out);
        out.flush();
        out.close();
        ba.close();
    }

通过控制水印图片的增加与否under.addImage(img);,区分节目展示和实际打印。


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值