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

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

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

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

1. 方案概覽

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

適用場景

  • 預覽/下載前對 PDF 加防泄露水??;
  • 批量歸檔 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>

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

3. 實現(xiàn)思路

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

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

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

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

遍歷 PDF 的每一頁,計算頁面中心坐標,在對應(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)鍵點與擴展建議

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

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

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

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

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

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

6. 總結(jié)

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

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

相關(guān)文章

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

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

    這篇文章主要介紹了springboot通過Async注解實現(xiàn)異步任務(wù)及回調(diào),文中通過一個簡單示例來直觀的理解什么是同步調(diào)用,在單元測試用例中,注入?SyncTask?對象,并在測試用例中執(zhí)行?doTaskOne(),doTaskTwo(),doTaskThree()?三個方法,具體實現(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對象禁止使用基本類型,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Kafka單節(jié)點偽分布式集群搭建實現(xiàn)過程詳解

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

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

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

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

    Java SpringBoot自動裝配原理詳解

    這篇文章主要介紹了詳解Spring Boot自動裝配的原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    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),具有鏈表的快速插入與刪除的特點,同時查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細講講二叉搜索樹的原理與實現(xiàn),需要的可以參考一下
    2022-06-06
  • Netty分布式pipeline管道傳播事件的邏輯總結(jié)分析

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

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

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

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

最新評論

井陉县| 神池县| 大渡口区| 光山县| 雅江县| 丰台区| 礼泉县| 南靖县| 江西省| 宜丰县| 哈尔滨市| 稷山县| 雷山县| 亳州市| 东辽县| 介休市| 宿迁市| 彭州市| 扎兰屯市| 原平市| 中卫市| 德安县| 绥滨县| 大竹县| 于都县| 怀安县| 北票市| 镇康县| 峨眉山市| 兴安县| 宁化县| 大同县| 定安县| 黄石市| 商南县| 隆回县| 汤阴县| 长寿区| 张北县| 建湖县| 宁明县|