Как извлечь контент из потока внешнего вида, когда ресурсы не в словаре?

Я пытаюсь прочитать внешний вид аннотации PDF с помощью iTextSharp и получить текст содержимого из потока.

Я использую следующий код:

public String ExtractAnnotationText(PdfStream xObject)
        {
          PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES);   
          ITextExtractionStrategy strategy = new LocationTextExtractionStrategy();
          PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy);
          byte[] contentByteArray = ContentByteUtils.GetContentBytesFromContentObject(xObject);
          processor.ProcessContent(contentByteArray, resources);
          return strategy.GetResultantText();
        }

xObject извлекается из словаря внешнего вида и передается следующим образом:

PRStream value = (PRStream)appearancesDictionary.GetAsStream(key);
String text = ExtractAnnotationText(value);

Это обычно хорошо работает для получения текста внешнего вида из аннотаций, но я нашел пример FreeTextCallout, где xObject не имеет ключа /Resources, как показано его hashMap:

[/Type, /XObject]
[/Subtype, /Form]   
[/FormType, 1]
[/Length, 71]
[/Matrix, [1, 0, 0, 1, -28.7103, -643.893]]
[/BBox, [28.7103, 643.893, 597.85, 751.068]]
[/Filter, /FlateDecode]

В этом случае есть ли другой способ создать словарь Resources для перехода к PdfContentStreamProcessor.ProcessContent()? Или даже другой способ получить текст без использования ProcessContent()?


person sigil    schedule 15.11.2016    source источник


Ответы (1)


По этому поводу спецификация pdf заявляет:

Словарь ресурсов должен быть связан с потоком контента одним из следующих способов:

  • Для потока контента, который является значением записи Contents страницы (или элементом массива, который является значением этой записи), словарь ресурсов должен быть обозначен словаря страницы. Resources или наследуется, как описано в разделе 7.7.3.4 «Наследование атрибутов страницы», от некоторого узла-предка объекта страницы.

  • Для других потоков контента соответствующий писатель должен включить запись Resources в словарь потока, определяющую словарь ресурсов, который содержит все ресурсы, используемые этим потоком контента. Это должно применяться к потокам контента, которые определяют формы XObjects, шаблоны, шрифты Type 3 и аннотации.

  • В файлах PDF, написанных в соответствии с более ранними версиями PDF, запись Resources могла отсутствовать во всех формах XObjects и шрифтах Type 3, используемых на странице. Все ресурсы, на которые ссылаются эти формы и шрифты, должны быть унаследованы от словаря ресурсов страницы, на которой они используются. Эта конструкция устарела и не должна использоваться соответствующими авторами.

(раздел 7.8.3 — Словари ресурсов — ISO 32000-1)

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

person mkl    schedule 15.11.2016
comment
Вероятно, битый файл; цель моего проекта — взять PDF-файлы, которые были неправильно созданы Foxit, и изменить их, чтобы они правильно работали при отображении в Adobe Reader. В этом случае, возможно, мне придется написать анализатор текста с альтернативным внешним видом. - person sigil; 16.11.2016
comment
неправильно построено Foxit. Каким образом Foxit неправильно создает PDF-файлы? (Я еще не использовал его серьезно...) - person mkl; 16.11.2016
comment
Если будет подтверждено, что Foxit неправильно создает файлы PDF, может быть полезно отправить им отчет об ошибке. - person Amedee Van Gasse; 16.11.2016
comment
@mkl, в основном, PDF-файлы, созданные и отредактированные в определенных версиях Foxit, неправильно отображаются в Adobe Reader и Acrobat. В дополнение к проблеме со словарем ресурсов в моем OP иногда возникают расхождения между текстом потока внешнего вида и полем /Contents. Графические объекты изменяются в размерах. Все вопросы, связанные с iText, которые я публиковал за последние несколько месяцев, касаются этой проблемы; Я работаю над конвертером, который исправит эти ошибки в PDF-файлах, созданных Foxit, чтобы они корректно работали в Adobe. - person sigil; 17.11.2016
comment
@AmedeeVanGasse, мы сообщили им об этой проблеме. - person sigil; 17.11.2016
comment
А, спасибо. Некоторые различия в отображении некоторых аннотаций на самом деле допустимы, поскольку спецификация не определяет все детали, здесь Adobe Acrobat создает только один возможный внешний вид. Но, конечно, отсутствующие ресурсы или неправильные тексты — это не нормально. - person mkl; 17.11.2016