PDF-файлы - это формат, который выбирают в академических кругах, но извлечь информацию, которую они содержат, досадно сложно.
Я только начал работать над выпускным проектом, который получил диплом. Академический проект требует большого количества исследований, что означает чтение большого количества статей.
Статьи обычно доступны только в одной форме - PDF.
Хотя PDF в настоящее время является настолько повсеместным форматом, что можно гарантировать возможность отображения его так, как задумано авторами, это не приятный формат, как я узнал, как только мне нужно было что-то сделать. с этим.
В ходе своего исследования я использовал аннотации основных моментов PDF, чтобы выделить части статьи, которые особенно интересны.
Я хотел иметь возможность получить выделенный текст позже, поэтому я этого не сделал. Придется снова открыть газету, чтобы найти части, которые мне показались интересными, когда я прочитал ее в первый раз.
Вы могли подумать, что экспорт аннотаций к тексту - это то, на что способны все программы чтения PDF-файлов, которые поддерживают аннотации (большинство из них поддерживают). Я имею в виду, конечно, это достаточно просто, даже если есть так много причин, по которым вы хотели бы это сделать.
Увы, ни одна из тех, что я обнаружил в Linux, не имела этой функции, поэтому я попытался написать что-нибудь, чтобы делать то, что мне нужно.
Я основал свой проект на инструменте, который я нашел в ответе на вопрос StackOverflow, похожем на мой.
Код Python в ответе использует poppler-qt4 для экспорта аннотированного текста из PDF. К сожалению, это Python2, и p ython poppler-qt4 package все равно не установился бы в моей системе должным образом, даже после установки пакета poppler-qt4.
Как и привязки Python poppler-qt5.
Убежденный, что могу справиться лучше, чем сценарий Python 2, который зависит от пакета, который последний раз обновлялся в 2015 году, я перевел ответ в эквивалент на C ++.
Я начал с попытки использовать poppler-cpp, привязки C ++ для poppler, где есть объекты и пространства имен, и никакой болтовни, связанной с фреймворками GUI, которые мне здесь не нужны. Однако, к моему разочарованию, poppler-cpp вообще не поддерживает аннотации. По какой-то причине поддержка аннотаций работает только с привязками к среде графического интерфейса пользователя, такой как glib или QT.
Поэтому вместо этого я использовал poppler-glib (то есть glib из проекта GNOME). Просто потому, что я использую GNOME, поэтому мне не нужно устанавливать ничего лишнего.
Формат PDF действительно странный. Аннотации кажутся пережитком формата, который будет добавлен позже.
Конкретно выделение - это странно, потому что аннотация выделения не имеет связи с текстом документа.
Таким образом, poppler_annot_get_contents (PopplerAnnot *), который должен возвращать содержимое аннотации, ничего не возвращает.
Вместо этого, чтобы получить текст, связанный с аннотацией выделения, нужно получить координаты аннотации выделения (A PopplerRectangle ), а затем используйте функцию poppler_page_get_text_for_area (PopplerPage *, PopplerRectangle *), которая возвращает текст в определенной области.
Какой совершенно непонятный способ реализовать выделение. Прикрепление его как чисто визуального элемента, а не фактическая разметка текста.
Еще больше сбивает с толку тот факт, что, хотя мое приложение работает, оно работает только в основном.
Иногда я выделяю весь текст, иногда он обрезает символы, а иногда добавляет вещи, которые ' нигде рядом с выделенным текстом!
Это проблема, которую мне еще предстоит решить, и я, возможно, никогда не решу, потому что это нелепо, а инструмент в основном делает то, что мне нужно.
В заключение; Формат PDF странный, я кое-что написал.
Если вы его используете, дайте мне знать, как это происходит!