当前位置: 代码网 > it编程>编程语言>Java > Java实现WORD和PDF互相转换以及数据填充示例

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

2025年02月10日 Java 我要评论
最近碰到一个需求,就是有一些 word 或者 pdf 的模板,然后根据用户填入的数据填充进去,还要根据用户选择要 pdf 还是 word 下载下来所以综合下来就是两个功能:1.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互转及填充的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com