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

 更新时间:2025年02月09日 09:11:18   作者:子非衣  
本文介绍了如何使用Java实现WORD和PDF的互转以及数据填充功能,通过导入Aspose库并使用其工具类,可以轻松实现WORD和PDF模板的填充和转换,需要的朋友可以参考下

最近碰到一个需求,就是有一些 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>

在这里插入图片描述

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

package com.yatai.common.tool;

import com.aspose.words.*;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Sakura
 * @date 2025/2/7 13:26
 */
public class WordPdfUtils {

    /**
     * 加载 Aspose License
     */
    private static boolean loadAsposeLicense() {
        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 = new ByteArrayInputStream(licenseStr.getBytes("UTF-8"));
            License asposeLic = new License();
            asposeLic.setLicense(license);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 使用 Aspose 填充 Word 模板并导出为 Word
     */
    public static boolean fillWordTemplate(String templatePath, String outputWordPath, Map<String, Object> dataMap) throws Exception {
        if (!loadAsposeLicense()) {
            return false;
        }

        // 加载 Word 模板
        Document document = new Document(new FileInputStream(templatePath));
        DocumentBuilder builder = new DocumentBuilder(document);

        // 填充 Word 文档的占位符
        for (String key : dataMap.keySet()) {
            if (builder.moveToBookmark(key)) {
                builder.write(String.valueOf(dataMap.get(key)));
            }
        }

        // 保存为 Word 文件
        document.save(outputWordPath, SaveFormat.DOCX);
        return true;
    }

    /**
     * 使用 iTextPDF 填充 PDF 模板
     */
    public static boolean fillPdfTemplate(String templatePath, String outputPdfPath, Map<String, Object> dataMap, int pageCount) {
        PdfReader reader = null;
        PdfStamper stamper = null;
        ByteArrayOutputStream bos = null;
        com.itextpdf.text.Document doc = null;
        PdfCopy copy = null;

        try {
            // 加载 PDF 模板
            reader = new PdfReader(templatePath);
            bos = new ByteArrayOutputStream();
            stamper = 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 表单字段
            for (String key : dataMap.keySet()) {
                form.setField(key, String.valueOf(dataMap.get(key)));
            }

            stamper.setFormFlattening(true);  // 使填充的内容不可编辑
            stamper.close();

            // 复制并保存 PDF
            doc = new com.itextpdf.text.Document();
            copy = new PdfCopy(doc, new FileOutputStream(outputPdfPath));
            doc.open();
            PdfReader finalReader = new PdfReader(bos.toByteArray());

            for (int i = 1; i <= pageCount; i++) {
                PdfImportedPage importPage = copy.getImportedPage(finalReader, i);
                copy.addPage(importPage);
            }

            finalReader.close();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                if (copy != null) copy.close();
                if (doc != null) doc.close();
                if (stamper != null) stamper.close();
                if (reader != null) reader.close();
                if (bos != null) bos.close();
            } catch (IOException | DocumentException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

    /**
     * PDF 转 Word (docx),支持多页转换
     */
    public static boolean convertPdfToWord(String pdfPath, String wordPath) {
        try {
            // 使用 Aspose PDF API 来加载 PDF 文件
            com.aspose.pdf.Document pdfDocument = new com.aspose.pdf.Document(pdfPath);
            // 保存为 Word 文件
            pdfDocument.save(wordPath, com.aspose.pdf.SaveFormat.DocX);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * Word 转 PDF,支持多页转换
     */
    public static boolean convertWordToPdf(String wordPath, String pdfPath) {
        if (!loadAsposeLicense()) {
            return false;
        }
        try {
            Document wordDocument = new Document(wordPath);
            wordDocument.save(pdfPath, SaveFormat.PDF);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static 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 = 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";

        try {
            boolean result = WordPdfUtils.fillWordTemplate(wordTemplatePath, outputWordPath, dataMap);
            if (result) {
                System.out.println("Word 模板填充成功!");
            } else {
                System.out.println("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";

        try {
            boolean result = WordPdfUtils.fillPdfTemplate(pdfTemplatePath, outputPdfFilledPath, dataMap, 1);
            if (result) {
                System.out.println("PDF 模板填充成功!");
            } else {
                System.out.println("PDF 模板填充失败!");
            }
        } 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测试

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

在这里插入图片描述

以上就是Java实现WORD和PDF互相转换以及数据填充示例的详细内容,更多关于Java WORD和PDF互转及填充的资料请关注脚本之家其它相关文章!

相关文章

  • String StringBuilder StringBuffer区别以及源码分析

    String StringBuilder StringBuffer区别以及源码分析

    string是C++标准库的一个重要的部分,主要用于字符串处理。可以使用输入输出流方式直接进行string操作,同时,C++的算法库对string类也有着很好的支持,并且string类还和c语言的字符串之间有着良好的接口
    2021-06-06
  • mybatis中如何传递单个String类型的参数

    mybatis中如何传递单个String类型的参数

    这篇文章主要介绍了mybatis中如何传递单个String类型的参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 深入理解Java中包的定义与使用

    深入理解Java中包的定义与使用

    在开发过程中,会定义很多类,为了避免相同类名称出现而发生覆盖的情况,把所有java程序保存在各自的目录里面,而该目录就是包。包的本质实际上就是一个文件夹。本文将给大家详细的介绍,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • springcloud项目改名的操作方法

    springcloud项目改名的操作方法

    这篇文章主要介绍了springcloud项目改名的操作方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot中使用Jsoup爬取网站数据的方法

    SpringBoot中使用Jsoup爬取网站数据的方法

    这篇文章主要介绍了SpringBoot中使用Jsoup爬取网站数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java并发编程之锁、并发容器、阻塞队列与异步编程实战代码

    Java并发编程之锁、并发容器、阻塞队列与异步编程实战代码

    这篇文章主要介绍了Java并发编程之锁、并发容器、阻塞队列与异步编程的相关资料,分别是ReentrantLock的灵活锁机制、ConcurrentHashMap的高性能并发设计、BlockingQueue的生产者、消费者模式及CompletableFuture的异步编程能力,需要的朋友可以参考下
    2026-06-06
  • Java掩码的几种使用例举

    Java掩码的几种使用例举

    今天小编就为大家分享一篇关于Java掩码的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • springBoot集成shiro实现权限刷新

    springBoot集成shiro实现权限刷新

    在SpringBoot项目中集成Shiro进行权限管理,包括基础配置引入依赖、创建Shiro配置类以及用户认证与授权实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-11-11
  • Java9中对集合类扩展的of方法解析

    Java9中对集合类扩展的of方法解析

    这篇文章主要介绍了Java9 中对集合类扩展的of方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring Data JPA中findOne()和getOne()用法

    Spring Data JPA中findOne()和getOne()用法

    这篇文章主要介绍了Spring Data JPA中findOne()和getOne()的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11

最新评论