2013-06-04 3 views
0

Я пытаюсь сделать некоторую файловую резьбу на диске с помощью C++. Я не могу найти какие-либо ресурсы в Интернете, связанные с дисковой структурой PDF-файла. Дело в том, что я могу найти токен% PDF-1.x в начале кластера, но я не могу найти размер файла PDF в любом месте.Разбор удаленных pdf-файлов

Предположим, гипотетически, что запись в файловой системе для данного документа потеряна. Я нахожу начало документа, и я продолжаю читать, пока не наткнулся на «startxref номер %% EOF». Дело в том, что я не знаю, когда остановиться, поскольку в содержании документа есть несколько маркеров «%% EOF».

Я попытался прекратить чтение, скажем, 10 кластеров и не найти какое-либо конкретное ключевое слово в формате PDF, например «obj», «stream», «trailer», «xref». Но это довольно произвольно, и это не детерминированный метод поиска конца документа, поэтому я могу определить его размер.

Я также видел некоторые «длины номер» маркеры в начале некоторых «объектов», но число не очень подходит в большинстве случаев.

Любые идеи о том, что я могу попробовать дальше? Есть ли способ определить точный размер всего документа? Я заинтересован в программном восстановлении документов.

+0

Вы посмотрели ссылку на pdf? http://www.adobe.com/devnet/pdf/pdf_reference.html – PureW

+0

Да, я искал некоторые подсказки, но я не совсем прочитал его. Я делаю это сейчас, но я не уверен, что это поможет. Кроме того, меня интересуют все версии pdf, а не только 1.7. –

ответ

1

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

A stream имеет длину, которая является ключом к тому, куда идет endstream. (Пустая строка до и после самого потока). Потоки используются для ввода растровых изображений и подобных вещей [шрифтов, данных линейного искусства в сжатой форме и т. Д.] В документ). Но если у вас есть несколько сегментов размером 4 КБ, которые могут войти в один и тот же блок в середине потока, тогда нет способа сказать, в каком направлении они идут, кроме того, чтобы вставлять их вместе и видеть, какие из них выглядят здоровыми, а какие нет. Точно так же, если есть несколько сегментов потоков и объектов, вы не можете сказать, что происходит.

Конечно, это относится ко всем типам файлов с «переменным контентом» - вы можете найти первые несколько килобайт JPG, но зная, что такое REST of the, будет непросто - визуально проверяя содержимое, вы можете определить, какие блоки байтов принадлежат где - если вы ошибетесь, вы, вероятно, просто получите какой-то случайный мусор.

+0

Спасибо. Я попытаюсь сопоставить потоки как можно лучше, если длина потока будет соответствовать концу потока. Я бы предположил, что потоки близки друг к другу, верно? –

+1

Вы можете догадаться, что все зависит от фрагментации диска - и обратите внимание, что количество потоков в PDF может быть любым числом от 1 до бесконечности. Например, весь документ может быть одним или несколькими крупными растровыми изображениями! –

+0

О том, являются ли ресурсы, подобные растровым изображениям, полностью вставленными в содержимое документа? Я имею в виду, что растровое изображение имеет поле с приблизительным размером файла. Возможно, я могу использовать это как дополнительную проверку для потоков.До сих пор я смотрел, возможно, 20 PDF-версий с версии 1.3 до 1.5, и они, похоже, имеют 2 пары startxref и %% EOF. Один в начале и один в конце. Возможно, я могу использовать последний как определенный конец. –

1

Инструмент с открытым исходным кодом bulk_extractor имеет модуль под названием scan_pdf, который в значительной степени описывает то, что вы здесь описываете. Он может распознавать отдельные части PDF-файла на диске, автоматически распаковывать сжатые области и извлекать текст, используя две стратегии. Он восстановит данные из фрагментов PDF-файлов, даже если таблица xref не найдена.

+0

Спасибо. Я посмотрю. –