最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)WORD和PDF互相轉(zhuǎn)換以及數(shù)據(jù)填充示例

 更新時間:2025年02月09日 09:11:18   作者:子非衣  
本文介紹了如何使用Java實現(xiàn)WORD和PDF的互轉(zhuǎn)以及數(shù)據(jù)填充功能,通過導(dǎo)入Aspose庫并使用其工具類,可以輕松實現(xiàn)WORD和PDF模板的填充和轉(zhuǎn)換,需要的朋友可以參考下

最近碰到一個需求,就是有一些 WORD 或者 PDF 的模板,然后根據(jù)用戶填入的數(shù)據(jù)填充進去,還要根據(jù)用戶選擇要 PDF 還是 WORD 下載下來

所以綜合下來就是兩個功能:

  • 1.WORD 和 PDF 模板填充
  • 2.WORD 和 PDF 互相轉(zhuǎn)換

直接上代碼

首先是導(dǎo)入我們需要的 jar 包 (這里有點要注意,aspose其實是個收費包,下面的代碼我這里用的網(wǎng)上找的破解證書,當然不用證書也可以,只是有些功能用不了,但是我試了下發(fā)現(xiàn)除了多了個提示也沒什么問題,所以大家可以直接用)

		<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>

這里要注意可能會出現(xiàn)導(dǎo)入不了的情況,要是導(dǎo)入不了可以加入下面的地址試一下,或者直接去阿里的倉庫找一下下載下來導(dǎo)入,怎么導(dǎo)入大家自己百度一下很簡單 阿里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 模板并導(dǎo)出為 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);  // 使填充的內(nèi)容不可編輯
            stamper.close();

            // 復(fù)制并保存 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 轉(zhuǎn) Word (docx),支持多頁轉(zhuǎn)換
     */
    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 轉(zhuǎn) PDF,支持多頁轉(zhuǎn)換
     */
    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轉(zhuǎn)PDF測試.pdf";
        WordPdfUtils.convertWordToPdf(wordPath, pdfPath);


        String pdfPath1 = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF模板.pdf";
        String wordPath1 = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF轉(zhuǎn)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();
        }
    }
}

下面是我的模板和測試后生成的文件,所以上面的功能都是測試后正??捎玫?/p>

在這里插入圖片描述

這里主要說一下填充模板怎么制作

首先是 WORD填充模板

我們建一個 WORD 文檔,直接用 WPS 打開,找到 插入 - 書簽

在這里插入圖片描述

然后輸入屬性名稱如 name 即可

在這里插入圖片描述

接下來是 PDF填充模板,這個麻煩些,需要能編輯 PDF 的工具,WPS 編輯 PDF 要充會員,我比較窮肯定不會充會員(我要是有錢充會員我還寫這些代碼干啥),所以這里我找了一個破解版的 Adobe Acrobat DC (找不到的可以私聊找我要),一樣的我們建一個 PDF 文檔, 然后用 Adobe Acrobat DC 打開

我們找到 工具 - 準備表單 (WPS 好像也有類似的功能,但是要錢)

在這里插入圖片描述

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

在這里插入圖片描述

這樣模板就只做好了,我們執(zhí)行上面的測試方法,就可以得到下面的幾個文件

PDF填充測試

可以看到這個位置不對,大家自己在模板里面慢慢拖到正確位置就可以了

在這里插入圖片描述

PDF轉(zhuǎn)WORD測試

這里就是我說的證書問題,可以看到頭部有一行紅色的“Evaluation Only. Created with Aspose.Pdf. Copyright 2002-2017 Aspose Pty Ltd.”,大家手動刪除一下就可以,因為上面那個破解的證書里面只有 Aspose.Words for Java 所以 aspose-pdf 就用不了這個證書,誰要是找到了完整的證書希望可以給我一份

在這里插入圖片描述

WORD填充測試

這里不知道為啥內(nèi)容旁邊有個括號,還刪不掉

在這里插入圖片描述

WORD轉(zhuǎn)PDF測試

可以看到第二頁還有樣式這些都是保留下來的

在這里插入圖片描述

以上就是Java實現(xiàn)WORD和PDF互相轉(zhuǎn)換以及數(shù)據(jù)填充示例的詳細內(nèi)容,更多關(guān)于Java WORD和PDF互轉(zhuǎn)及填充的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • String StringBuilder StringBuffer區(qū)別以及源碼分析

    String StringBuilder StringBuffer區(qū)別以及源碼分析

    string是C++標準庫的一個重要的部分,主要用于字符串處理??梢允褂幂斎胼敵隽鞣绞街苯舆M行string操作,同時,C++的算法庫對string類也有著很好的支持,并且string類還和c語言的字符串之間有著良好的接口
    2021-06-06
  • mybatis中如何傳遞單個String類型的參數(shù)

    mybatis中如何傳遞單個String類型的參數(shù)

    這篇文章主要介紹了mybatis中如何傳遞單個String類型的參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入理解Java中包的定義與使用

    深入理解Java中包的定義與使用

    在開發(fā)過程中,會定義很多類,為了避免相同類名稱出現(xiàn)而發(fā)生覆蓋的情況,把所有java程序保存在各自的目錄里面,而該目錄就是包。包的本質(zhì)實際上就是一個文件夾。本文將給大家詳細的介紹,對大家的學習或工作具有一定的參考借鑒價值
    2021-09-09
  • springcloud項目改名的操作方法

    springcloud項目改名的操作方法

    這篇文章主要介紹了springcloud項目改名的操作方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法

    SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法

    這篇文章主要介紹了SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java并發(fā)編程之鎖、并發(fā)容器、阻塞隊列與異步編程實戰(zhàn)代碼

    Java并發(fā)編程之鎖、并發(fā)容器、阻塞隊列與異步編程實戰(zhàn)代碼

    這篇文章主要介紹了Java并發(fā)編程之鎖、并發(fā)容器、阻塞隊列與異步編程的相關(guān)資料,分別是ReentrantLock的靈活鎖機制、ConcurrentHashMap的高性能并發(fā)設(shè)計、BlockingQueue的生產(chǎn)者、消費者模式及CompletableFuture的異步編程能力,需要的朋友可以參考下
    2026-06-06
  • Java掩碼的幾種使用例舉

    Java掩碼的幾種使用例舉

    今天小編就為大家分享一篇關(guān)于Java掩碼的使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • springBoot集成shiro實現(xiàn)權(quán)限刷新

    springBoot集成shiro實現(xiàn)權(quán)限刷新

    在SpringBoot項目中集成Shiro進行權(quán)限管理,包括基礎(chǔ)配置引入依賴、創(chuàng)建Shiro配置類以及用戶認證與授權(quán)實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    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

最新評論

台安县| 天祝| 武义县| 中超| 米易县| 明水县| 潢川县| 乌兰浩特市| 绍兴市| 措美县| 白银市| 金华市| 岳普湖县| 平湖市| 巩义市| 河曲县| 公主岭市| 额尔古纳市| 高青县| 惠来县| 山阴县| 张家川| 神木县| 五原县| 中江县| 呼伦贝尔市| 禄劝| 广元市| 宝坻区| 台山市| 通河县| 中江县| 丁青县| 鸡泽县| 怀宁县| 武山县| 绥滨县| 安庆市| 邓州市| 黄骅市| 西华县|