2015-06-13 2 views
3

Недавно я написал программу на Python, которая позволяла мне читать в PDF, выполнять некоторые команды от пользователя и выводить часть или весь исходный PDF-файл со страниц в разных порядках. Вы также можете выбрать страницы, которые вас интересовали. В то время для этого была отличная библиотека, PyPDF2. Он сделал все тяжелый подъем.PDF Parsing - Извлечение одной страницы

Теперь я работаю на другом языке (Haskell), который практически не поддерживает PDF, который я могу найти. Я рассматриваю возможность создания собственной личной библиотеки. Однако при просмотре содержимого файла PDF мне сложно определить, где находятся определенные страницы. Я могу сказать, сколько всего страниц в файле есть, но я не могу посмотреть на определенную часть файла и сказать: «Это страница X of Y.» Итак, как я могу выделить контент на основе страниц? Как я могу разделить файл на основе страниц, если я не знаю, на каком содержимом страницы?

+0

Что вы хотите, чтобы ваш инструмент для этого не выполнял pdftk? –

+0

* Я не могу посмотреть на определенную часть файла и сказать: «Это страница X of Y.» * - это сложно, так как большинство ресурсов, даже потоки контента, могут совместно использоваться несколькими страницами. Единственное, что принадлежит только странице, это словарь ** Page **. – mkl

+0

Daniel - У меня есть программа, которая возьмет файл PDF с карточками и вернет новый PDF-файл с разделами, указанными пользователем, и где карточки будут рандомизированы. –

ответ

1

Первое, что вам нужно, это копия спецификации PDF. Вы можете скачать это бесплатно с сайта Adobe здесь: http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf

В этом документе смотрите раздел 7.7.3, в котором объясняется, как работает «Дерево страниц».

В принципе, файл PDF содержит дерево (Adobe предполагает, что это должно быть сбалансированное дерево, но вы не обязаны этого делать), начиная с объекта «Страницы», необязательно содержащего несколько объектов промежуточного уровня и заканчивающихся объектами «Страница». Например:

Pages 
. Pages 
    . Page (1) 
    . Page (2) 
    . Page (3) 
. Pages 
    . Pages 
    . Page (4) 
    . Page (5) 
    . Pages 
    . Page (6) 
    . Page (7) 

Количество уровней в этом дереве не ограничено. Чтобы найти заданную страницу, вам нужно пройти дерево от начала до конца, назначая номера страниц, когда вы найдете листовые объекты «Страница». В приведенном выше примере я указал, на какой странице будут отображаться эти объекты (начиная с индекса страницы 1).

Как только у вас есть объект страницы, вы можете использовать его (и потенциально его родителей), чтобы найти, какие ресурсы вам нужны для этой страницы. Посмотрите еще раз в спецификации PDF для словаря «Ресурсы» и подумайте о наследовании.

Смежные вопросы