使用Java實(shí)現(xiàn)Word文檔水印自動化功能
在企業(yè)信息化辦公中,文檔的安全與版權(quán)保護(hù)至關(guān)重要。無論是內(nèi)部流轉(zhuǎn)的“機(jī)密”文件,還是對外發(fā)布的“初稿”樣本,水印(Watermark) 都是最直觀、成本最低的防護(hù)手段。
對于 Java 開發(fā)者而言,操作 Word 文檔(.doc / .docx)往往是一件頭疼的事。雖然 Apache POI 提供了底層支持,但其復(fù)雜的 API 常常讓簡單的格式調(diào)整變得異常艱難。今天,我們將探討如何利用 Spire.Doc for Java 庫,通過寥寥數(shù)行代碼,實(shí)現(xiàn)專業(yè)級的水印添加功能。
一、 為什么選擇 Spire.Doc for Java?
在 Java 生態(tài)中,處理 Word 的工具不少,但 Spire.Doc 脫穎而出主要基于以下幾點(diǎn):
- 獨(dú)立性:無需在服務(wù)器上安裝 Microsoft Word。
- 高保真度:轉(zhuǎn)換 PDF 或打印時,水印位置不偏移。
- API 直觀:將復(fù)雜的水印對象(VML 形狀)封裝成了簡單的屬性設(shè)置。
- 功能全面:支持文本平鋪、圖片透明度調(diào)整及多節(jié)(Section)獨(dú)立設(shè)置。
二、 準(zhǔn)備工作
首先,在你的 pom.xml 中引入必要的依賴。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc</artifactId>
<version>14.3.1</version>
</dependency>
</dependencies>三、 核心功能實(shí)現(xiàn)
1. 添加藝術(shù)文本水印
文本水印是最常見的需求。Spire.Doc 允許我們自定義字體、顏色、傾斜角度以及是否平鋪。
import com.spire.doc.*;
import com.spire.doc.documents.WatermarkLayout;
import java.awt.*;
public class TextWatermark {
public static void main(String[] args) {
Document document = new Document();
document.loadFromFile("input.docx");
TextWatermark txtWatermark = new TextWatermark();
txtWatermark.setText("機(jī)密文件 - 禁止外傳");
txtWatermark.setFontSize(45);
txtWatermark.setColor(new Color(255, 0, 0, 100)); // 使用半透明紅色
txtWatermark.setLayout(WatermarkLayout.Diagonal);
document.setWatermark(txtWatermark);
document.saveToFile("TextWatermark.docx", FileFormat.Docx_2013);
}
}
2. 添加圖片水印
圖片水印通常用于添加公司 Logo。關(guān)鍵點(diǎn)在于縮放和沖蝕(Washout)效果,沖蝕能自動降低圖片亮度和對比度,使其看起來更像背景。
import com.spire.doc.*;
public class ImageWatermark {
public static void main(String[] args) {
Document document = new Document();
document.loadFromFile("input.docx");
PictureWatermark picture = new PictureWatermark();
picture.setPicture("logo.png");
picture.setScaling(120);
picture.isWashout(true); // 設(shè)置沖蝕效果
document.setWatermark(picture);
document.saveToFile("ImageWatermark.docx", FileFormat.Docx_2013);
}
}
四、 進(jìn)階技巧:動態(tài)全屏平鋪水印
標(biāo)準(zhǔn)的 Word 水印通常只在頁面正中央顯示一個。如果為了防截屏,我們需要實(shí)現(xiàn)全屏平鋪(Tiled Watermark)。 由于 Word 本身對“平鋪文本”的原生支持有限,最佳做法是利用**頁眉(Header)**插入多個文本形狀。通過 deepClone() 方法,我們可以高效地復(fù)用同一個形狀模板并鋪滿全頁。
示例代碼:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.ShapeObject;
import java.awt.*;
public class WordWatermark {
public static void main(String[] args) {
// 加載示例文檔
Document doc = new Document();
doc.loadFromFile("Sample.docx");
// 創(chuàng)建水印母版形狀
ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text);
shape.setWidth(60);
shape.setHeight(20);
shape.setRotation(315);
shape.getWordArt().setFontFamily("宋體");
shape.getWordArt().setText("內(nèi)部使用");
shape.setFillColor(new Color(192, 192, 192, 150)); // 設(shè)置半透明灰色
shape.setLineStyle(ShapeLineStyle.Single);
shape.setStrokeWeight(1);
// 遍歷文檔的所有 Section
for (int n = 0; n < doc.getSections().getCount(); n++) {
Section section = doc.getSections().get(n);
HeaderFooter header = section.getHeadersFooters().getHeader();
Paragraph paragraph = header.getParagraphs().getCount() > 0
? header.getParagraphs().get(0)
: header.addParagraph();
// 雙重循環(huán)控制平鋪的行數(shù)和列數(shù)
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
// 核心:克隆母版并設(shè)置網(wǎng)格化位置
ShapeObject clonedShape = (ShapeObject) shape.deepClone();
clonedShape.setVerticalPosition(50 + 150 * i);
clonedShape.setHorizontalPosition(20 + 160 * j);
paragraph.getChildObjects().add(clonedShape);
}
}
}
doc.saveToFile("result.docx", FileFormat.Docx_2013);
}
}
五、 常見問題與解決方案 (FAQ)
為什么水印在轉(zhuǎn) PDF 后消失了?
通常是因?yàn)樘砑訉蛹壊粚?。使?document.setWatermark() 最穩(wěn)妥。若手動添加 Shape,需確保設(shè)置 VerticalOrigin.Page 屬性。
如何只給特定頁面加水???
Word 水印是基于節(jié)(Section)的。你可以使用 document.getSections().get(index) 獲取特定節(jié)并僅操作該節(jié)的頁眉。
性能優(yōu)化建議
處理長文檔時,請務(wù)必參考第四點(diǎn)中的 deepClone() 方式,避免重復(fù)通過構(gòu)造函數(shù)創(chuàng)建新對象,這能大幅節(jié)省內(nèi)存消耗。
六、 企業(yè)級應(yīng)用場景
在實(shí)際生產(chǎn)中,我們可以結(jié)合后端業(yè)務(wù)邏輯動態(tài)生成水?。?/p>
- 動態(tài)用戶信息:從 Session 獲取當(dāng)前登錄人的姓名。
- 內(nèi)容構(gòu)造:拼接
"User: " + empName + " | " + LocalDate.now()。 - 流處理:使用
document.saveToStream()將生成的帶水印文檔直接推送到前端,實(shí)現(xiàn)無痕的安全下載。
結(jié)語
使用 Java 為 Word 添加水印不再是一項(xiàng)復(fù)雜的工程。借助 Spire.Doc,開發(fā)者可以將精力從底層的 VML/XML 結(jié)構(gòu)中解脫出來,專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。
到此這篇關(guān)于使用Java實(shí)現(xiàn)Word文檔水印自動化功能的文章就介紹到這了,更多相關(guān)Java Word文檔水印自動化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)雷霆戰(zhàn)機(jī)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)雷霆戰(zhàn)機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
Java8利用Stream實(shí)現(xiàn)列表去重的方法詳解
這篇文章主要為大家介紹了Java利用Stream實(shí)現(xiàn)列表去重的幾種方法詳解,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下2022-04-04
java使用JDBC連接數(shù)據(jù)庫的五種方式(IDEA版)
這篇文章主要介紹了java使用JDBC連接數(shù)據(jù)庫的五種方式(IDEA版),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
MyBatis?原生二級緩存"難以修復(fù)"的原因解析及解決方案
文章主要討論了MyBatis原生二級緩存存在的問題,包括結(jié)構(gòu)性缺陷、難以修復(fù)等,社區(qū)提供了多種增強(qiáng)插件方案,但這些方案也有各自的優(yōu)缺點(diǎn),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-12-12
Java selenium上傳文件的實(shí)現(xiàn)
本文主要介紹了Java selenium上傳文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
spring cloud openfeign 源碼實(shí)例解析
這篇文章主要介紹了spring cloud openfeign 源碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
Intellij IDEA解析jacoco結(jié)果文件的方法
這篇文章主要介紹了Intellij IDEA解析jacoco結(jié)果文件的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09

