- 项目中加入Maven依赖:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
- 创建PDFUtil工具类(可根据需要自行修改),如下:
参数:
参数名 | 参数描述 |
---|---|
fileName | PDF模板名称 |
fontName | 字体 |
data | 数据(用于替换PDF模板中的变量) |
返回值:ByteArrayOutputStream
public class PdfUtil {
public static ByteArrayOutputStream generatePdfStream(String fileName, String fontName, Map<String, String> data) throws Exception{
PdfReader reader = new PdfReader(fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
/* 将要生成的目标PDF文件名称 */
PdfStamper ps = new PdfStamper(reader, bos);
PdfContentByte under = ps.getUnderContent(1);
/* 使用中文字体 */
BaseFont bf = BaseFont.createFont(fontName, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
/* 取出报表模板中的所有字段 */
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);
fillData(fields, data);
/* 必须要调用这个,否则文档不会生成的 */
ps.setFormFlattening(true);
ps.close();
return bos;
}
public static void fillData(AcroFields fields, Map<String, String> data)
throws IOException, DocumentException {
for (String key : data.keySet()) {
String value = data.get(key);
fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写
}
}
}
这种方法适用于PDF模板中的变量不多的情况,如果变量过多使用也不是很方便(编辑PDF模板推荐使用Adobe Acrobat Pro软件)。
网友评论