【使用Java根据模板生成PDF文件】

版权声明: https://blog.csdn.net/CSDN__FL/article/details/82870571

总结【使用Java根据模板生成PDF文件】遇到的问题以及经验

先上代码

Maven项目

pom.xml

       <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
       <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
        <dependency>
               <groupId>com.itextpdf</groupId>
               <artifactId>itext-asian</artifactId>
               <version>5.2.0</version>
        </dependency>

Java类

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

/**
 * FL 2018/9/27 总结
 */
public class pdf1 {

    public static void main(String[] args) {
        Map<String,String> map = new HashMap();
        map.put("contractNo","HT188888888888");//添加合同编号
        //添加公司名称
        map.put("firstParty","李四");//甲
        //乙方公司名称
        map.put("secondParty","张三");//乙
        Map<String,Object> o=new HashMap();
        o.put("datemap",map);
        //调用方法
        pdfout(o);
    }

    public static void pdfout(Map<String,Object> o) {
        // 模板路径  
        String templatePath = "C:\\Users\\fu\\Desktop\\模板.pdf";
        // 生成的新文件路径
        String newPDFPath = "C:\\Users\\fu\\Desktop\\成品.pdf";
        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {                                       //↓↓↓↓↓这个是字体文件
            BaseFont bf = BaseFont.createFont("C://Users//fu//Downloads//simsunttc//simsun.ttc,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            Font FontChinese = new Font(bf, 5, Font.NORMAL);
            out = new FileOutputStream(newPDFPath);// 输出流
            reader = new PdfReader(templatePath);// 读取pdf模板
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            Map<String,String> datemap = (Map<String,String>)o.get("datemap");
            form.addSubstitutionFont(bf);
            for(String key : datemap.keySet()){
                String value = datemap.get(key);
                form.setField(key,value);
            }
            stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
            stamper.close();
            Document doc = new Document();
            Font font = new Font(bf, 32);
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = null;
            ///循环是处理成品只显示一页的问题
            for (int i=1;i<=reader.getNumberOfPages();i++){
                importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
                copy.addPage(importPage);
            }
            doc.close();
            System.err.println("生成pdf文件完成~~~~~~~~~~");
        } catch (IOException e) {
            System.out.println(e);
        } catch (DocumentException e) {
            System.out.println(e);
        }
    }
}

使用word转成PDF文件模板

word转PDF

使用 Adobe Acrobat Pro 打开文件【模板.pdf】

第一步

保存好之后,改java代码中的模板路径,然后运行。

效果如下(使用谷歌浏览器打开的):

谈谈遇到的坑:

1、文字不显示:建议使用自动创建的表单,全部删除,自己创建表单,编辑属性的时候,有一个外观,可以调字体,建议12号。

2、解决成品只显示一页的问题!!!!其实就是一个循环的事情。

//第57行代码左右
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
//改成这样就不会只显示一页了。
PdfImportedPage importPage = null;
    ///循环是处理成品只显示一页的问题
    for (int i=1;i<=reader.getNumberOfPages();i++){
        importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
        copy.addPage(importPage);
     }

只显示一页的问题困扰了我两天,主要误导我的原因在于,中秋节之前不加循环执行代码,不会出现只显示一页的问题,导致我一直以为是我的电脑的问题!

Adobe Acrobat Pro 网盘链接:https://pan.baidu.com/s/1ERbvyVZU08DYqmcf_6Btqw    密码:u7ud

如果有用或者帮到了你,记得点个赞哦!有什么不足的和不全的,欢迎批评指导。

猜你喜欢

转载自blog.csdn.net/CSDN__FL/article/details/82870571