Удалить ссылки из PDF с помощью iText 7.1 - PullRequest
0 голосов
/ 23 мая 2018

У нас есть поставщик, который не будет принимать PDF-файлы, содержащие ссылки.Мы пытаемся удалить ссылки, удалив все аннотации ссылок с каждой страницы PDF с помощью iText 7.1 (Java).Мы испробовали несколько методов, основанных на исследованиях.Вот три примера попыток обнаружить и удалить ссылки.Ничто из этого не приводит к тому, что в целевом PDF (test-no-links.pdf) ссылки удаляются.Любая идея будет принята с благодарностью.

Пример 1: Удалить на основе типа аннотации класса

  String src  = "test-with-links.pdf";
  String dest = "test-no-links.pdf";

  PdfReader   reader  = new PdfReader(src);
  PdfWriter   writer  = new PdfWriter(dest);
  PdfDocument pdfDoc  = new PdfDocument(reader,writer);

  for( int page = 1; page <= pdfDoc.getNumberOfPages(); ++page ) {
    PdfPage               pdfPage     = pdfDoc.getPage(page);
    List<PdfAnnotation>   annots      = pdfPage.getAnnotations();

    if ((annots == null) || (annots.size() == 0)) {
      System.out.println("no annotations on page " + page);
    }
    else {
      for( PdfAnnotation annot : annots ) {
        if( annot instanceof PdfLinkAnnotation ) {
          pdfPage.removeAnnotation(annot);
        }
      }
    }
  }
  pdfDoc.close();

Пример 2: Удалить на основе значения подтипа аннотации

  String src  = "test-with-links.pdf";
  String dest = "test-no-links.pdf";

  PdfReader   reader  = new PdfReader(src);
  PdfWriter   writer  = new PdfWriter(dest);
  PdfDocument pdfDoc  = new PdfDocument(reader,writer);

  for( int page = 1; page <= pdfDoc.getNumberOfPages(); ++page ) {
    PdfPage               pdfPage     = pdfDoc.getPage(page);
    List<PdfAnnotation>   annots      = pdfPage.getAnnotations();

    if ((annots == null) || (annots.size() == 0)) {
      System.out.println("no annotations on page " + page);
    }
    else {
      for( PdfAnnotation annot : annots ) {
        // if this annotation has a link, delete it
        if ( annot.getSubtype().equals(PdfName.Link) ) {
          PdfDictionary annotAction = ((PdfLinkAnnotation)annot).getAction();

          if( annotAction.get(PdfName.S).equals(PdfName.URI) ||
              annotAction.get(PdfName.S).equals(PdfName.GoToR) ) {
            PdfString uri = annotAction.getAsString(PdfName.URI);
            System.out.println("Removing " + uri.toString());
            pdfPage.removeAnnotation(annot);
          }
        }
      }
    }
  }
  pdfDoc.close();

Пример 3: Удалить все аннотации (игнорировать тип аннотации)

  String src  = "test-with-links.pdf";
  String dest = "test-no-links.pdf";

  PdfReader   reader  = new PdfReader(src);
  PdfWriter   writer  = new PdfWriter(dest);
  PdfDocument pdfDoc  = new PdfDocument(reader,writer);

  for( int page = 1; page <= pdfDoc.getNumberOfPages(); ++page ) {
    PdfPage               pdfPage     = pdfDoc.getPage(page);

    // remove all annotations from the page regardless of type
    pdfPage.getPdfObject().remove(PdfName.Annots);
  }
  pdfDoc.close();

1 Ответ

0 голосов
/ 24 мая 2018

Каждый из ваших тестов генерирует PDF без Ссылка аннотаций.

Возможно, однако, ваш просмотрщик PDF распознает "www.qualpay.com" как (частичный) URL и отображает его какссылка.

Подробно

Ваши процедуры

Все ваши тесты успешно удаляют все Ссылка аннотации из вашего образца PDF, ср.эти снимки экрана для исходного файла и всех трех файлов результатов, в частности, для поиска страницы 1 Annots entry:

test-with-links.pdf

test-with-links.pdf

test-no-links.pdf

test-no-links.pdf

test-no-links-1.pdf

test-no-links-1.pdf

test-no-links-2.pdf

test-no-links-2.pdf

Средство просмотра

Действительно, однако, при просмотре PDF в Adobe Acrobat Reader (а также некоторых других средствах просмотра, например встроенных средствах просмотра PDF Chrome и Edge), вы увидите, что «www.qualpay.com "рассматривается как ссылка.

Причина в том, что это функция программы просмотра PDF !Он сканирует текст PDF, который отображает, для строк, которые он распознает как (часть) некоторого URL, и отображает их как ссылки!

В Adobe Acrobat Reader вы можете отключить эту функцию:

Preferences / General

Если вы отключите «Создание ссылок из URL-адресов», вы неожиданно обнаружите, что URL-адреса в ваших файлах результатов неактивны, а URL-адрес в исходном файле (с аннотацией ссылки)все еще активны.

Что делать

У нас есть поставщик, который не будет принимать PDF-файлы, содержащие ссылки.

Сначала обсудите с вашим поставщиком, что именноон имеет в виду «PDF-файлы, которые содержат ссылки».Имеет ли он в виду

  • PDF-файлов с ссылкой аннотаций или
  • PDF-файлов с URL-адресами, которые обычные средства просмотра PDF представляют как Ссылка аннотации .

В первом случае ваш код (любой вариант) удаляет аннотации ссылки.Возможно, вам придется продемонстрировать поставщику, как отключить распознавание URL в Adobe Acrobat Reader.

В последнем случае вам придется удалить все из текстового содержимого ваших PDF-файлов, которое распознают обычные программы просмотра PDF.как URL.Вы можете заменить каждый URL-адрес растровым изображением текста URL-адреса или текстом URL-адреса, нарисованным как общая векторная графика (определяющая путь линий и кривых и заполняющая его), или каким-либо аналогичным суррогатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...