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

Java基于iText7實(shí)現(xiàn)PDF添加通用文本水印的示例詳解

 更新時間:2026年02月05日 11:32:54   作者:Reboot  
這篇文章主要為大家詳細(xì)介紹了Java基于iText7實(shí)現(xiàn)PDF添加通用文本水印的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

本文介紹如何使用 Java 在 PDF 文檔上添加通用的文字水印,示例基于 iText7,強(qiáng)調(diào)實(shí)現(xiàn)思路和關(guān)鍵 API,便于在任意項(xiàng)目中復(fù)用或擴(kuò)展。

1. 方案概覽

目標(biāo):在現(xiàn)有 PDF 文件的每一頁上添加居中、斜向、半透明的文字水印,例如「xx公司」。

適用場景

  • 預(yù)覽/下載前對 PDF 加防泄露水?。?/li>
  • 批量歸檔 PDF 時統(tǒng)一添加版權(quán)信息;
  • 按用戶或租戶動態(tài)生成個性化水印(用戶名、時間、IP 等)。

核心技術(shù)棧

  • Java 8+;
  • iText7(com.itextpdf:itext7-core);
  • 如需中文,建議引入中文字體依賴(如 font-asian 或自備 TTF/OTF 字體)。

2. 基本依賴配置示例(Maven)

<dependencies>
    <!-- iText7 主依賴(PDF 內(nèi)核) -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.2.5</version>
        <type>pom</type>
    </dependency>
?
    <!-- 可選:中文字體支持(也可以使用自帶 TTF 字體文件) -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>font-asian</artifactId>
        <version>7.2.5</version>
    </dependency>
</dependencies>

實(shí)際版本號可按項(xiàng)目統(tǒng)一依賴管理調(diào)整。

3. 實(shí)現(xiàn)思路

使用 PdfReader 讀取原始 PDF 輸入流(或文件)。

使用 PdfWriter 將處理結(jié)果寫入輸出流(內(nèi)存或新文件)。

構(gòu)造 PdfDocument 與高級布局對象 Document。

選擇合適的字體(特別是包含中文的字體)。

遍歷 PDF 的每一頁,計(jì)算頁面中心坐標(biāo),在對應(yīng)頁上繪制水印 Paragraph

  • 文本內(nèi)容:例如「xx公司」或某個動態(tài)字符串;
  • 字體、字號、顏色、透明度;
  • 旋轉(zhuǎn)角度(如 45°)與對齊方式(居中)。

關(guān)閉文檔,輸出帶水印的 PDF。

4. 示例代碼:為每頁添加對角線文字水印

import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.properties.TextAlignment;
import com.itextpdf.layout.properties.VerticalAlignment;
?
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
?
public class PdfWatermarkUtil {
?
    /**
     * 為 PDF 每一頁添加斜向文字水印
     *
     * @param pdfInput     原始 PDF 輸入流
     * @param watermark    水印文本(如 "xx公司")
     * @return 帶水印 PDF 的字節(jié)數(shù)組
     */
    public static byte[] addTextWatermark(InputStream pdfInput, String watermark) throws Exception {
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            PdfReader reader = new PdfReader(pdfInput);
            PdfWriter writer = new PdfWriter(out);
            PdfDocument pdfDoc = new PdfDocument(reader, writer);
            Document document = new Document(pdfDoc);
?
            PdfFont font = createFont();
?
            int totalPages = pdfDoc.getNumberOfPages();
            for (int i = 1; i <= totalPages; i++) {
                Rectangle pageSize = pdfDoc.getPage(i).getPageSize();
                float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
                float y = (pageSize.getTop() + pageSize.getBottom()) / 2;
?
                Paragraph p = new Paragraph(watermark)
                        .setFont(font)
                        .setFontSize(60)
                        .setFontColor(new DeviceRgb(192, 192, 192))
                        .setOpacity(0.3f);
?
                document.showTextAligned(
                        p,
                        x, y, i,
                        TextAlignment.CENTER,
                        VerticalAlignment.MIDDLE,
                        (float) Math.toRadians(45)
                );
            }
?
            document.close();
            pdfDoc.close();
            return out.toByteArray();
        }
    }
?
    /**
     * 創(chuàng)建字體(示例:使用系統(tǒng)或自帶的中文字體)
     */
    private static PdfFont createFont() throws Exception {
        // 示例:使用內(nèi)置字體或自帶 TTF 文件
        // 1)若有自定義字體:
        // return PdfFontFactory.createFont("/path/to/simsun.ttf", PdfEncodings.IDENTITY_H, true);
        // 2)簡化示例:使用內(nèi)置字體(不保證完整中文支持)
        return PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
    }
}

