給pdf檔案添加防偽浮水印logo(附工程源碼下載)

來源:互聯網
上載者:User

標籤:

pdf添加浮水印logo這種需求情境確實很少,有些時候一些銷售單據產生pdf添加一個浮水印logo,做一個簡單的防偽效果,雖然實際上並沒有太大作用,但是產品經理說要,巴拉巴拉……省略一萬字。

下面將源碼分享給猿友們,有用就looklook,沒用就轉移視線吧。

一、效果展示

沒加浮水印的pdf:

添加浮水印後的pdf:

這裡效果可能不是很明顯,有需要的猿友可以直接下載下面的源碼壓縮包,裡面有添加浮水印後的pdf檔案。

二、源碼下載

http://download.csdn.net/detail/u013142781/9421432

裡面的pdf_project.zip是源碼,源碼環境eclipse+maven

三、執行個體說明

工程需要添加itextpdf包依賴,maven依賴為:

<dependency>    <groupId>com.itextpdf</groupId>    <artifactId>itextpdf</artifactId>    <version>5.5.3</version></dependency>

除了依賴以外,就一個類PDFAddWaterMark.java了,其代碼如下:

package com.luo.pdf;import com.itextpdf.text.Image;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfGState;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.PdfStamper;import java.io.File;import java.io.FileOutputStream;import java.util.Random;public class PDFAddWaterMark {    static final float IAMGE_HEIGHT = 110f; // 限制浮水印圖片的的高度    static final float IAMGE_WIDTH = 110f; // 限制浮水印圖片的的寬度    /**     * 給pdf檔案添加浮水印     * @param file 要加浮水印的原pdf檔案     * @throws Exception     */    public static void addPdfMark(File file) throws Exception {        // 如果是web項目,應該從web項目裡面擷取logo        // String markImagePath =        // request.getSession().getServletContext().getRealPath("/") +        // "resources/images/logo.jpg";        String markImagePath = "C:/Users/luoguohui/Desktop/logo.jpg"; // 浮水印圖片路徑        PdfReader reader = new PdfReader(file.getPath(), "PDF".getBytes());        // 如果是web項目,直接下載應該放到response的流裡面        // PdfStamper stamp = new PdfStamper(reader,        // response.getOutputStream());        // 添加浮水印之後的pdf檔案        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(                "C:/Users/luoguohui/Desktop/afterAddPdfMark.pdf"));        int pageSize = reader.getNumberOfPages();        float pageHeight = reader.getPageSize(1).getHeight();        float pageWidth = reader.getPageSize(1).getWidth();        try {            // 每兩行顯示兩個 左邊一個,右邊一個            int lineNum = (int) (pageHeight / IAMGE_HEIGHT); // 行數            int middleY = (int) pageWidth / 2;            for (int i = 1; i <= pageSize; i++) {                for (int j = 0, k = 0; j < lineNum; j = j + 2, k++) {                    Random random = new Random();                    Image img = Image.getInstance(markImagePath);// 插入浮水印                    img.scaleAbsolute(IAMGE_WIDTH, IAMGE_HEIGHT * 184 / 455);                    img.setAlignment(Image.UNDERLYING); // 在字下面                    int trueY;                    while (true) {                        trueY = random.nextInt(middleY);                        if (trueY > IAMGE_WIDTH / 2                                && trueY < (middleY - IAMGE_WIDTH)) {                            break;                        }                    }                    img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT                            + (float) random.nextInt((int) IAMGE_HEIGHT)                            - (k % 2) * 10); // 浮水印的位置                    img.setRotationDegrees(random.nextInt(360));// 旋轉 角度                    PdfContentByte under = stamp.getUnderContent(i);                    PdfGState gs = new PdfGState();                    gs.setFillOpacity(0.3f); // 設定透明度為0.3                    under.setGState(gs);                    under.addImage(img);                    while (true) {                        trueY = random.nextInt(middleY) + middleY;                        if (trueY > middleY + IAMGE_WIDTH / 2                                && trueY < (2 * middleY - IAMGE_WIDTH)) {                            break;                        }                    }                    img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT                            + (float) random.nextInt((int) IAMGE_HEIGHT)                            - (k % 2) * 10); // 浮水印的位置                    img.setRotationDegrees(random.nextInt(360));// 旋轉 角度                    under.addImage(img);                }            }        } catch (Exception e) {            throw e;        } finally {            stamp.close();// 關閉            reader.close();        }    }    public static void main(String[] args) throws Exception {        // 添加浮水印之前的pdf檔案        File file = new File("C:/Users/luoguohui/Desktop/beforeAddPdfMark.pdf");        addPdfMark(file);    }}

這裡有必要對上面的代碼說明的是:其實就是在pdf裡面加入圖片logo,只是這些圖片logo不會遮擋住文字,而且有一定的透明度。另外logo隨機旋轉一定的角度。再另外,其出現的位置,根據當前頁的高度計算出一頁需要多少行logo,每行左邊一個右邊一個,然後其位置上下左右在一定範圍內隨機。代碼實現就這樣,如果還有什麼不明白的可以留言。

給pdf檔案添加防偽浮水印logo(附工程源碼下載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.