itextpdf 5.5.10使用PdfStamper类时中文不显示问题
最近做了一个业务场景,生成支付的电子回单,业务逻辑为根据银行方的接口返回的电子回单数据,填充PDF模板,生成PDF文件。遇到了中文不显示或者只显示中文的问题,研究了三四个小时终于解决了,其实特别简单,只是网上相关的资料太少了,itextpdf的代码注释也一言难尽,所以特此记录下解决方法。
生成PDF模板:https://www.pdfescape.com/
网站可以免费免注册使用,创建一个空的pdf,按需添加页面元素,支持文本、线、下拉框、多选框等
装填PDF模板并生成PDF的代码如下:
/**
* 根据模板装填并生成pdf文件
* @author zhangt
*/
public static File generatePdfFile2Local(String templatePath,
String templateName ,
String filePath ,
String fileName ,
Consumer<AcroFields> consumer) throws IOException, DocumentException {
//填充pdf
PdfReader reader = null;
PdfStamper stamper = null;
File generateFile = null;
try {
reader = new PdfReader(templatePath+"/"+templateName);
if(!new File(filePath).exists()){
new File(filePath).mkdirs();
}
generateFile = new File(filePath,fileName);
if(!generateFile.exists() || !generateFile.isFile()){
generateFile.createNewFile();
}
stamper = new PdfStamper(reader,new FileOutputStream(generateFile));
//取出模板中的属性字段
AcroFields fields = stamper.getAcroFields();
//填充数据
consumer.accept(fields);
stamper.setFormFlattening(false);
return generateFile;
} catch (IOException | DocumentException e) {
e.printStackTrace();
}finally {
if(stamper != null){
stamper.close();
}
if(reader != null){
reader.close();
}
}
return generateFile;
}
打开生成的PDF文件,发现里面的中文字段都不显示(或者点一下才能显示),看了itextpdf的源码,注释实在是太少了,研究了一会决定百度下。尝试了几个都不对,后来在一个博主的文章中找到了一行代码:
//中文字体
BaseFont baseFont = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1",BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
form.AddSubstitutionFont(baseFont);
果断尝试下,发现确实能显示中文了,只不过其他的数字都不显示了 。。。
之前试的时候其实遇到了这种情况,只需要设置一个属性就好了
stamper.setFormFlattening(false);
完整代码如下:
/**
* 根据模板装填并生成pdf文件
* @author zhangt
*/
public static File generatePdfFile2Local(String templatePath,
String templateName ,
String filePath ,
String fileName ,
Consumer<AcroFields> consumer) throws IOException, DocumentException {
//填充pdf
PdfReader reader = null;
PdfStamper stamper = null;
File generateFile = null;
//中文字体
BaseFont baseFont = BaseFont.createFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1",BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
try {
reader = new PdfReader(templatePath+"/"+templateName);
if(!new File(filePath).exists()){
new File(filePath).mkdirs();
}
generateFile = new File(filePath,fileName);
if(!generateFile.exists() || !generateFile.isFile()){
generateFile.createNewFile();
}
stamper = new PdfStamper(reader,new FileOutputStream(generateFile));
//取出模板中的属性字段
AcroFields fields = stamper.getAcroFields();
fields.addSubstitutionFont(baseFont);
//填充数据
consumer.accept(fields);
stamper.setFormFlattening(false);
return generateFile;
} catch (IOException | DocumentException e) {
e.printStackTrace();
}finally {
if(stamper != null){
stamper.close();
}
if(reader != null){
reader.close();
}
}
return generateFile;
}
遇到这种代码注释和相关文档都很少的包真的难受,还是要多多阅读源码,提升代码思想,也许遇到这种小问题思路就开阔多了 。