最近,项目中需要根据流程表单信息生成PDF文件,上传到公司的文档系统保存,并外发连接到工厂兄弟下载,在此,对生成pdf环节做如下总结.
1.为保证生成的PDF文件的规范性,需制作相应的PDF模板,这里需要用到一个制作PDF模板的工具:adobe acrobat(破解版下载链接:链接:https://pan.baidu.com/s/1Cz4rN2yZAF4k5WDdSCctzw 密码:ywlb;脱机安装版:http://userlibrary.lofter.com/post/1cb113e9_6a80ce5).该工具使用方法可自行百度,或者到官网查看文档.
2.第1步完成之后,就需要读取模板信息,并往里面填充对应数据,生成一个新的PDF文件了,具体实现代码如下:
<!-- 所需jar包 -->
<!-- itext pdf begin -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.6</version>
</dependency>
<!-- itextpdf的亚洲字体支持 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!-- itext pdf end -->
package com.hill.util.pdfcreate;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
// 简单demo
public class PdfUtil {
public static void main(String[] args) throws Exception {
// 模板文件路径
String modelPath = "E:cdTestModel.pdf";
// 生成的文件路径
String resultFielPath = "E:test.pdf";
// 书签名[域名]
String fieldName = "fill_3";
// 图片路径
String imagePath = "E:\\6d2bc967-3ae6-4eeb-96de-618f5a1bef60";
// 读取模板文件
InputStream input = new FileInputStream(new File(modelPath));
PdfReader reader = new PdfReader(input);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(resultFielPath));
// 提取pdf中的表单
AcroFields form = stamper.getAcroFields();
// 此种方式写入文本数据
// k为模板域名称,v为数据,每个域对应一个k,根据k传输数据.
form.setField("k", "v");
/**
* 各种form.setField().................
*
* */
// 字体设置
form.addSubstitutionFont(BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));
// 此种方式写入图片数据.
// 通过域名获取所在页和坐标,左下角为起点
int pageNo = form.getFieldPositions(fieldName).get(0).page;
Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 读取图片
Image image = Image.getInstance(imagePath);
// 获取操作的页面
PdfContentByte under = stamper.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
stamper.close();
reader.close();
}
}
项目中效果如下:前图为网页流程信息截图,后图为生成PDF文件截图