Word書簽替換,加蓋電子印章及轉換PDF(Java實用版)

来源:https://www.cnblogs.com/aerfazhe/archive/2022/07/15/16481306.html
-Advertisement-
Play Games

一、前言 在項目中有需要對word進行操作的,可以看看哈,本次使用比較強大的spire組件來對word進行操作,免費版支持三頁哦,對於不止三頁的word文件,可以購買收費版,官網:https://www.e-iceblue.cn/tutorials.html#,也可使用其他組件實現,如poi、doc ...


一、前言

在項目中有需要對word進行操作的,可以看看哈,本次使用比較強大的spire組件來對word進行操作,免費版支持三頁哦,對於不止三頁的word文件,可以購買收費版,官網:https://www.e-iceblue.cn/tutorials.html#,也可使用其他組件實現,如poi、docx4j等,我將代碼整理成工具類了,大家可以拿下來直接使用哈,一起努力吧。

二、Spire的使用

1、引入pom.xml

<!-- 免費版 .free  只支持前三頁轉化 -->
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.office.free</artifactId>
    <version>5.3.1</version>
</dependency>

2、AddStampUtils

工具類
/**
 * @Author:wk
 * @Slogan:無論風雨,和自己一決勝負吧
 * @Create:2022/7/15/9:30
 * @Description:TODO Word文件操作工具類
 * @Version:1.0
 */
@Slf4j
public class AddStampUtils {

//    轉換目標文件地址
//    public static String WORD_OLD_URL = "src/main/resources/word/20200429宋體伺服器同步版.doc";

//    轉換後文件存放地址
//    public static String WORD_NEW_URL = "src/main/resources/word/20200429宋體伺服器同步版2.doc";

//    WORD轉PDF存放位置
//    public static String PDF_NEW_URL = "src/main/resources/pdf/20200429宋體伺服器同步版2.pdf";

//    電子印章圖片地址
//    public static String STAMP_IMG_URL = "src/main/resources/word/stamp.png";

    /**
     * 1、自定義位置添加電子印章
     * 2、替換書簽名位置文本內容 bookmarkName傳參為null,則不進行書簽替換操作
     * @param wordOldUrl word文件路徑
     * @param wordNewUrl 新word文件路徑
     * @param stampImgUrl 電子印章圖片路徑
     * @param horizontal 電子印章水平位置 (當前文件推薦260f)
     * @param vertical 電子印章垂直位置 (當前推薦455f)
     * @param stampWidth 電子印章寬度(推薦120)
     * @param stampHeight 電子印章高度(推薦120)
     * @param bookmarkName 書簽名,通過名稱尋找書簽文本所在位置
     * @param newBookmarkText 替換的文本新內容
     */
    public void addStamp(
        String wordOldUrl,String wordNewUrl,String stampImgUrl,
        Float horizontal,Float vertical,Float stampWidth,
        Float stampHeight,String bookmarkName,String newBookmarkText
    ) {
        //        載入文檔
        Document document = new Document();
        document.loadFromFile(wordOldUrl);

//        獲取指定段落
        Section section = document.getSections().get(0);
//        獲取段落總數
        int count = section.getParagraphs().getCount();
        log.info("獲取文檔內容段落總數{}",count);
        Paragraph paragraph = section.getParagraphs().get(0);

        //        判斷是否需要替換書簽位置文本內容
        if (StringUtils.isNotEmpty(bookmarkName)) {
            replaceBookmarkContent(document,bookmarkName,newBookmarkText);
        }

//        添加電子印章
        DocPicture docPicture = paragraph.appendPicture(stampImgUrl);

//        指定電子章位置
//        水平位置
        docPicture.setHorizontalPosition(horizontal);
//        垂直位置
        docPicture.setVerticalPosition(vertical);

//        設置電子章大小
        docPicture.setWidth(stampWidth);
        docPicture.setHeight(stampHeight);

//        設置圖片位於文字頂層
        docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);

