详解Java操作PDF:一键生成文件,插入文字、选项、签名及公章
详解Java操作PDF:一键生成文件,插入文字、选项、签名及公章
- 使用pdf编辑器,生成pdf模板
- 从做好的word导入来创建pdf
- 插入文字域
- 插入选项域
- 插入图片域,预插入签名和公章
- 模板做好了,我们进行保存。
- java 实现
- 引入依赖
- 代码实现
使用pdf编辑器,生成pdf模板
我这里使用福昕pdf编辑器,其他pdf编辑器(如Adobe Acrobat)也可以用但是大多要钱。
从做好的word导入来创建pdf
插入文字域
右键文字域,填入字段与属性
插入选项域
导出值不要忘记填写,与代码对应上。
插入图片域,预插入签名和公章
注意:外观这里的边框和填充都选无色,否则图片会被填充色盖住;
注意:选项这里我们选择只显示标签。
模板做好了,我们进行保存。
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);// 填充创建pdfPdfReader 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;}
}