java动态生成pdf文件
前言
java开发过程中难免会遇到生成文件的需求,这里简单介绍一下关于pdf格式的文件的动态生成方法
一、生成pdf模板
既然要动态生成文件了,肯定要先设计模板,设置变量,如此才能进行下一步操作。
1.首先,你需要生成一个pdf文件,介绍一个在线工具(https://app.xunjiepdf.com/) 当然,你也可以用word直接另存,但是可能会达不到预期的效果
2.模板设计好之后就是进行设置变量了,在线工具和下载软件的方式都可以 介绍两种:
2.1 https://www.pdfescape.com/open/(简单试用就好,使用效果并不是很友好,可以设置的字体也很少)
2.2工具下载 Adobe Acrobat Pro DC(非常友好了,而且设置各种字体、大小) 还有其他的很多在线工具和软件就不介绍了。
二、使用步骤
1.使用jar包
自行下载,也可根据我最后提供的网址进行下载
iText-2.1.7.jar、itextasian-2.1.7.jar、itext-rtf-2.1.7.jar
或者通过maven引入
maven依赖:
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>cn.lesper</groupId>
<artifactId>iTextAsian</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext-rtf</artifactId>
<version>2.1.7</version>
</dependency>
2.pdf实现方法
代码如下(示例):
package com.example.random.testpackage.service;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
public class TestDemo {
public static void main(String[] args) throws Exception {
export();
System.out.println("生成完成");
}
public static void export(){
try {
// pdf模板所在路径,就是网站制作好后下载的pdf模板路径
String fileName = "E:\\download.pdf";
PdfReader reader = new PdfReader(fileName);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PdfStamper ps = new PdfStamper(reader, bos);
// 使用中文字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-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();
//生成pdf路径存放的路径
OutputStream fos = new FileOutputStream("D:/result.pdf");
fos.write(bos.toByteArray());
fos.flush();
fos.close();
bos.close();
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 填充模板中的数据
*/
public static void fillData(AcroFields fields, Map<String, String> data) {
try {
for (String key : data.keySet()) {
String value = data.get(key);
// 为字段赋值,注意字段名称是区分大小写的
fields.setField(key, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 填充数据源
* 其中data存放的key值与pdf模板中的文本域值相对应
*/
public static Map<String, String> data() {
Map<String, String> data = new HashMap<String, String>();
data.put("reqName", "申请人");
data.put("reqDept", "申请部门");
return data;
}
}
参考文章:https://www.cnblogs.com/pxblog/p/13261187.html
总结
以上便是动态生成pdf文件的方法啦,并不是很复杂,只是在设置字体上耽误了不少时间。
我的功能要比这个复杂一些,是将模板放置在项目中,然后通过浏览器的方式下载。也遇到不少问题:比如pdf模板编译后损坏、下载后显示空白但通过pdf工具可以查看等。所幸都解决了,有兴趣的小伙伴可以等待我的更新哟。