Java使用itext按模板生成PDF文件

1. 制作PDF模板

目前制作PDF模板工具别无他物,唯有使用伟大的Adobe公司提供的Adobe Acrobat Pro DC软件进行制作。

下面是一个测试PDF的表单域:

字体的大小是在这里设置的

2. 通过模板生成PDF文件

具体实现:

2.1 引入jar包
<dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itextpdf</artifactId>
     <version>5.5.13</version>
</dependency>
<dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itext-asian</artifactId>
     <version>5.2.0</version>
</dependency>
2.2 具体代码如下:
package pdfdemo;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.AcroFields.Item;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;

public classPDFUtils{/**
     * @param fields
     * @param data
     * @throws IOException
     * @throws DocumentException
     */
    private staticvoidfillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
        List<String> keys =newArrayList<String>();
        Map<String, Item> formFields = fields.getFields();for(String key : data.keySet()){if(formFields.containsKey(key)){
                String value = data.get(key);
                fields.setField(key, value);// 为字段赋值,注意字段名称是区分大小写的
                keys.add(key);}}
        Iterator<String> itemsKey = formFields.keySet().iterator();while(itemsKey.hasNext()){
            String itemKey = itemsKey.next();if(!keys.contains(itemKey)){
                fields.setField(itemKey," ");}}}/**
     * @param templatePdfPath 模板pdf路径
     * @param generatePdfPath 生成pdf路径
     * @param data            数据
     */
    public static String generatePDF(String templatePdfPath, String generatePdfPath, Map<String, String> data){
        OutputStream fos =null;
        ByteArrayOutputStream bos =null;try{
            PdfReader reader =newPdfReader(templatePdfPath);
            bos =newByteArrayOutputStream();/* 将要生成的目标PDF文件名称 */
            PdfStamper ps =newPdfStamper(reader, bos);/* 使用中文字体 */
            BaseFont bf = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList =newArrayList<BaseFont>();
            fontList.add(bf);/* 取出报表模板中的所有字段 */
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);fillData(fields, data);/* 必须要调用这个,否则文档不会生成的  如果为false那么生成的PDF文件还能编辑,一定要设为true*/
            ps.setFormFlattening(true);
            ps.close();
            fos =newFileOutputStream(generatePdfPath);
            fos.write(bos.toByteArray());
            fos.flush();return generatePdfPath;}catch(Exception e){
            e.printStackTrace();}finally{if(fos !=null){try{
                    fos.close();}catch(IOException e){
                    e.printStackTrace();}}if(bos !=null){try{
                    bos.close();}catch(IOException e){
                    e.printStackTrace();}}}returnnull;}

    public staticvoidmain(String[] args){
        Map<String, String> data =newHashMap<String, String>();//key为pdf模板的form表单的名字,value为需要填充的值
        data.put("title","河海市人民医院诊疗病历单");
        data.put("case","123456789");
        data.put("date","2020.11.02");
        data.put("name","熊瞎子");
        data.put("sex","男");
        data.put("age","29");
        data.put("phone","137888880000");
        data.put("office","内科");
        data.put("cert","身痒找打");
        data.put("drug","1、奥美拉唑肠溶胶囊             0.25g10粒×2板 ");
        data.put("dose","×2盒");
        data.put("cons","用法用量:口服 一日两次 一次2粒");
        data.put("tips","温馨提示");
        data.put("desc","尽量呆在通风较好的地方,保持空气流通,有利于病情康复。尽量呆在通风较好的地方");generatePDF("D:\\tpl2.pdf","D:\\filled.pdf", data);}}

生成效果如下:

参考文章:

https://www.cnblogs.com/zzlcome/p/11053226.html

https://blog.csdn.net/javasun608/article/details/79307845

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值