Не удаляемый водяной знак в файле PDF с использованием iText в Java - PullRequest
0 голосов
/ 28 ноября 2018

У нас есть требование, чтобы нам нужно было добавлять текстовые водяные знаки в журналы, в которых на каждой странице есть несколько изображений.Я попытался com.itextpdf.jar version 5.0.6 добавить водяной знак, но в итоге смог удалить с помощью Adobe Acrobat Pro.

Я также попробовал вариант ниже, но это тоже не сработало.

stamper.setFreeTextFlattening(true); 

Можно ли с помощью iText добавить водяной знак, который невозможно удалить без особых усилий.

Ниже приведена моя реализация.

public static void addWaterMark() throws IOException, DocumentException {
    PdfReader reader = new PdfReader("C:/Trade-catalog/Catalog2017.pdf");
    ByteArrayOutputStream outputPdf = new ByteArrayOutputStream();
    PdfStamper stamper = new PdfStamper(reader, outputPdf);

    String bodyWatermarkText = "12345 - John Smith";
    String bodyWatermarkRotation = "35";
    String footerWatermarkText = "Richard Parker";
    BaseFont font = BaseFont.createFont("/fonts/micross.ttf", "Cp1250", BaseFont.EMBEDDED);

    PdfGState state = new PdfGState();
    state.setFillOpacity(0.3f);

    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        Rectangle thisPageSize = reader.getPageSize(i);
        PdfPatternPainter bodyPainter = stamper.getOverContent(i).createPattern(thisPageSize.getWidth(),
                thisPageSize.getHeight());
        bodyPainter.setColorFill(new BaseColor(0, 0, 0));
        bodyPainter.beginText();
        bodyPainter.setTextRenderingMode(PdfPatternPainter.TEXT_RENDER_MODE_FILL);
        bodyPainter.setFontAndSize(font, 60);
        bodyPainter.showTextAlignedKerned(Element.ALIGN_CENTER, bodyWatermarkText, thisPageSize.getWidth() / 2,
                thisPageSize.getHeight() / 2, Integer.valueOf(bodyWatermarkRotation));
        bodyPainter.showTextAlignedKerned(Element.ALIGN_RIGHT, footerWatermarkText, thisPageSize.getWidth() * 0.97f,
                thisPageSize.getHeight() * 0.015f, 0);
        bodyPainter.endText();

        PdfContentByte overContent = stamper.getOverContent(i);
        overContent.setGState(state);
        overContent.setColorFill(new PatternColor(bodyPainter));
        overContent.rectangle(thisPageSize.getLeft(), thisPageSize.getBottom(), thisPageSize.getWidth(),
                thisPageSize.getHeight());
        overContent.fill();
        overContent.setFlatness(100);
    }
    stamper.close();
    FileOutputStream outputStream = new FileOutputStream(
            "C:/Trade-catalog/output/TradeCatalog2017Watermarked_bodyPainter.pdf");
    outputPdf.writeTo(outputStream);
    outputPdf.close();
    reader.close();
}
...