В общем, не так просто «заменить» содержимое файла PDF, так как он мог бы быть написан по-другому. Например, предположим, что вы хотите заменить чанк «Hello» на чанк «World». Вам бы повезло, если бы "Hello" было записано в PDF как целое слово. Это могло быть написано как «He» и «llo», или даже «o», «l», «l», «e», «H», а буквы migth помещались в разные части потока контента. .
Однако можно удалить контент, а затем поместить другой контент в то же место.
Давайте посмотрим, как это можно сделать.
1) Я советую вам использовать iText pdfSweep
, так как этот инструмент может обнаруживать области, в которых размещен контент, и удалять контент (важно отметить, что pdfSweep не скрывает контент, он удаляет это полностью)
Пожалуйста, посмотрите на следующий образец: https://github.com/itext/i7j-pdfsweep/blob/develop/src/test/java/com/itextpdf/pdfcleanup/BigDocumentAutoCleanUpTest.java
Давайте обсудим redactTonySoprano
тест. Как видите, можно указать несколько регулярных выражений (например, "" Tony (| _) Soprano "," Soprano "и" Sopranoes "), а iText отредактирует все совпадения содержимого.
Затем вы можете просто написать текст в этих областях, используя iText, либо через API низкого уровня (PdfCanvas), либо через более сложные API высокого уровня (Canvas и т. Д.).
Давайте немного изменим образец сопрано, о котором я упоминал ранее:
2) Давайте добавим немного текста на отредактированные области:
for (IPdfTextLocation location : strategy.getResultantLocations()) {
PdfPage page = pdf.getPage(location.getPageNumber()+1);
PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), page.getDocument());
Canvas canvas = new Canvas(pdfCanvas, pdf, location.getRectangle());
canvas.add(new Paragraph("SECURED").setFontSize(8));
}
Результат не идеален, но это всего лишь подтверждение концепции. Можно переопределить стратегии извлечения и определить шрифт отредактированного содержимого, чтобы его можно было использовать для размещения нового текста в отредактированной области.