天天看點

PDF添加二維碼

package com.xuebusi.toutiao.admin.api.common.util;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.*;

import java.io.*;

public class WaterMarkUtils {
    /**
     * PDF附件添加二維碼
     *
     * @param bos   輸出檔案的位置
     * @param input 輸入檔案流
     * @author nicky.ma
     * @date 2019年6月11日下午3:42:15
     */
    public static void setQrCodeForPDF(BufferedOutputStream bos, InputStream input) {
        try {
            // 建立水印圖檔
            BarcodeQRCode barcodeQRCode = new BarcodeQRCode("https://sina.cn", 100, 100, null);
            com.itextpdf.text.Image iTextImage = barcodeQRCode.getImage();
            // 水印圖檔位置
            iTextImage.setAbsolutePosition(10, 740);
            // 邊框固定
//            iTextImage.scaleToFit(200, 200);
            // 設定旋轉弧度
            //image.setRotation(30);// 旋轉 弧度
            // 設定旋轉角度
//            iTextImage.setRotationDegrees(45);
            // 設定等比縮放
            iTextImage.scalePercent(80);
            // 自定義大小
            iTextImage.scaleAbsolute(100, 100);
            //PDF附件加上二維碼水印
            setWatermarkForPDF(bos, input, iTextImage);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 為PDF附件添加圖檔水印
     *
     * @param bos   輸出檔案的位置
     * @param input 輸入檔案流
     * @author nicky.ma
     * @date 2019/6/11 12:00:32
     */
    public static void setWatermarkForPDF(BufferedOutputStream bos, InputStream input, Image iTextImage)
            throws IOException, DocumentException {
        PdfReader reader = new PdfReader(input);
        PdfStamper stamper = new PdfStamper(reader, bos);
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte waterMar;

        PdfGState gs = new PdfGState();
        long startTime = System.currentTimeMillis();
        System.out.println("PDF加圖檔水印 start");
        for (int i = 1; i < total; i++) {
//            waterMar = stamper.getOverContent(i);// 在内容上方加水印
            waterMar = stamper.getUnderContent(1);//在内容下方加水印
            // 設定圖檔透明度為0.2f
            //gs.setFillOpacity(0.2f);
            // 設定筆觸字型不透明度為0.4f
            //gs.setStrokeOpacity(0.4f);
            // 開始水印處理
            waterMar.beginText();
            // 設定透明度
            waterMar.setGState(gs);
            // 設定水印字型參數及大小
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            waterMar.setFontAndSize(bf, 12);
//             設定水印對齊方式 水印内容 X坐标 Y坐标 旋轉角度
            waterMar.showTextAligned(Element.ALIGN_CENTER, "存證證書", 60, 725, 0);
            // 設定水印顔色
            waterMar.setColorFill(BaseColor.GRAY);
            // 附件加上水印圖檔
            waterMar.addImage(iTextImage);
            // 完成水印添加
            waterMar.endText();
            // stroke
            waterMar.stroke();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("PDF加圖檔水印 ok 所用時間:" + (endTime - startTime) + "s");
        stamper.close();
        reader.close();
    }

    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream inputStream = new FileInputStream(new File("D:\\2021-07-29.pdf"));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\20210729.pdf"));
        WaterMarkUtils.setQrCodeForPDF(bos, inputStream);
    }
}      

繼續閱讀