разбор pdf-файла с кликабельной страницей содержимого

Допустим, у нас есть pdf-файл с кликабельной страницей содержимого. (Я говорю о главах и подразделах). Как этот определенный файл может быть проанализирован на С# и как приложение может понять, есть ли в читаемом PDF-файле главы/содержимое или нет?

Это ссылка на PDF-файл без интерактивного оглавления https://docs.google.com/open?id=0B1EbI-EMJxmkODE1Mm5WbFpEdXc Мне не удалось найти pdf-файл с интерактивным оглавлением, но я нашел руководство о том, как это сделать, здесь http://everythingyoumightneed.blogspot.com/2013/01/how-to-create-pdf-with-clickable-links.html

Итак, мой вопрос: как приложение может различать, что есть что, и как можно анализировать приложение с интерактивными ссылками?


person John Demetriou    schedule 30.12.2012    source источник
comment
iTextSharp — одна из многих библиотек PDF, которую вы можете использовать для анализа PDF. Но что вы считаете PDF без главы или содержания, каковы ваши критерии?   -  person mkl    schedule 31.12.2012
comment
@mkl Хорошо, что я знаю о двух стилях PDF. Один с интерактивными главами содержимого, а другой - простой текст (который может включать страницу содержимого, но не интерактивен). Мне нужен способ определить, есть ли кликабельное содержимое или нет, и как анализировать это содержимое   -  person John Demetriou    schedule 31.12.2012
comment
Возможно, вам следует предоставить образцы документов для обоих случаев. Однако, как первая догадка, я думаю, вы имеете в виду либо наброски, либо аннотации. Оба могут быть легко проверены на использование iTextSharp или любой другой серьезной библиотеки PDF.   -  person mkl    schedule 31.12.2012
comment
Куда загрузить файл, чтобы поделиться им здесь?   -  person John Demetriou    schedule 01.01.2013
comment
Переполнение стека предлагает только загрузку изображений, поэтому вам нужно использовать другую службу обмена файлами. Пожалуйста, не выбирайте тот, который требует регистрации от загрузчиков.   -  person mkl    schedule 01.01.2013
comment
@mkl добавил ссылки на исходный вопрос   -  person John Demetriou    schedule 02.01.2013
comment
Кажется, мне не разрешен доступ к документу googledocs. Однако указанное вами руководство, по-видимому, указывает на то, что вы действительно говорите об аннотациях ссылок, а не об общих чертах. Проверить, есть ли в файле какие-либо аннотации ссылок, довольно просто, вы просто перебираете аннотации всех страниц и проверяете, являются ли какие-либо из них аннотациями ссылок с местами назначения. Но тогда вы еще не знаете, находятся ли эти ссылки в списке содержания или нет. Можете ли вы быть уверены, что все имеющиеся ссылки находятся только в списках содержимого? Если нет, то как можно различить оглавления в документах?   -  person mkl    schedule 02.01.2013
comment
pdf, к которому у вас нет доступа (не знаю почему, может быть, это временная штука, anws) - это простой pdf, теперь о аннотациях ссылок, которые вы говорите (я не знаю разницы между схемами), это то, что я говорю о я думаю. Вот сделка. Я создаю приложение, которое анализирует файлы PDF. Я хочу, чтобы он работал со всеми типами PDF так, как они должны быть. Например, если у них есть интерактивная таблица содержимого, я хочу, чтобы она оставалась прежней.   -  person John Demetriou    schedule 02.01.2013
comment
Ну, вообще-то я бы предложил вам работать над вашим проектом шаг за шагом. Первый шаг — разбор текста. Второй шаг — интерпретация аннотаций, то есть интерактивных функций, таких как ссылки и формы. Вам нужно только запомнить позиции текста на первом этапе, чтобы сопоставить текст и аннотации на втором этапе.   -  person mkl    schedule 03.01.2013
comment
Это действительно хорошая идея   -  person John Demetriou    schedule 03.01.2013


Ответы (2)


Ваша проблема не отличается от попытки выяснить, где находятся абзацы и столбцы в файлах PDF; PDF обычно не помечает страницу содержания как таковую. Так что даже с библиотекой PDF (такой как iTextSharp указал mkl) это не будет тривиальной задачей.

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

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

Есть две вещи, которые могут помочь (если они доступны):

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

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

Имейте в виду, что обе эти функции являются необязательными и не стандартизируются, если они присутствуют.

person David van Driessche    schedule 31.12.2012
comment
Хорошо, что я знаю о двух стилях PDF. Один с интерактивными главами содержимого, а другой - простой текст (который может включать страницу содержимого, но не интерактивен). Мне нужен способ определить, есть ли кликабельное содержимое или нет, и как анализировать это содержимое. Я думаю, вы уже определили это, но, пожалуйста, будьте более информативны, так как я нуб и мне нужна дополнительная помощь. - person John Demetriou; 31.12.2012

Поскольку PDF является двоичным форматом, вам придется использовать pdf-библиотеку, например pdflib, для чтения pdf-файлов.

библиотека pdf

также вы можете проверить этот сайт CodeProject для некоторых примеров Преобразование PDF в текст на C#

person MethodMan    schedule 30.12.2012
comment
это копия из другого ответа, мне нужно что-то более конкретное (возможно, ваш ответ, но мне также нужно какое-то объяснение) - person John Demetriou; 31.12.2012