Удалить гиперссылки из PDF-документа (iTextSharp) - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь использовать iTextSharp (очень новый для продукта), чтобы удалить гиперссылки из документа PDF.Кто-нибудь знает возможно ли это?Я копался в API и не нашел очевидного способа сделать это.

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

Заранее спасибо,Скотт

1 Ответ

4 голосов
/ 03 мая 2011

Ссылки, на которые люди нажимают, являются аннотациями в массиве данной страницы / Annots.

У вас есть два варианта:

  1. Уничтожить весь массив / Annots
  2. Поиск в массиве / Annots и удаление всех аннотаций ссылок

Простое удаление массива аннотаций очень просто:

 PdfDictionary pageDict = reader.getPageN(1); // 1st page is 1
 pageDict.remove(PdfName.ANNOTS);

 stamper.close();

Проблема в том, что вы можете уничтожать аннотации, которые хотите сохранить вместе с теми, которые вы не делаете.

Решение состоит в том, чтобы искать в массиве annot ссылки на URL-адреса.

PdfDictionary pageDict = reader.getPageN(1);
PdfArray annots = pageDict.getAsArray(PdfName.ANNOTS);
PdfArray newAnnots = new PdfArray();
if (annots != null) {
  for (int i = 0; i < annots.size(); ++i) {
    PdfDictionary annotDict = annots.getAsDict(i);
    if (!PdfName.LINK.equals(annotDict.getAsName(PdfName.SUBTYPE))) {
      // annots are actually listed as PdfIndirectReference's.  
      // Adding the dict directly would be A Bad Thing.
      newAnnots.add(annots.get(i));// get the original reference, not the dict
    }
  }
  pageDict.put(PdfName.ANNOTS, newAnnots);
}

Это удалит все аннотации ссылок, а не только те, которые ссылаются на внутренние сайты. Если вам нужно копать глубже, вам нужно проверить PDF Spec , раздел 12.5.6.5 (аннотации ссылок) и раздел 12.6.4.7 (действия URI).

...