当前位置: 首页 > news >正文

详解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;}
}

在这里插入图片描述


http://www.mrgr.cn/news/67453.html

相关文章:

  • 【Android】时区规则库tzdata更新
  • 第五次作业
  • 【每日一题】LeetCode - 最接近的三数之和
  • pandas——对齐运算+函数应用
  • java.io.FileNotFoundException: Could not locate Hadoop executable: (详细解决方案)
  • Redis学习:BigKey、缓存双写一致性更新策略和案例
  • arm中内存读取延迟性能测试
  • [含文档+PPT+源码等]精品基于PHP实现的会员综合管理平台的设计与实现
  • java ssm 社团管理系统 高校社团信息平台 三个角色社长 源码 jsp
  • 对比Java和TypeScript中的服务注册和查找机制
  • 计算机体系结构之多级缓存、缓存miss及缓存hit(二)
  • 遥感数字图像处理
  • TLS(Transport Layer Security,传输层安全协议)
  • 【Node-Red】一款可以自定义的table节点
  • 英伟达HOVER——用于人形机器人的多功能全身控制器:整合不同的控制模式且实现彼此之间的无缝切换
  • 【2024最新版Kotlin教程】Kotlin第一行代码系列第五课-类继承,抽象类,接口
  • 解决 Spring Boot 线程泄漏问题
  • 数据治理:聊聊数据血缘!
  • linux之调度管理(1)-调度器的初始化
  • 第三百一十五节 Java线程教程 - Java线程休眠
  • 网站模版企业如何选择免费网站模板
  • Java 异常处理的最佳实践
  • 探索淘宝API:如何高效获取商品类目信息
  • Stream操作
  • [C++ 核心编程]笔记 4.4.2 类做友元
  • 030集——分组法——C# CAD二次开发