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"));
}
}