Java操作PDF:一键生成文件,插入文字、选项、签名及公章
使用word,制作一个模板
使用pdf编辑器,生成pdf模板。
我这里使用福昕pdf编辑器,其他pdf编辑器(如Adobe Acrobat)也可以用但是大多要钱。
1.从做好的word导入来创建pdf
2.插入文字域
右键文字域,填入字段与属性
3.插入选项域
导出值不要忘记填写,与代码对应上。
4.插入图片域,预插入签名和公章
注意:外观这里的边框和填充都选无色,否则图片会被填充色盖住;
注意:选项这里我们选择只显示标签。
5.模板做好了,我们进行保存。
java 实现
引入依赖
<!-- pdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.2</version>
</dependency>
<!--中文字体-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--html xml 转为pdf-->
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.11</version>
</dependency>
代码实现
package com.tencent.qcloud.roomservice.webrtc.utils;
import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
/**
* @author dume
* @ClassName PdfTest
* @description: pdf模板操作
* @date 2024年07月26日
* @version: 1.0
*/
public class PdfTest {
public static void main(String[] args) {
//测试执行
FillTemplate(
"C:\\test\\申请表.pdf",
"C:\\test\\新申请表.pdf",
"杜小七",
"辽宁大连",
"跑步",
"Yes",
"Yes",
"Yes",
"C:\\test\\电子签名.png",
"C:\\test\\公章.png"
);
}
/**
* 根据模板生成pdf
* @param sourcesPath 原文件路径
* @param targetPath 生成文件路径
* @param name 参数
* @param address 参数
* @param hobby 参数
* @param select_1 选项
* @param select_2 选项
* @param select_3 选项
* @param signPath 签名图片路径
* @param gongzhangPath 公章图片路径
*/
public static void FillTemplate(
String sourcesPath,
String targetPath,
String name,
String address,
String hobby,
String select_1,
String select_2,
String select_3,
String signPath,
String gongzhangPath
){
//设置参数
JSONObject jsonObject = new JSONObject();
jsonObject.put("name",name);
jsonObject.put("address",address);
jsonObject.put("hobby",hobby);
jsonObject.put("select_1",select_1);
jsonObject.put("select_2",select_2);
jsonObject.put("select_3",select_3);
// 填充创建pdf
PdfReader reader = null;
PdfStamper stamp = null;
ByteArrayOutputStream baos =null;
try {
reader = new PdfReader( sourcesPath);
File deskFile = new File(targetPath);
stamp = new PdfStamper(reader, new FileOutputStream(deskFile));
// 取出报表模板中的所有字段
AcroFields form = stamp.getAcroFields();
System.out.println(form.getFields().keySet());
//设置宋体
BaseFont song =BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
if (jsonObject != null) {
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
String key = entry.getKey();
String value = entry.getValue().toString();
//保存选项
if (key.startsWith("select")) {
form.setField(key, value, true);
//保存文字
}else {
form.setFieldProperty(key, "textfont", song, null);
form.setField(key, value);
}
}
}
//插入签名
insertImage(form,stamp,"sign",signPath);
//插入公章
insertImage(form,stamp,"gongzhang",gongzhangPath);
//保存修改
stamp.setFormFlattening(true);
}catch (Exception e){
e.printStackTrace();
}finally {
if (stamp != null) {
try{
stamp.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (reader != null) {
try{
reader.close();
}catch (Exception e){
e.printStackTrace();
}
}
if (baos != null) {
try{
baos.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
/**
* pdf模板插入图片
* @param form
* @param stamper
* @param filedName
* @param url
* @return
*/
public static boolean insertImage(AcroFields form, PdfStamper stamper, String filedName, String url) {
try {
int pageNo = form.getFieldPositions(filedName).get(0).page;
Rectangle signRect = form.getFieldPositions(filedName).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
Image image = Image.getInstance(url);
// 获取操作的页面
PdfContentByte under = stamper.getOverContent(pageNo);
// 根据域的大小缩放图片
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// 添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}catch (Exception e){
return false;
}
return true;
}
}
执行测试
作者:小七蒙恩
来源:https://blog.csdn.net/qq_38105536
详解Java操作PDF:一键生成文件,插入文字、选项、签名及公章