5. 關(guān)鍵點(diǎn)與擴(kuò)展建議

字體選擇:對中文 PDF,盡量使用包含中文的 TTF/OTF 字體文件,并通過 PdfEncodings.IDENTITY_H 創(chuàng)建嵌入字體,避免亂碼。

透明度與字號:可根據(jù)實(shí)際打印/預(yù)覽效果調(diào)整水印的字號和 setOpacity,在可見與不干擾閱讀之間取得平衡。

動態(tài)水印:業(yè)務(wù)代碼中通常不會寫死「xx公司」,而是將水印文案作為參數(shù)傳入,例如「xx公司(機(jī)密)」或「用戶名+時間戳」。

性能考慮:對于非常大的 PDF(頁數(shù)很多),可以:

  • 控制只對部分頁面加水印;
  • 或在異步任務(wù)/批處理服務(wù)中執(zhí)行水印操作。

安全性:水印不能防止專業(yè)的 PDF 編輯/篡改,但對一般用戶的泄露行為有一定威懾與追責(zé)作用,可結(jié)合權(quán)限控制一同使用。

6. 總結(jié)

使用 iText7 給 PDF 添加文字水印的核心就是:讀取現(xiàn)有 PDF → 遍歷頁面 → 在每頁疊加一層半透明文本。上面的封裝方法只依賴 InputStream 與文案字符串,便于集成到上傳、下載或文件轉(zhuǎn)換鏈路中,實(shí)現(xiàn)統(tǒng)一的 PDF 水印策略。

以上就是Java基于iText7實(shí)現(xiàn)PDF添加通用文本水印的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java iText7添加PDF水印的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào)的方法

    詳解springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào)的方法

    這篇文章主要介紹了springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào),文中通過一個簡單示例來直觀的理解什么是同步調(diào)用,在單元測試用例中,注入?SyncTask?對象,并在測試用例中執(zhí)行?doTaskOne(),doTaskTwo(),doTaskThree()?三個方法,具體實(shí)現(xiàn)方式跟隨小編一起看看吧
    2022-05-05
  • 關(guān)于@PostConstruct、afterPropertiesSet和init-method的執(zhí)行順序

    關(guān)于@PostConstruct、afterPropertiesSet和init-method的執(zhí)行順序

    這篇文章主要介紹了關(guān)于@PostConstruct、afterPropertiesSet和init-method的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 淺談Java對象禁止使用基本類型

    淺談Java對象禁止使用基本類型

    本文主要介紹了淺談Java對象禁止使用基本類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Kafka單節(jié)點(diǎn)偽分布式集群搭建實(shí)現(xiàn)過程詳解

    Kafka單節(jié)點(diǎn)偽分布式集群搭建實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Kafka單節(jié)點(diǎn)偽分布式集群搭建實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • JAVA?GUI基礎(chǔ)與MouseListener用法

    JAVA?GUI基礎(chǔ)與MouseListener用法

    這篇文章主要介紹了JAVA?GUI基礎(chǔ)與MouseListener用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java SpringBoot自動裝配原理詳解

    Java SpringBoot自動裝配原理詳解

    這篇文章主要介紹了詳解Spring Boot自動裝配的原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • springboot 重定向方式(redirect前綴)

    springboot 重定向方式(redirect前綴)

    這篇文章主要介紹了springboot 重定向方式(redirect前綴),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹詳解

    Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹詳解

    二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • Netty分布式pipeline管道傳播事件的邏輯總結(jié)分析

    Netty分布式pipeline管道傳播事件的邏輯總結(jié)分析

    這篇文章主要為大家介紹了Netty分布式pipeline管道傳播事件總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java中幾個Reference常見的作用詳解

    Java中幾個Reference常見的作用詳解

    這篇文章主要給大家介紹了Java中關(guān)于Reference多個作用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06

最新評論

张家港市| 安溪县| 天峨县| 界首市| 黑龙江省| 剑阁县| 合肥市| 鞍山市| 炉霍县| 德钦县| 铅山县| 大庆市| 内丘县| 祁门县| 马鞍山市| 河北省| 汕尾市| 蒙阴县| 尼木县| 沁水县| 沙坪坝区| 蓬莱市| 左权县| 甘南县| 洪湖市| 兴海县| 专栏| 福建省| 奈曼旗| 西丰县| 周宁县| 乳山市| 定南县| 博野县| 辛集市| 罗田县| 乌兰浩特市| 海原县| 达孜县| 西城区| 保山市|