Java WORD和PDF互相转换以及数据填充示例

news/2025/2/11 5:00:31/

最近碰到一个需求,就是有一些 WORD 或者 PDF 的模板,然后根据用户填入的数据填充进去,还要根据用户选择要 PDF 还是 WORD 下载下来

所以综合下来就是两个功能:
1.WORD 和 PDF 模板填充
2.WORD 和 PDF 互相转换

直接上代码

首先是导入我们需要的 jar 包 (这里有点要注意,aspose其实是个收费包,下面的代码我这里用的网上找的破解证书,当然不用证书也可以,只是有些功能用不了,但是我试了下发现除了多了个提示也没什么问题,所以大家可以直接用)

		<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>16.8.0</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId><version>17.3.0</version></dependency>

这里要注意可能会出现导入不了的情况,要是导入不了可以加入下面的地址试一下,或者直接去阿里的仓库找一下下载下来导入,怎么导入大家自己百度一下很简单 阿里Maven仓库

	<repositories><repository><id>aspose-maven-repo</id><url>https://repository.aspose.com/repo/</url></repository></repositories>

在这里插入图片描述

这里我封装了一个工具类,里面带测试方法的

java">word">package com.yatai.common.tool;word">import com.aspose.words.*;
word">import com.itextpdf.text.DocumentException;
word">import com.itextpdf.text.pdf.*;word">import java.io.*;
word">import java.util.HashMap;
word">import java.util.Map;/*** @author Sakura* @date 2025/2/7 13:26*/
word">public word">class WordPdfUtils {/*** 加载 Aspose License*/word">private word">static word">boolean loadAsposeLicense() {word">try {// 凭证String licenseStr ="<License>\n" +"  <Data>\n" +"    <Products>\n" +"      <Product>Aspose.Total for Java</Product>\n" +"      <Product>Aspose.Words for Java</Product>\n" +"    </Products>\n" +"    <EditionType>Enterprise</EditionType>\n" +"    <SubscriptionExpiry>20991231</SubscriptionExpiry>\n" +"    <LicenseExpiry>20991231</LicenseExpiry>\n" +"    <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>\n" +"  </Data>\n" +"  <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>\n" +"</License>";InputStream license = word">new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));License asposeLic = word">new License();asposeLic.setLicense(license);word">return true;} word">catch (Exception e) {e.printStackTrace();word">return false;}}/*** 使用 Aspose 填充 Word 模板并导出为 Word*/word">public word">static word">boolean fillWordTemplate(String templatePath, String outputWordPath, Map<String, Object> dataMap) word">throws Exception {word">if (!loadAsposeLicense()) {word">return false;}// 加载 Word 模板Document document = word">new Document(word">new FileInputStream(templatePath));DocumentBuilder builder = word">new DocumentBuilder(document);// 填充 Word 文档的占位符word">for (String key : dataMap.keySet()) {word">if (builder.moveToBookmark(key)) {builder.write(String.valueOf(dataMap.get(key)));}}// 保存为 Word 文件document.save(outputWordPath, SaveFormat.DOCX);word">return true;}/*** 使用 iTextPDF 填充 PDF 模板*/word">public word">static word">boolean fillPdfTemplate(String templatePath, String outputPdfPath, Map<String, Object> dataMap, word">int pageCount) {PdfReader reader = word">null;PdfStamper stamper = word">null;ByteArrayOutputStream bos = word">null;com.itextpdf.text.Document doc = word">null;PdfCopy copy = word">null;word">try {// 加载 PDF 模板reader = word">new PdfReader(templatePath);bos = word">new ByteArrayOutputStream();stamper = word">new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();BaseFont baseFont = BaseFont.createFont("C:\\WINDOWS\\Fonts\\simsun.ttc,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(baseFont);// 填充 PDF 表单字段word">for (String key : dataMap.keySet()) {form.setField(key, String.valueOf(dataMap.get(key)));}stamper.setFormFlattening(true);  // 使填充的内容不可编辑stamper.close();// 复制并保存 PDFdoc = word">new com.itextpdf.text.Document();copy = word">new PdfCopy(doc, word">new FileOutputStream(outputPdfPath));doc.word">open();PdfReader finalReader = word">new PdfReader(bos.toByteArray());word">for (word">int i = 1; i <= pageCount; i++) {PdfImportedPage importPage = copy.getImportedPage(finalReader, i);copy.addPage(importPage);}finalReader.close();} word">catch (IOException | DocumentException e) {e.printStackTrace();word">return false;} word">finally {word">try {word">if (copy != word">null) copy.close();word">if (doc != word">null) doc.close();word">if (stamper != word">null) stamper.close();word">if (reader != word">null) reader.close();word">if (bos != word">null) bos.close();} word">catch (IOException | DocumentException e) {e.printStackTrace();}}word">return true;}/*** PDF 转 Word (docx),支持多页转换*/word">public word">static word">boolean convertPdfToWord(String pdfPath, String wordPath) {word">try {// 使用 Aspose PDF API 来加载 PDF 文件com.aspose.pdf.Document pdfDocument = word">new com.aspose.pdf.Document(pdfPath);// 保存为 Word 文件pdfDocument.save(wordPath, com.aspose.pdf.SaveFormat.DocX);word">return true;} word">catch (Exception e) {e.printStackTrace();word">return false;}}/*** Word 转 PDF,支持多页转换*/word">public word">static word">boolean convertWordToPdf(String wordPath, String pdfPath) {word">if (!loadAsposeLicense()) {word">return false;}word">try {Document wordDocument = word">new Document(wordPath);wordDocument.save(pdfPath, SaveFormat.PDF);word">return true;} word">catch (Exception e) {e.printStackTrace();word">return false;}}word">public word">static word">void main(String[] args) {String wordPath = "C:\\Users\\72364\\Desktop\\fsdownload\\WORD模板.docx";String pdfPath = "C:\\Users\\72364\\Desktop\\fsdownload\\WORD转PDF测试.pdf";WordPdfUtils.convertWordToPdf(wordPath, pdfPath);String pdfPath1 = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF模板.pdf";String wordPath1 = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF转WORD测试.docx";WordPdfUtils.convertPdfToWord(pdfPath1, wordPath1);Map<String, Object> dataMap = word">new HashMap<>();dataMap.put("name", "66666666666");// 测试 Word 填充String wordTemplatePath = "C:\\Users\\72364\\Desktop\\fsdownload\\WORD填充模板.docx";String outputWordPath = "C:\\Users\\72364\\Desktop\\fsdownload\\WORD填充测试.docx";word">try {word">boolean result = WordPdfUtils.fillWordTemplate(wordTemplatePath, outputWordPath, dataMap);word">if (result) {System.out.println("Word 模板填充成功!");} word">else {System.out.println("Word 模板填充失败!");}} word">catch (Exception e) {e.printStackTrace();}// 测试 PDF 填充String pdfTemplatePath = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF填充模板.pdf";String outputPdfFilledPath = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF填充测试.pdf";word">try {word">boolean result = WordPdfUtils.fillPdfTemplate(pdfTemplatePath, outputPdfFilledPath, dataMap, 1);word">if (result) {System.out.println("PDF 模板填充成功!");} word">else {System.out.println("PDF 模板填充失败!");}} word">catch (Exception e) {e.printStackTrace();}}
}

下面是我的模板和测试后生成的文件,所以上面的功能都是测试后正常可用的

在这里插入图片描述

这里主要说一下填充模板怎么制作
首先是 WORD填充模板
我们建一个 WORD 文档,直接用 WPS 打开,找到 插入 - 书签

在这里插入图片描述

然后输入属性名称如 name 即可

在这里插入图片描述
接下来是 PDF填充模板,这个麻烦些,需要能编辑 PDF 的工具,WPS 编辑 PDF 要充会员,我比较穷肯定不会充会员(我要是有钱充会员我还写这些代码干啥),所以这里我找了一个破解版的 Adobe Acrobat DC (找不到的可以私聊找我要),一样的我们建一个 PDF 文档, 然后用 Adobe Acrobat DC 打开

我们找到 工具 - 准备表单 (WPS 好像也有类似的功能,但是要钱)

在这里插入图片描述

然后选那个 添加“文本”域,把里面的文字改成name

在这里插入图片描述

这样模板就只做好了,我们执行上面的测试方法,就可以得到下面的几个文件

PDF填充测试
可以看到这个位置不对,大家自己在模板里面慢慢拖到正确位置就可以了

在这里插入图片描述

PDF转WORD测试
这里就是我说的证书问题,可以看到头部有一行红色的“Evaluation Only. Created with Aspose.Pdf. Copyright 2002-2017 Aspose Pty Ltd.”,大家手动删除一下就可以,因为上面那个破解的证书里面只有 Aspose.Words for Java 所以 aspose-pdf 就用不了这个证书,谁要是找到了完整的证书希望可以给我一份

在这里插入图片描述

WORD填充测试
这里不知道为啥内容旁边有个括号,还删不掉

在这里插入图片描述

WORD转PDF测试
可以看到第二页还有样式这些都是保留下来的

在这里插入图片描述


http://www.ppmy.cn/news/1571066.html

相关文章

采用DDNS-GO与cloudflare实现双域名同时访问NAS

这个标题其实解释的还不够清楚&#xff0c;本人是小白&#xff0c;但是买了群晖的NAS后自己瞎折腾了一下&#xff0c;遇到了如下的问题&#xff1a; 1、家里是移动宽带&#xff0c;没有公网IP&#xff0c;因此Ipv4无法使用&#xff0c;IPV6可以正常使用。 2、办公室场地采用的…

win10向windows server服务器传输文件

win10向windows server服务器传输文件 遇到无法直接拖动文件进行传输时 解决方案&#xff1a; 1.点击显示选项 2.点击本地资源-详细信息 3.在窗口中选择你需要共享的磁盘 4.然后远程连接到Windows server服务器 5.登录Windows server服务器后&#xff0c;在此电脑下就能看…

蓝桥杯准备 【入门3】循环结构

素数小算法&#xff08;埃氏筛&&欧拉筛&#xff09; 以下四段代码都是求20以内的所有素数 1.0版求素数 #include<iostream> using namespace std;int main() {int n 20;for(int i2;i<n;i){int j0;for(j2;j<i;j)//遍历i{if(i%j0){break;}}if(ij){cout&l…

k8s dial tcp 127.0.0.1:6443: connect: connection refused排查流程及解决思路

前言 k8s 集群中&#xff0c;使用 kubelet 报错&#xff0c;如下&#xff1a; The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port? 排查思路 1. 检查环境是否正常 1.1 确认是否在 Master 节点排查 确保当前操作的机器是 Kub…

【从0开始】使用Flax NNX API 构建简单神经网络并训练

与 Linen API 不同&#xff0c;NNX 使用起来对初学者更加简单&#xff0c;跟 PyTorch 的体验更加接近。 任务 使用MLP拟合简单函数&#xff1a; y 2 x 2 1 y2x^21 y2x21 代码 import jax.numpy as jnp import jax.random as jrm import optax as ox from jax import Arra…

Java面试题-计算机网络

文章目录 1.介绍一下TCP/IP五层模型&#xff1f;2.**什么是TCP三次握手、四次挥手&#xff1f;**1.三次握手建立连接2.四次握手断开连接 **3.HTTPS和HTTP的区别是什么&#xff1f;**4.**浏览器输入www.taobao.com回车之后发生了什么**&#xff1f;1.URL解析&#xff0c;对URL进…

Windows系统中常用的命令

随着Windows系统的不断改进&#xff0c;维护系统时有时候会因为新系统的更新而找不到对应的模块或者相关的信息入口&#xff0c;这个时候&#xff0c;记住一些命令就可以起到很好的帮助作用。 比如&#xff0c;windows11中的网络属性的修改&#xff0c;可能习惯了windows10或者…

一个00后的自述:不好好学习的我后悔了

普通人家的孩子不读书&#xff0c;以后你能做什么&#xff1f; 以下是一个00后的自述&#xff1a; 我是2000年出生的&#xff0c;父亲是建筑工人&#xff0c;母亲是农民&#xff0c;我就是一个普通人家的孩子。 小时候&#xff0c;其实我的学习成绩也是不错的&#xff0c;但…