Как извлечь текст из PDF в скрипте на Linux?

Вопрос или проблема

На Linux – как извлечь текст из файла .pdf, где текст действительно является текстом, а не отсканированным изображением?
Мне нужно что-то, что я могу использовать в командной строке / в скрипте, а не в интерактивном режиме.
(Я не хочу конвертировать в .tif и использовать OCR – текст уже доступен в файле .pdf, так зачем вводить неточности из-за несовершенного OCR?)

pdftotext из poppler попытается извлечь любой текст, найденный в PDF.

Ответ Игнасио вполне подходящий. На самом деле, это было бы первой строчкой в моем списке. Что ж, и возможно, я бы предложил инструмент pdftohtml, который также поставляется с poppler, совместно с pdfreflow, если вы хотите попытаться заново собрать текст в абзацы и т.д. (Конечно, это даст вам выходные данные в формате HTML, но конвертацию HTML в простой текст можно выполнить разными способами.)

Вот еще несколько вариантов.

Командная строка ebook-convert из Calibre, которая может конвертировать .PDF в простой текст (или RTF или ряд форматов электронных книг, таких как ePub и т.д.)

pdftxtextract из Podofo

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

abiword --to=txt file.pdf

(По справедливости, я думаю, что AbiWord и calibre оба используют библиотеки poppler, но я не уверен.)

Сравнение того, как методы обрабатывают абзацы/разрывы строк

Одна из проблем с pdftotext из poppler-utils 22.12.0, упомянутая Игнасио, заключается в том, что она добавляет переводы строк внутри абзацев, когда абзац длиннее ширины страницы PDF, например, что-то вроде:

1:1 В начале Бог сотворил небо и
землю.
1:2 Земля же была безвидна и пуста; и
тьма была над бездною, и
Дух Божий носился над водами.
1:3 И сказал Бог: да будет свет. И стал
свет.
1:4 И увидел Бог свет, что он хорош, и
отделил Бог свет от тьмы.

Эти лишние переводы строк делают txt файлы действительно неудобными для чтения на устройстве вроде Kindle.

Однако я обнаружил, что ebook-convert упомянутый frabjous очень хорошо справляется с этой задачей, использование:

sudo apt install calibre
ebook-convert book.pdf book.txt

и производит что-то вроде:

1:1 В начале Бог сотворил небо и землю.

1:2 Земля же была безвидна и пуста; и тьма была над бездною, и Дух Божий носился над водами.

1:3 И сказал Бог: да будет свет. И стал свет.

1:4 И увидел Бог свет, что он хорош, и отделил Бог свет от тьмы.

что сохраняет абзацы в одной строке, вне зависимости от длины абзаца, и добавляет двойной перевод строки между абзацами, и на Kindle ведет себя гораздо лучше.

Я собираюсь протестировать методы, упомянутые в других ответах, с этим тестовым PDF, созданным из этого файла .odt Libreoffice:

Выходные данные pdftotext:

Название моего файла
Оглавление
H1 1......................................................................................................................................................1
H2 1 1...............................................................................................................................................1
H2 1 2...............................................................................................................................................1
H1 2......................................................................................................................................................1
H2 2 1...............................................................................................................................................1
H2 2 2...............................................................................................................................................1

H1 1
H2 1 1
H2 1 2
Первый очень важный абзац.
А теперь очень длинный абзац, который разбивается на две строки.
Ссылка на H1 1 на странице: 1
https://commons.wikimedia.org/wiki/File:Fractal_Broccoli.jpg

H1 2
H2 2 1
H2 2 2

Выходные данные ebook-convert:

Название моего файла

Оглавление

H1 1......................................................................................................................................................1

H2 1 1...............................................................................................................................................1

H2 1 2...............................................................................................................................................1

H1 2......................................................................................................................................................1

H2 2 1...............................................................................................................................................1

H2 2 2...............................................................................................................................................1

H1 1

H2 1 1

H2 1 2

Первый очень важный абзац.

А теперь очень длинный абзац, который разбивается на две строки.

Ссылка на H1 1 на странице: 1

https://commons.wikimedia.org/wiki/File:Fractal_Broccoli.jpg

H1 2

H2 2 1

H2 2 2





Оглавление документа


H1 1 H2 1 1

H2 1 2





H1 2 H2 2 1

H2 2 2

Аспект разрыва строки также был спрошен более конкретно здесь: https://unix.stackexchange.com/questions/691579/how-to-convert-pdf-file-to-text-without-breaking-lines

Тестировалось на Ubuntu 23.04, poppler-utils 22.12.0, calibre 6.11.0.

MarkItDown от Microsoft

https://github.com/microsoft/markitdown

Этот инструмент с открытым исходным кодом на Python конвертирует множество форматов в Markdown, посмотрим, как он это делает. На Ubuntu 24.10 я установил MarkItDown 0.0.1a3 с помощью:

pipx install markitdown

затем:

markitdown odt-libreoffice-7.5.5.2.pdf

производит:

Название моего файла

Оглавление
H1 1.....................................................................................................................................................1
H2 1 1...............................................................................................................................................1
H2 1 2...............................................................................................................................................1
H1 2......................................................................................................................................................1
H2 2 1...............................................................................................................................................1
H2 2 2...............................................................................................................................................1

H1 1

H2 1 1

H2 1 2
Первый очень важный абзац.

А теперь очень длинный абзац, который разбивается на две строки.

Ссылка на H1 1 на странице: 1

