Я хотел бы извлечь текст из части (используя координаты) PDF, используя Ghostscript.
Может кто-нибудь мне помочь?
Я хотел бы извлечь текст из части (используя координаты) PDF, используя Ghostscript.
Может кто-нибудь мне помочь?
Да, с помощью Ghostscript вы можете извлекать текст из PDF файлов. Но нет, это не лучший инструмент для работы. И нет, вы не можете сделать это "порциями" (частями отдельных страниц). Что вы можете сделать: извлечь текст только из определенного диапазона страниц.
txtwrite
устройство вывода (не очень хорошо) gs \
-dBATCH \
-dNOPAUSE \
-sDEVICE=txtwrite \
-dFirstPage=3 \
-dLastPage=5 \
-sOutputFile=- \
/path/to/your/pdf
Это выведет весь текст, содержащийся на страницах 3-5, в стандартный вывод. Если вы хотите выводить текстовый файл, используйте
-sOutputFile=textfilename.txt
gs
Обновление:
В последних версиях Ghostscript были улучшены устройства txtwrite
и исправлены ошибки. Подробнее см. последние изменения в Ghostscript (поиск txtwrite на этой странице).
ps2ascii.ps
Утилита PostScript (лучше)Для этого требуется загрузить последнюю версию файла ps2ascii.ps из хранилища исходного кода Ghostscript Git. Вам нужно будет конвертировать PDF в PostScript, а затем выполнить эту команду для файла PS:
gs \
-q \
-dNODISPLAY \
-P- \
-dSAFER \
-dDELAYBIND \
-dWRITESYSTEMDICT \
-dSIMPLE \
/path/to/ps2ascii.ps \
input.ps \
-c quit
Если параметр -dSIMPLE
не определен, каждая выходная строка содержит некоторую дополнительную информацию, помимо чистого текста, о используемых шрифтах и размере шрифта.
Если вы замените этот параметр на -dCOMPLEX
, вы получите дополнительную информацию об используемых цветах и изображениях.
Прочтите комментарии внутри ps2ascii.ps, чтобы узнать больше об этой утилите. Это не удобно для использования, но для меня это работало, в большинстве случаев мне это было нужно....
pdftotext
Утилита CLI (удобнее, чем Ghostscript)Более удобный способ извлечения текста: используйте pdftotext
(доступно для Windows, а также для Linux/Unix или Mac OS X). Эта утилита основана на Poppler или XPDF. Вы можете попробовать эту команду:
pdftotext \
-f 13 \
-l 17 \
-layout \
-opw supersecret \
-upw secret \
-eol unix \
-nopgbrk \
/path/to/your/pdf
- |less
Это отобразит диапазон страниц от 13 (f первая страница) до 17 (l ast page), сохранит макет защищенного двойным паролем именованного файла PDF (используя пользователя и пароль владельца (секретный и суперсекретный), с соглашением Unix EOL, но без вставки разрывов страниц между страницами PDF, пропущенных через меньше...
pdftotext -h
отображает все доступные параметры командной строки.
Конечно, оба инструмента работают только для текстовых частей PDF файлов (если они есть). Да, и математическая формула также не будет работать слишком хорошо... ;-)
pdftotext
Обновление:
В последних версиях Poppler pdftotext
теперь есть опции для извлечения "части (с использованием координат) страниц PDF", как и запрашивал OP. Параметры:
-x <int>
: координата x верхнего левого угла области обрезки-y <int>
: координата Y левого верхнего угла области обрезки-W <int>
: ширина области обрезки в пикселях (по умолчанию 0)-H <int>
: высота области обрезки в пикселях (по умолчанию 0)Лучше всего, если используется с параметром -layout
.
mutool draw
также может извлекать текстКроссплатформенное приложение MuPDF с открытым исходным кодом (разработанное той же компанией, которая также разрабатывает Ghostscript) включает инструмент командной строки mutool
. Чтобы извлечь текст из PDF файла с помощью этого инструмента, используйте:
mutool draw -F txt the.pdf
отправит извлеченный текст в <stdout>
. Используйте -o filename.txt
, чтобы записать его в файл.
TET, набор инструментов для извлечения текста из семейства продуктов pdflib, может найти координату x-y текстового содержимого в файле PDF (и многое другое). TET имеет интерфейс командной строки, и это самый мощный из всех инструментов извлечения текста, которые я знаю. (Он даже может обрабатывать лигатуры...) Цитата с их сайта:
Геометрия
TET предоставляет точные метрики для текста, такие как положение на странице, ширина глифа и направление текста. Определенные области на странице могут быть исключены или включены в извлечение текста, например, игнорировать верхние и нижние колонтитулы или поля.
По моему опыту, хотя он и не обладает самым простым интерфейсом CLI, который вы можете себе представить: после того, как вы к нему привыкли, он будет делать то, что обещает, для большинства PDF файлов вы к нему клоните...
И есть еще больше вариантов:
podofotxtextract
(инструмент CLI) из проекта PoDoFo (с открытым исходным кодом)calibre
(обычно программа с графическим интерфейсом для работы с электронными книгами, с открытым исходным кодом) имеет параметр командной строки, который может извлекать текст из PDF файловAbiWord
(текстовый процессор с графическим интерфейсом, с открытым исходным кодом) может импортировать PDF файлы и сохранять свои файлы в формате .txt: abiword --to=txt --to-name=output.txt input.pdf
Я не уверен, что GhostScript может принимать координаты, но вы можете преобразовать PDF в изображение и отправить его на движок OCR либо в виде подкадра, обрезанного из заданных координат, либо как целое изображение вместе с координатами. Некоторые OCR API принимают параметр прямоугольника для сужения области для OCR.
Посмотрите VietOCR для рабочего примера, в котором используется Tesseract в качестве механизма OCR и GhostScript в качестве конвертера PDF-to-image.
Debenu Quick PDF Library может извлекать текст из определенной области на странице. Функция SetTextExtractionArea позволяет указать координаты x и y, а затем вы также можете указать ширину и высоту области.
Затем функцию GetPageText можно вызвать сразу же после этого, чтобы извлечь текст из этой определенной области.
Вот пример использования С# (хотя библиотека является многоплатформенной и может использоваться со многими различными языками программирования):
DPL.LoadFromFile(@"Sample.pdf", "");
DPL.SetOrigin(1); // Sets 0,0 coordinate position to top left of page, default is bottom left
DPL.SetTextExtractionArea(35, 35, 229, 30); // Left, Top, Width, Height
string ExtractedContent = DPL.GetPageText(8);
Console.WriteLine(ExtractedContent);
Используя GetPageText, можно также вернуть только текст, расположенный в этой области, или текст, расположенный в этой области, а также информацию о текстовом шрифте, таком как имя, цвет и размер.