        //        保存添加電子章的Word文檔
        document.saveToFile(wordNewUrl);
        document.dispose();
        log.info("文檔添加電子印章結束,新WORD文檔地址:{}",wordNewUrl);

    }

    /**
     * 1、根據關鍵詞位置添加電子印章
     * 2、替換書簽名位置文本內容 bookmarkName傳參為null,則不進行書簽替換操作
     * @param wordOldUrl word文件路徑
     * @param wordNewUrl 新word文件路徑
     * @param stampImgUrl 電子印章圖片路徑
     * @param keyWord 關鍵字 (自定義)
     * @param keyWordIndex 關鍵字索引 (-1)
     * @param horizontal 電子印章水平位置 (260f)
     * @param vertical 電子印章垂直位置 (-55f)
     * @param stampWidth 電子印章寬度 (推薦120)
     * @param stampHeight 電子印章高度(推薦120)
     * @param bookmarkName 書簽名,通過名稱尋找書簽文本所在位置
     * @param newBookmarkText 替換的文本新內容
     */
    public void addKeyWordStamp(
            String wordOldUrl,String wordNewUrl,String stampImgUrl,
            String keyWord,Integer keyWordIndex,Float horizontal,
            Float vertical,Float stampWidth,Float stampHeight,
            String bookmarkName,String newBookmarkText
    ) {
        //        載入文檔
        Document document = new Document();
        document.loadFromFile(wordOldUrl);

//        判斷是否需要替換書簽位置文本內容
        if (StringUtils.isNotEmpty(bookmarkName)) {
            replaceBookmarkContent(document,bookmarkName,newBookmarkText);
        }

//        獲取關鍵字位置
        TextSelection[] textSelections = document.findAllString(keyWord, false, false);
        if (ObjectUtils.isNotEmpty(textSelections)) {
            Paragraph paragraph = textSelections[keyWordIndex > -1 ? 0 : textSelections.length - 1].getAsOneRange().getOwnerParagraph();
            //        添加電子印章
            DocPicture docPicture = paragraph.appendPicture(stampImgUrl);
            //        設置圖片位於文字頂層
            docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text);
            //        指定電子章位置
            //        水平位置
            docPicture.setHorizontalPosition(horizontal);
            //        垂直位置
            docPicture.setVerticalPosition(vertical);
            //        設置電子章大小
            docPicture.setWidth(stampWidth);
            docPicture.setHeight(stampHeight);
        }

//        保存添加電子章的Word文檔
        document.saveToFile(wordNewUrl);
        document.dispose();
        log.info("文檔添加電子印章結束,新WORD文檔地址:{}",wordNewUrl);
    }

    /**
     * 替換書簽名位置文本內容
     * @param document word文檔對象
     * @param bookmarkName 書簽名
     * @param newBookmarkText 新文本內容
     */
    public void replaceBookmarkContent(Document document,String bookmarkName,String newBookmarkText) {
        //定位到指定書簽位置
        BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
        bookmarksNavigator.moveToBookmark(bookmarkName);
        //用文本內容替換原有書簽位置的文本,新替換的內容與原文格式一致
        bookmarksNavigator.replaceBookmarkContent(newBookmarkText,true);
    }
    
    /**
     * 替換書簽名位置文本內容為圖片
     * @param document word文檔對象
     * @param bookmarkName 書簽名
     * @param newImgUrl 圖片地址
     */
    public void replaceBookmarkContentToImg(Document document,String bookmarkName,String newImgUrl) {
        //定位到指定書簽位置
        BookmarksNavigator bookmarksNavigator = new BookmarksNavigator(document);
        bookmarksNavigator.moveToBookmark(bookmarkName);
        //添加圖片,替換原有書簽內容
        Paragraph para= new Paragraph(document);
        para.appendPicture(newImgUrl);
        TextBodyPart bodyPart = new TextBodyPart(document);
        bodyPart.getBodyItems().add(para);
        bookmarksNavigator.replaceBookmarkContent(bodyPart);
    }
    
    /**
     * 替換書簽名位置文本內容為表格
     * @param document word文檔對象
     * @param bookmarkName 書簽名
     */
    public void replaceBookmarkContentToTable(Document document,String bookmarkName) {
        //聲明數組內容
        String[][] data =
        {
                new String[]{"分類", "等級", "編號"},
                new String[]{"A", "一級", "01A"},
                new String[]{"B", "二級", "02B"},
                new String[]{"C", "三級", "03C"},
        };

        //創建表格
        Table table = new Table(document, true);
        table.resetCells(4, 3);
        for (int i = 0; i < data.length; i++) {
            TableRow dataRow = table.getRows().get(i);
            for (int j = 0; j < data[i].length; j++) {
                TextRange range = dataRow.getCells().get(j).addParagraph().appendText(data[i][j]);
                range.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
                range.getCharacterFormat().setFontName("楷體");
                dataRow.getRowFormat().setHorizontalAlignment(RowAlignment.Center);
                dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
            }
        }

        //創建TextBodyPart對象
        TextBodyPart bodyPart= new TextBodyPart(document);
        bodyPart.getBodyItems().add(table);

        //定位到指定書簽位置
        BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document);
        bookmarkNavigator.moveToBookmark(bookmarkName);

        //使用表格替換原書簽的內容
        bookmarkNavigator.replaceBookmarkContent(bodyPart);
    }

    /**
     * word轉PDF
     * @param wordNewUrl word文件路徑
     * @param pdfNewUrl  存儲新PDF文件路徑
     */
    public void wordToPdf(String wordNewUrl, String pdfNewUrl) {
//        將新Word文檔轉換為PDF文件
        Document document = new Document();
        document.loadFromFile(wordNewUrl);
        document.saveToFile(pdfNewUrl, FileFormat.PDF);
        document.dispose();
        log.info("文檔轉換結束,新PDF文檔地址:{}",pdfNewUrl);
    }
}

3、測試

Main主函數測試
 public static void main(String[] args) {
    //       目標文件地址
    String wordOldUrl = "src/main/resources/word/20200429宋體伺服器同步版.doc";
    //       添加電子印章後文件存放地址
    String wordNewUrl = "src/main/resources/word/20200429宋體伺服器同步版2.doc";
    //       WORD轉PDF存放位置
    String pdfNewUrl = "src/main/resources/pdf/20200429宋體伺服器同步版2.pdf";
    //        電子印章圖片地址
    String stampImgUrl = "src/main/resources/word/stamp.png";
    //        word文檔內容關鍵字
    String keyWord = "蓋章";
    //        索引,預設就填-1即可
    Integer keyWordIndex = -1;
    //        電子印章水平位置
    float horizontal = 260f;
    //        電子印章垂直位置
    float vertical = -55f;
    //        電子印章寬度
    float stampWidth = 120;
    //        電子印章高度
    float stampHeight = 120;
    //        書簽名
    String bookmarkName = "ZWSTTCJKBH";
    //        書簽位置文本替換新內容
    String newBookmarkText = "公開";
    AddStampUtils addStampUtils = new AddStampUtils();
    //        獲取關鍵字位置並加蓋印章並替換書簽名位置文本內容
    addStampUtils.addKeyWordStamp(wordOldUrl,wordNewUrl,stampImgUrl,keyWord,keyWordIndex,horizontal,vertical,stampWidth,stampHeight,bookmarkName,newBookmarkText);
    //        將新word轉化為pdf文件
    addStampUtils.wordToPdf(wordNewUrl,pdfNewUrl);
}

4、效果展示

Before

舊書簽位置內容

文檔蓋章地方:

After

5、註意事項

將word轉化為PDF時,打開pdf,發現頂部多了一條橫線,如下:

這條橫線的由來:傳說這條橫線是由於word文件的頁眉導致的,經過我的證實,發現將滑鼠移動至頁面頂端,並且雙擊進入了頁眉編輯狀態,退出時有時就會在留下一根頁眉橫線(即使啥都不輸入),由此得出傳說也可信。哈哈哈,心情愉悅一下

處理方法:

第一種方法:首先將點擊頁眉,進入頁眉編輯狀態,並將游標置於頁眉處。然後單擊“開始”,找到“樣式”裡面的“正文”樣式,輕鬆刪除。

 

第二種方法(推薦):將游標置於頁眉處,同時按住鍵盤上的:Ctrl+Shift+N,頁眉橫線立即消失,再按ESC鍵退出頁眉編輯即可。

 

無論風雨,和自己一決勝負吧
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我快速入門python看過的一些資料 B站的視頻 10天自學Python,輕鬆掌握Python基礎【千鋒】 廖雪峰 - Python教程 https://www.liaoxuefeng.com/wiki/1016959663602400 C語言網 - Python教程 https://www.dot ...
  • 捕獲和拋出異常 異常處理的五大關鍵字:try,catch,finally,throw,throws 1.捕獲異常 用法: ​ try{可能會出現異常的代碼 ​ } catch(Exception e)//catch後面跟想要捕獲的異常類型 ​ {異常的處理邏輯} idea快捷鍵:ctrl+alt+t ...
  • JavaWeb 的概念 什麼是 JavaWeb? JavaWeb 是指,所有通過 Java 語言編寫可以通過瀏覽器訪問的程式的總稱,叫 JavaWeb。 JavaWeb 是基於請求和響應來開發的。 什麼是請求? 請求是指客戶端給伺服器發送數據,叫請求 Request。 什麼是響應? 響應是指伺服器給 ...
  • 前言 嗨嘍~大家好呀,這裡是魔王吶 現在,很多人不是在找工作的途中就是在找工作的路上(我的廢話文學😂) 所以我今天來採集一下招聘網站,讓我們來看看找工作主要要學會什麼? 環境使用: Python 3.8 Pycharm > 漢化插件 translation 模塊使用: requests >>> p ...
  • 控制流程 與任何程式設計語言一樣,Java使用條件語句和迴圈結構確定控制流程。 塊作用域 我們首先要瞭解塊(block)的概念。 塊是指由若幹條Java語句組成的語句,並用一對大括弧括起來。塊確定了變數的作用域。一個塊可以嵌套在另一個快中。下麵就是嵌套在main方法塊中的一個塊。 public st ...
  • 1.String是基本數據類型麽?不是基本數據類型,byte int char long flout duable boolem short 2.int 和integer區別int是基本數據類型,integer 是一個包裝類 3..JAVA中幾種集合(List、Set和Map)的區別?list 和s ...
  • 目錄導航 分支控制 - if.....else 單分支 if 雙分支 if....else 多分支 if....else if.....else switch - 分支控制 switch (表達式){case 常量1: 語句1; breack:} -- 語法 breack 退出當語句,如果沒有bra ...
  • likeshop單商戶開源商城系統,公眾號商城、H5商城、微信小程式商城、抖音小程式商城、位元組小程式商城、頭條小程式商城、安卓APP商城、蘋果APP商城代碼全開源,免費商用。 適用場景 系統適用於B2C,單商戶,自營商城場景。完美契合私域流量變現閉環交易使用。 系統亮點 LikeShop在電商通用組 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...