Как заменить текст в pdf файле библиотекой ITextPDF? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть требование заменить местозаполнитель, такой как $ {placeholder}, на фактическое значение, но я не смог найти никакого рабочего решения ... Я выбрал https://itextpdf.com/en/resources/examples/itext-7/replacing-pdf-objects, и он не работает , Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 30 мая 2019

В общем, не так просто «заменить» содержимое файла 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));

}

Результат не идеален, но это всего лишь подтверждение концепции. Можно переопределить стратегии извлечения и определить шрифт отредактированного содержимого, чтобы его можно было использовать для размещения нового текста в отредактированной области.

0 голосов
/ 30 мая 2019

Пример кода ниже для замены содержимого в PDF с помощью iText

    File dir = new File("./");
    File [] files = dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".pdf");
        }
    });

    for (File pdffile : files) {
        System.out.println(pdffile.getName());
        PdfReader reader = null;
        reader = new PdfReader(pdffile.toString()); 

      PdfDictionary dict = reader.getPageN(1);
      PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
      if (object instanceof PRStream) {
          PRStream stream = (PRStream)object;
          byte[] data = PdfReader.getStreamBytes(stream);
          String dd = new String(data);
          dd = dd.replace("0 0 0 rg\n()Tj", "0 0 0 rg\n(Plan Advanced Payment)Tj");
          System.out.print(dd);
          stream.setData(dd.getBytes());
      }
      PdfStamper stamper = new PdfStamper(reader,
      new FileOutputStream("./output/"+pdffile.getName())); // output PDF
      stamper.close();
      reader.close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...