JAVA itextpdf 为PDF添加多种水印

2,024 阅读2分钟

PDF 添加单个文字水印

  1. 添加单个文字水印代码
     /**
     * 添加单个文字
     * @param pdfStamper 文件
     * @param waterMarkName 水印文字
     */
    private static void addWatermark(PdfStamper pdfStamper, String waterMarkName) {
        PdfContentByte content = null;
        BaseFont base = null;
        Rectangle pageRect = null;
        PdfGState gs = new PdfGState();
        try {
            // 设置字体
            base = BaseFont.createFont("C:/WINDOWS/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        try {
            if (base == null || pdfStamper == null) {
                return;
            }
            // 设置透明度为0.1
            gs.setFillOpacity(0.1f);
            gs.setStrokeOpacity(0.1f);
            int toPage = pdfStamper.getReader().getNumberOfPages();
            // 设置绕过首页和尾页
            for (int i = 1; i <= toPage; i++) {
                pageRect = pdfStamper.getReader().getPageSizeWithRotation(i);
                // 计算水印X,Y坐标
                float x = pageRect.getWidth() / 2;
                float y = pageRect.getHeight() / 2;
                //获得PDF最顶层
                content = pdfStamper.getOverContent(i);
                content.saveState();
                content.setGState(gs);
                content.beginText();
                content.setColorFill(BaseColor.RED);
                // 设置字体和文字大小
                content.setFontAndSize(base, 38);
                // 水印文字成45度角倾斜
                content.showTextAligned(Element.ALIGN_CENTER, waterMarkName, x,y, 45);
                content.endText();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            content = null;
            base = null;
            pageRect = null;
        }
    }
  1. 调用方法添加水印
    public static void main(String[] args) throws Exception {
        try{
            String inPutFile = "E:/test/源文件.pdf";
            String outPutFile = "E:/test/报告水印1.pdf";

            // 添加单个水印
            PdfReader pdfReader = new PdfReader(inPutFile);
            PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outPutFile), '1',true);
            addWatermark(pdfStamper, "绝密文件,禁止外传!");
            pdfStamper.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
  1. 添加文字水印效果

PDF 添加满屏文字水印

  1. 添加满屏文字水印代码
     /**
     * 水印填满整个页面
     * @param stamper 输出已添加水印的文件
     * @param waterMarkName 水印文字
     */
    public static void fillUpWaterMark(PdfStamper stamper, String waterMarkName) {
        try {
            BaseFont base = BaseFont.createFont("C:/WINDOWS/Fonts/SC-REGULAR.OTF", BaseFont.IDENTITY_H,   BaseFont.EMBEDDED);
            Rectangle pageRect = null;
            PdfGState gs = new PdfGState();
            // 设置透明度
            gs.setFillOpacity(0.1f);
            gs.setStrokeOpacity(0.1f);
            int total = stamper.getReader().getNumberOfPages();
            JLabel label = new JLabel();
            FontMetrics metrics;
            int textH = 0;
            int textW = 0;
            label.setText(waterMarkName);
            metrics = label.getFontMetrics(label.getFont());
            textH = metrics.getHeight();
            textW = metrics.stringWidth(label.getText());
            PdfContentByte under;
            for (int i = 1; i <= total; i++) {
                pageRect =  stamper.getReader().getPageSizeWithRotation(i);
                under = stamper.getOverContent(i);
                under.saveState();
                under.setGState(gs);
                under.beginText();
                // 设置水印字体大小颜色
                under.setFontAndSize(base, 20);
                under.setColorFill(BaseColor.RED);
                // 水印文字成30度角倾斜
                for (int height = 5 + textH; height < pageRect.getHeight(); height = height + textH*3) {
                    for (int width = 5 + textW; width < pageRect.getWidth() + textW; width = width + textW + 3) {
                        under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, 45);
                    }
                }
                // 添加水印文字
                under.endText();
            }
            stamper.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  1. 调用方法添加水印
    public static void main(String[] args) throws Exception {
        try{
            String inPutFillUpFile = "E:/test/源文件.pdf";
            String outPutFillUpFile = "E:/test/报告水印2.pdf";
            // 添加多个水印
            PdfReader pdfReader1 = new PdfReader(inPutFillUpFile);
            PdfStamper pdfStamper1 = new PdfStamper(pdfReader1, new FileOutputStream(outPutFillUpFile), '1',true);
            fillUpWaterMark(pdfStamper1, "绝密文件,禁止外传!");
            pdfStamper1.close();

        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
  1. 添加文字水印效果