1.使用工具编辑好PDF模板
本人使用的是(Adobe Acrobat DC),添加域,生成如下模板:
2.实现PDF导出
2.1导入itex相关包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
2.1导出PDF
// pdf模板
String fileName = "D:/表1进度付款申请单.pdf";
//读取pdf
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("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//取出报表模板中的所有字段
AcroFields fields = ps.getAcroFields();
fields.addSubstitutionFont(bf);
//对表单数据进行赋值
fields.setField("GCMC", "XXX工程市政工程");
fields.setField("BDMC", "XXX标段");
fields.setField("BH", "HT-0010");
fields.setField("XMJLJG", "XXX建设监理有限公司");
fields.setField("startData", "2021年09月16日");
fields.setField("endData", "2021年09月16日");
fields.setField("work", "2021年09月16日");
fields.setField("U_ALL_MONEY", "贰仟壹佰捌拾贰万贰仟壹佰肆拾圆伍角壹分");
fields.setField("L_ALL_MONEY", "21822140.51");
fields.setField("JDK", "21822140.51");
fields.setField("AQSGF", "21822140.51");
fields.setField("YFK", "21822140.51");
fields.setField("YKK", "0.51");
fields.setField("ZFK", "0");
fields.setField("Data", "2021年09月16日");
//必须要调用这个,否则文档不会生成的
ps.setFormFlattening(true);
ps.close();
OutputStream fos = new FileOutputStream("E:/new1.pdf");
fos.write(bos.toByteArray());
fos.flush();
fos.close();
bos.close();
3.导出结果
4.其他
以上模板只用到文本,如有需要插入图片,以下代码可供参考
String imgpath =“图片路径”;
int pageNo = fields.getFieldPositions(key).get(0).page;
Rectangle signRect = fields.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 读图片
Image image = Image.getInstance(imgpath);
// 获取操作的页面
PdfContentByte under = ps.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
示例
package util;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
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.Map;
public class PDFUtil {
public static void main(String[] args) throws Exception {
test();
System.out.println("success");
}
public static void test() throws IOException, DocumentException {
// pdf模板
String fileName = "D:/表1进度付款申请单.pdf";
//读取pdf
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("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//取出报表模板中的所有字段
AcroFields fields = ps.getAcroFields();
fields.addSubstitutionFont(bf);
//对表单数据进行赋值
//设置图片
String imgpath = "D:/aa.png";
int pageNo = fields.getFieldPositions("image").get(0).page;
Rectangle signRect = fields.getFieldPositions("image").get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
// 读图片
Image image = Image.getInstance(imgpath);
// 获取操作的页面
PdfContentByte under = ps.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
//添加文本
fields.setField("GCMC", "XXX工程市政工程");
fields.setField("BDMC", "XXX标段");
fields.setField("BH", "HT-0010");
fields.setField("XMJLJG", "XXX建设监理有限公司");
fields.setField("startData", "2021年09月16日");
fields.setField("endData", "2021年09月16日");
fields.setField("work", "2021年09月16日");
fields.setField("U_ALL_MONEY", "贰仟壹佰捌拾贰万贰仟壹佰肆拾圆伍角壹分");
fields.setField("L_ALL_MONEY", "21822140.51");
fields.setField("JDK", "21822140.51");
fields.setField("AQSGF", "21822140.51");
fields.setField("YFK", "21822140.51");
fields.setField("YKK", "0.51");
fields.setField("ZFK", "0");
fields.setField("Data", "2021年09月16日");
//必须要调用这个,否则文档不会生成的
ps.setFormFlattening(true);
ps.close();
OutputStream fos = new FileOutputStream("E:/new1.pdf");
fos.write(bos.toByteArray());
fos.flush();
fos.close();
bos.close();
}
}