1. 制作PDF模板
目前制作PDF模板工具别无他物,唯有使用伟大的Adobe公司提供的Adobe Acrobat Pro DC软件进行制作。
下面是一个测试PDF的表单域:
字体的大小是在这里设置的
![](https://img-blog.csdnimg.cn/img_convert/99b6534866480228b07e1faf85863647.webp?x-oss-process=image/format,png)
2. 通过模板生成PDF文件
具体实现:
2.1 引入jar包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
2.2 具体代码如下:
package pdfdemo;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.AcroFields;import com.itextpdf.text.pdf.AcroFields.Item;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;
public classPDFUtils{/**
* @param fields
* @param data
* @throws IOException
* @throws DocumentException
*/
private staticvoidfillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
List<String> keys =newArrayList<String>();
Map<String, Item> formFields = fields.getFields();for(String key : data.keySet()){if(formFields.containsKey(key)){
String value = data.get(key);
fields.setField(key, value);// 为字段赋值,注意字段名称是区分大小写的
keys.add(key);}}
Iterator<String> itemsKey = formFields.keySet().iterator();while(itemsKey.hasNext()){
String itemKey = itemsKey.next();if(!keys.contains(itemKey)){
fields.setField(itemKey," ");}}}/**
* @param templatePdfPath 模板pdf路径
* @param generatePdfPath 生成pdf路径
* @param data 数据
*/
public static String generatePDF(String templatePdfPath, String generatePdfPath, Map<String, String> data){
OutputStream fos =null;
ByteArrayOutputStream bos =null;try{
PdfReader reader =newPdfReader(templatePdfPath);
bos =newByteArrayOutputStream();/* 将要生成的目标PDF文件名称 */
PdfStamper ps =newPdfStamper(reader, bos);/* 使用中文字体 */
BaseFont bf = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList =newArrayList<BaseFont>();
fontList.add(bf);/* 取出报表模板中的所有字段 */
AcroFields fields = ps.getAcroFields();
fields.setSubstitutionFonts(fontList);fillData(fields, data);/* 必须要调用这个,否则文档不会生成的 如果为false那么生成的PDF文件还能编辑,一定要设为true*/
ps.setFormFlattening(true);
ps.close();
fos =newFileOutputStream(generatePdfPath);
fos.write(bos.toByteArray());
fos.flush();return generatePdfPath;}catch(Exception e){
e.printStackTrace();}finally{if(fos !=null){try{
fos.close();}catch(IOException e){
e.printStackTrace();}}if(bos !=null){try{
bos.close();}catch(IOException e){
e.printStackTrace();}}}returnnull;}
public staticvoidmain(String[] args){
Map<String, String> data =newHashMap<String, String>();//key为pdf模板的form表单的名字,value为需要填充的值
data.put("title","河海市人民医院诊疗病历单");
data.put("case","123456789");
data.put("date","2020.11.02");
data.put("name","熊瞎子");
data.put("sex","男");
data.put("age","29");
data.put("phone","137888880000");
data.put("office","内科");
data.put("cert","身痒找打");
data.put("drug","1、奥美拉唑肠溶胶囊 0.25g10粒×2板 ");
data.put("dose","×2盒");
data.put("cons","用法用量:口服 一日两次 一次2粒");
data.put("tips","温馨提示");
data.put("desc","尽量呆在通风较好的地方,保持空气流通,有利于病情康复。尽量呆在通风较好的地方");generatePDF("D:\\tpl2.pdf","D:\\filled.pdf", data);}}
生成效果如下:
![](https://img-blog.csdnimg.cn/img_convert/c990e62d809d4e278e11a25ff9c995eb.webp?x-oss-process=image/format,png)
参考文章: