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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...