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

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

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

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

所以綜合下來就是兩個(gè)功能:

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

直接上代碼

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

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

這里要注意可能會(huì)出現(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>

在這里插入圖片描述

這里我封裝了一個(gè)工具類,里面帶測(cè)試方法的

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測(cè)試.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測(cè)試.docx";
        WordPdfUtils.convertPdfToWord(pdfPath1, wordPath1);

        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("name", "66666666666");

        // 測(cè)試 Word 填充
        String wordTemplatePath = "C:\\Users\\72364\\Desktop\\fsdownload\\WORD填充模板.docx";
        String outputWordPath = "C:\\Users\\72364\\Desktop\\fsdownload\\WORD填充測(cè)試.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();
        }

        // 測(cè)試 PDF 填充
        String pdfTemplatePath = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF填充模板.pdf";
        String outputPdfFilledPath = "C:\\Users\\72364\\Desktop\\fsdownload\\PDF填充測(cè)試.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();
        }
    }
}

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

在這里插入圖片描述

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

首先是 WORD填充模板

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

PDF填充測(cè)試

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

在這里插入圖片描述

PDF轉(zhuǎn)WORD測(cè)試

這里就是我說的證書問題,可以看到頭部有一行紅色的“Evaluation Only. Created with Aspose.Pdf. Copyright 2002-2017 Aspose Pty Ltd.”,大家手動(dòng)刪除一下就可以,因?yàn)樯厦婺莻€(gè)破解的證書里面只有 Aspose.Words for Java 所以 aspose-pdf 就用不了這個(gè)證書,誰要是找到了完整的證書希望可以給我一份

在這里插入圖片描述

WORD填充測(cè)試

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

在這里插入圖片描述

WORD轉(zhuǎn)PDF測(cè)試

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

在這里插入圖片描述

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

相關(guān)文章

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

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

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

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

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

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

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

    springcloud項(xiàng)目改名的操作方法

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

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

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

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

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

    Java掩碼的幾種使用例舉

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

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

    在SpringBoot項(xiàng)目中集成Shiro進(jìn)行權(quán)限管理,包括基礎(chǔ)配置引入依賴、創(chuàng)建Shiro配置類以及用戶認(rèn)證與授權(quán)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-11-11
  • Java9中對(duì)集合類擴(kuò)展的of方法解析

    Java9中對(duì)集合類擴(kuò)展的of方法解析

    這篇文章主要介紹了Java9 中對(duì)集合類擴(kuò)展的of方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Data JPA中findOne()和getOne()用法

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

    這篇文章主要介紹了Spring Data JPA中findOne()和getOne()的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論

弋阳县| 锡林浩特市| 黄大仙区| 公安县| 安龙县| 通山县| 七台河市| 日喀则市| 鄂托克旗| 丹棱县| 湘潭县| 屏东市| 厦门市| 洞头县| 日土县| 营山县| 丹棱县| 佛山市| 霞浦县| 铅山县| 新安县| 开封县| 乐清市| 中超| 九寨沟县| 蓝山县| 化德县| 久治县| 米泉市| 宜州市| 同江市| 嘉黎县| 黄龙县| 盐边县| 鸡西市| 龙陵县| 五原县| 肥城市| 衡南县| 什邡市| 平果县|