1. 程式人生 > 其它 >itext向PDF新增文字圖片水印

itext向PDF新增文字圖片水印

Maven座標

<properties>
    <itextpdf.version>5.5.6</itextpdf.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

程式碼

    /**
     * PDF加圖片水印
     * @param pdfInPath 原始檔(PDF)
     * @param imgPath 圖片檔案(水印)
     * @param pdfOutPath 目標輸出檔案(PDF)
     * @throws IOException
     * @throws DocumentException
     */
    public static void setImgWatermark(String pdfInPath,String imgPath,String pdfOutPath)
            throws  IOException, DocumentException {
        FileOutputStream fos = new FileOutputStream(pdfOutPath);
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        PdfReader reader = new PdfReader(pdfInPath);
        PdfStamper stamper = new PdfStamper(reader, bos);
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte waterMar;

        PdfGState gs = new PdfGState();
        for (int i = 1; i < total; i++) {
            waterMar = stamper.getOverContent(i);// 在內容上方加水印
            //waterMar = stamper.getUnderContent(1);//在內容下方加水印
            // 設定圖片透明度為0.8f
            gs.setFillOpacity(0.8f);
            // 設定透明度
            waterMar.setGState(gs);
            // 建立水印圖片
            Image image = Image.getInstance(imgPath);
            // 水印圖片位置
            image.setAbsolutePosition(850, 80);
            // 邊框固定
            image.scaleToFit(200, 200);
            // 設定旋轉弧度
            //image.setRotation(30);// 旋轉 弧度
            // 設定旋轉角度
            //image.setRotationDegrees(45);// 旋轉 角度
            // 設定等比縮放
            image.scalePercent(150);
            // 自定義大小
            image.scaleAbsolute(100,100);
            // 附件加上水印圖片
            waterMar.addImage(image);
            // stroke
            waterMar.stroke();
        }
        stamper.close();
        reader.close();
    }

    /**
     * PDF新增文字水印
     * @param srcFile 原始檔(PDF)
     * @param outSrcPath 目標輸出檔案(PDF)
     * @param watermarktext 水印(文字)
     * @throws IOException
     * @throws DocumentException
     */
    public static void addWatermark(String srcFile,String outSrcPath, String watermarktext) throws IOException, DocumentException {
        // 待加水印的檔案
        PdfReader reader = new PdfReader(new FileInputStream(srcFile));

        if(outSrcPath == null || outSrcPath.trim().equals("")){
            outSrcPath = "D:\\waterMark.pdf";
        }
        // 加完水印的檔案
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outSrcPath));
        // 設定字型
        BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
        // 設定透明度
        PdfGState gs = new PdfGState();
        // pdf頁數
        int pageCount = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        // 迴圈對每頁插入水印
        for (int i = 1; i < pageCount; i++)
        {
            // 水印的起始
            content = stamper.getOverContent(i);
            gs.setFillOpacity(0.5f);
            content.setGState(gs);
            // 開始
            content.beginText();
            // 設定顏色 預設為黑色
            content.setColorFill(BaseColor.LIGHT_GRAY);
            // 設定字型及字號
            content.setFontAndSize(baseFont, 50);
            // 開始寫入水印
            content.showTextAligned(Element.ALIGN_BASELINE, watermarktext, 180,
                    340, 45);
            content.endText();
        }
        stamper.close();
        reader.close();
    }

呼叫

        /*新增圖片水印*/
        String filePath1 = realPath + "\\cer\\"+CommonTool.getCurrTimeForFile()+".pdf";
        setImgWatermark(realPath + filepath,"C:\\Pictures\\qrcode.png",filePath1);

        /*新增文字水印*/
        String filePath2 = realPath + "\\cer\\"+CommonTool.getCurrTimeForFile()+".pdf";
        addWatermark(filePath1,filePath2,"這是一個水印");

效果如下