https://commons.wikimedia.org/wiki/File:Fractal_Broccoli.jpg

H1 2

H2 2 1

H2 2 2

так что работает, но с некоторыми недостатками:

  • заголовки не отмечены как заголовки в markdown
  • длинный абзац просто разбит, как видно в тексте. Не так плохо, так как это допустимо в Markdown, но не слишком умно.

В дополнение к pdftotext и pdftohtml вы можете объединить их с pandoc для конвертации pdf в другие форматы, такие как markdown

mdpdf () {
    pdftohtml -s -stdout "${@}" |
        pandoc -f html -t markdown -o "${1%.pdf}".md ;
}

Другие ответы предлагают множество возможных решений, но не может быть единственного идеального ответа, если только вы не попробуете одни для одного типа PDF, а другие для другого типа.

Одним из простых способов сравнить скрытый слой плоского текста доступности в PDF является использование любой функции TTS или экспорта “Read Aloud”.

Adobe не разрабатывал PDF для извлечения текста, но позволил использовать доступный текст
введите описание изображения здесь

Поэтому мы можем использовать текст вопроса для сравнения. Вот мнение Adobe о содержимом PDF, сгенерированном SKIA для доступности, которое показывает некоторые проблемы с конверсией основного текста PDF.

Некоторый текст не имеет возвратов строки, некоторые имеют слишком много, а для некоторых слова соединены (все это совершенно естественные методы внутреннего PDF).

ОБРАТИТЕ ВНИМАНИЕ: как данный, так и предложенный ниже вариант, также имеют некоторые отсутствующие или опасные ! менее обычные выделенные тексты !

Как извлечь текст из pdf в скрипте на Linux?

Спрашивал 14 лет, 1 месяц назадИзменено сегодняПросмотрено 53k раз54
На Linux - Как извлечь текст из .pdf, где текст действительно является текстом, а не отсканированным изображением? Я хочу что-то, что можно использовать в командной строке / в скрипте, а не в интерактивном режиме. (Я не хочу конвертировать в .tif и использовать OCR - текст уже доступен в .pdf файле, так зачем вводить неточности из-за несовершенного OCR?)

linux
pdf
скрипт
экспорт


ПоделитьсяРедактироватьСледоватьОтметитьредактировалось 26 апр. 2018 в 17:48аватар пользователя chicks
chicks580спрашивал 5 нояб. 2010 в 19:30аватар пользователя RobM
RobM541
похожие вопросы на askubuntu– Trevor Boyd Smith1 мая 2018 в 12:18

Таким образом, для любого удобочитаемого вывода лучшие PDF удобные ТЕКСТ таким образом “по макету”, где как пробелы, так и переводы строк инжектируются для имитации страницы, как она видится.

Другие упомянули старейший хорошо зрелый xpdf (и производные poppler) pdftotext, но есть много других, для простого (или более сложного HTML) перемещения содержимого страницы.

Я предлагаю взглянуть на более новые предложения с длинной историей кроссплатформенной конверсии, таким образом, здесь одно из многих от MuPDF (Artifex долгое время поставляет код для Adobe) Это экспорт как совместимый с ePub XHTML.

введите описание изображения здесь

Для более простого подхода вы можете использовать их другое долгосрочное решение GhostScript.
gs -sDEVICE=txtwrite -oout.txt -f in.pdf

введите описание изображения здесь

.

Ответ или решение

Извлечение текста из PDF на Linux с помощью скрипта: Подробное руководство

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

1. pdftotext из библиотеки poppler

Популярным инструментом для извлечения текста является pdftotext, входящий в состав пакета poppler-utils. Он позволяет извлекать текст из PDF-документов без потери качества. Инструкция по использованию:

sudo apt install poppler-utils
pdftotext input.pdf output.txt

Плюсы: Простота использования и высокая скорость.

Минусы: Вставка дополнительных переносов строк, особенно для длинных абзацев.

2. Calibre и ebook-convert

Инструмент ebook-convert из набора Calibre предлагает более гибкую конвертацию, сохраняя структуру абзацев:

sudo apt install calibre
ebook-convert input.pdf output.txt

Плюсы: Поддерживает множество форматов и правильно обрабатывает длинные абзацы.

3. AbiWord для командной строки

AbiWord — это текстовый редактор, который может конвертировать PDF в текст:

abiword --to=txt input.pdf

Плюсы: Использует плагины для расширения возможностей.

Минусы: Может требовать дополнительных зависимостей.

4. Использование MuPDF и GhostScript

Для более гибкой структуры страницы можно использовать MuPDF:

mupdfdraw -F xhtml input.pdf > output.xhtml

Для простого извлечения текста можно использовать GhostScript:

gs -sDEVICE=txtwrite -o output.txt -f input.pdf

Плюсы: Высокое качество конверсии с MuPDF; GhostScript поддерживает много форматов.

Минусы: Требует знания дополнительных флагов команд.

Оптимизация для SEO и профессионализм

При написании скрипта важно учесть профессиональные стандарты, учитывая автоматизацию задач в Linux. Обеспечьте читаемость кода и докуменатции, чтобы ваши решения были легкодоступны для других пользователей.

Сравните различные методы и выберите тот, который лучше всего соответствует вашим конкретным требованиям к PDF-файлу. И помните, что, хотя нету "идеального" решения для всех типов PDF, оптимальные инструменты могут значительно упростить ваш процесс извлечения текста.

Оцените материал
Добавить комментарий

Капча загружается...