版权声明: 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文件模板
使用 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
如果有用或者帮到了你,记得点个赞哦!有什么不足的和不全的,欢迎批评指导。