下载工具并安装
Adobe Acrobat DC 2018 SP
下载完成之后对一个PDF表单进行参数设置
写代码
引入jar包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
com.itextpdf itextpdf 5.5.13.1
写工具类
package jp.utils;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class PDFUtils {
/**
* 根据模板填充pdf
*
* @param os 输出流
* @param template 模板 模板制作请参考: https://99designs.com/blog/design-tutorials/pdf-business-card-template-tutorial/
* @param params K:文本域名称 V:填充的值
*/
public static boolean fillTemplate(OutputStream os, byte[] template, Map<String, String> params) {// 利用模板生成pdf
boolean result = false;
PdfStamper stamper = null;
PdfReader reader = null;
try {
// 读入pdf表单
reader = new PdfReader(template);
// 根据表单生成一个新的pdf
stamper = new PdfStamper(reader, os);
// 获取pdf表单
AcroFields form = stamper.getAcroFields();
// 给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(bf);
// 遍历data 给pdf表单表格赋值
for (Iterator<Map.Entry<String, String>> it = params.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, String> entry = it.next();
form.setField(entry.getKey(), entry.getValue());
}
stamper.setFormFlattening(true);
result = true;
//-------------------------------------------------------------
System.out.println("===============PDF导出成功=============");
} catch (Exception e) {
System.out.println("===============PDF导出失败=============");
result = false;
e.printStackTrace();
} finally {
try {
stamper.close();
reader.close();
} catch (Exception e) {
result = false;
}
}
return result;
}
public static void main(String[] args) throws Exception {
try {
String outPath = "F:/test2.pdf";
String path = "F:/test_wrapper.pdf";
InputStream ins = new BufferedInputStream(new FileInputStream(path));
读取工程目录下的文件
//InputStream ins = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/smmTemplate.pdf");
FileOutputStream os = new FileOutputStream(outPath);
byte[] byt = new byte[ins.available()];
ins.read(byt);
Map<String, String> data = new HashMap<>();
data.put("username", "罗少");
data.put("sex", "36010");
fillTemplate(os, byt, data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是直接输入输出;
以下是可以直接在浏览器显示下载文件
OutputStream os = null;
InputStream ins = null;
try {
String filename = "授权委托书.pdf";
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gbk"), "iso8859-1"));
os = response.getOutputStream();
ins = new BufferedInputStream(new FileInputStream(openPath));
byte[] byt = new byte[ins.available()];
ins.read(byt);
fillTemplate(os, byt, params);
response.getOutputStream().flush();
response.getOutputStream().close();
os.close();
ins.close();
} catch (Exception e) {
try {
os.close();
ins.close();
} catch (Exception e2) {
}
} finally{
try {
os.close();
ins.close();
} catch (Exception e2) {
}
}