⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_38105536 「小七蒙恩」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

成果

使用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;
}
}

执行测试

文章目录
  1. 1. 成果
  2. 2. 使用word,制作一个模板
  3. 3. 使用pdf编辑器,生成pdf模板。
    1. 3.0.1. 1.从做好的word导入来创建pdf
    2. 3.0.2. 2.插入文字域
    3. 3.0.3. 3.插入选项域
    4. 3.0.4. 4.插入图片域,预插入签名和公章
    5. 3.0.5. 5.模板做好了,我们进行保存。
  • 4. java 实现
    1. 4.0.1. 引入依赖
    2. 4.0.2. 代码实现
  • 5. 执行测试