Wasserzeichen mit PDFBox 3.0.0

Mittwoch, 30. August 2023 - Lesezeit: ~1 Minute

Mit folgendem Code wird ein Wasserzeichen auf ein vorhandenes PDF zugefügt.


private void addWatermark(String watermarkText, File pdf) throws IOException {
    try (PDDocument doc = Loader.loadPDF(pdf);
         //Font muss sich in den Resourcen befinden
         InputStream is = getClass().getClassLoader().getResourceAsStream("Helvetica.ttf");) {
        PDFont font = PDType0Font.load(doc, is, true);
        for (PDPage page : doc.getPages()) {
            float pageWidth = page.getMediaBox().getWidth();
            float pageHeight = page.getMediaBox().getHeight();
            float fontSize = pageWidth / (font.getStringWidth(watermarkText) / 1000f);
            float fontHeight = (font.getFontDescriptor().getCapHeight()) / 1000 * fontSize;
            try (PDPageContentStream contents = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, false)) {
                contents.beginText();
                // Schriftfarbe
                contents.setStrokingColor(Color.BLACK);
                contents.setNonStrokingColor(Color.BLACK);
                // Wasserzeichen Stil
                PDExtendedGraphicsState gs = new PDExtendedGraphicsState();
                gs.setNonStrokingAlphaConstant(0.2f);
                gs.setStrokingAlphaConstant(0.2f);
                gs.setBlendMode(BlendMode.MULTIPLY);
                contents.setGraphicsStateParameters(gs);

                //Wir setzen das Zentrum der TextMatrix auf die Mitte der Seite und 
                //drehen sie um 45 Grad
                contents.setTextMatrix(Matrix.getRotateInstance(Math.toRadians(45), pageWidth / 2f, pageHeight / 2f));
                //Jetzt setzen wir den Text genau in das Zentrum der Matrix
                contents.newLineAtOffset(-pageWidth / 2f, -fontHeight / 2f);
                contents.setFont(font, fontSize);
                contents.showText(watermarkText);
                contents.endText();
            }
        }
        doc.save(new File("/tmp/newPdfWithWatermark.pdf"));
    }
}