- PVSM.RU - https://www.pvsm.ru -

Как pdf (изображения) преобразовать в текстовый txt-файл

Вы скажете, что самый простой способ — выделить весь текст в pdf, скопировать его в буфер обмена и вставить из буфера обмена в текстовый файл. И будете правы. Но это не наш случай. Файл pdf — результат сканирования многостраничного документа. Т.е. содержимое pdf — это изображения текста.

image

Предлагаемый вариант решения реализован под Windows-8, но с небольшими корректировками, думаю, вполне может быть использован для Linux и OS X.

Преобразование всех страничек pdf в файлы изображений

Если бы страничек было 2-3, то можно было бы воспользоваться функцией PrintScreen. В Windows для этого есть отдельная кнопочка на клавиатуре. А в Mac OS X — хитрая комбинация клавиш: нужно нажать три клавиши Shift+Command+4, выбрать мышкой нужный участок экрана, и искать получившийся файл на рабочем столе. Но если страничек много, то нужно искать другой способ.

К счастью, есть программа StduViewer [1], которая позволяет это сделать. В меню Файл → Экспортировать → Как изображение. В появившемся окне выбираем тип PNG, разрешение 300 dpi, задаем путь, куда выложить получившиеся файлы изображений. В шаблоне имени сохраняемого файла стоит изменить %PN% на %0PN% для случая, если страничек больше 10.

Преобразование файлов изображений страничек в текст

HP разработала, а Google открыла исходные коды библиотек tesseract [2], преобразовывающих изображения в текст (OCR [3]). Устанавливаем программу tesseract-ocr [4].

В командной строке исполняем команды типа:

tesseract.exe image_01.png res_01.txt -l rus

Получаем текстовые файлы. Можно запустить команду для каждой странички вручную. Проще выполнить скрипт на python'е:

import os, sys
import io
sPathIn = "D:/Pictures/pict"
sPathOut = "D:/Pictures/txt"
sCmd = ""C:/Program Files (x86)/Tesseract-OCR/tesseract.exe" {} {} -l rus"
os.system("cd "C:/Program Files (x86)/Tesseract-OCR"")
dirs = os.listdir( sPathIn )
for file in dirs:
 filename, file_ext = os.path.splitext(file)
 sCmdRes = sCmd.format(sPathIn + '/' + file, sPathOut + '/' + filename + ".txt")
 print ("run> " + sCmdRes)
 os.system(sCmdRes)

Получилась кучка текстовых файлов, которые осталось объединить в один. Это можно сделать ручками. Но проще было написать скриптик на python'е:

import os, sys
import io
sPathIn = "D:/Pictures/txt"
sFileOut = "D:/Pictures/res.txt"
dirs = os.listdir( sPathIn )
for file in dirs:
 filename, file_ext = os.path.splitext(file)
 if (file_ext == ".txt"):
  fOut = open(sFileOut, "ab")
  f = open(sPathIn + "/" + file, "rb")
  data = f.read()
  fOut.write(data)
  f.close()
  fOut.close()

На этом можно было бы закончить, т.к. в основном текст получился вполне читабельным, но местами в тексте образовалась масса оЧЕпЯток.
Например, картинка с текстом
Как pdf (изображения) преобразовать в текстовый txt-файл - 2
преобразовалась в нечто такое:

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

Поэтому появился следующий этап.

Исправление ошибок в тексте

Воспользуемся программой LanguageTool [5]. Нас интересует работа в командной строке, поэтому скачиваем «независимую версию» [6]. Для работы с LanguageTool требуется Java.

Запускал из родного каталога (на Windows-8.1 оно почему-то не захотело работать, если текущий каталог — чужой) и указывал полные имена файлов (с каталогом). Если в командной строке выполнить команду, например, такую:

java -Dfile.encoding=UTF-8 -jar languagetool-commandline.jar --help

… то запустится дополнительная консолька, где честно напишет help и благополучно закроется в течение секунды. Чтобы видеть, чего же оно пишет в консоль, нужно запускать командный bat-файла с этой строкой внутри. Возможно, у java есть ещё какой-нить параметр командной строки, чтобы не запускалась доп. консоль, но мне сие неведомо.

Команда исправления ошибок в текстовом файле получилась такая:

java -Dfile.encoding=UTF-8 -jar languagetool-commandline.jar -a -l ru original.txt > corrected.txt

Чтобы отключить исправление маленьких букв на большие в начале строк появились дополнительные параметры --disablecategories CASING, а вместо имени файла — %1, чтобы имя передавать внутрь bat-файла в качестве аргумента. Итого, строка в bat-файле получилась такая:

java -Dfile.encoding=UTF-8 -jar languagetool-commandline.jar -a -u --disablecategories CASING -l ru %1 > %1-res.txt

По аргументу -u в конец исправленного текстового файла добавляется строка «Unknown words:» с перечислением через запятую всех слов, которые LanguageTool не знает. Таким образом, можно улучшить текст, исправив неправильные слова из этого списка.

Был использован Python 3.5 и PyCharm [7].
Спасибо за внимание!

Автор: Yanovets

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/205254

Ссылки в тексте:

[1] StduViewer: http://www.stduviewer.ru/

[2] tesseract: https://ru.wikipedia.org/wiki/Tesseract

[3] OCR: https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2

[4] tesseract-ocr: https://github.com/UB-Mannheim/tesseract/wiki

[5] LanguageTool: https://www.languagetool.org/ru/

[6] «независимую версию»: https://www.languagetool.org/download/LanguageTool-3.5.zip

[7] PyCharm: https://www.jetbrains.com/pycharm/

[8] Источник: https://habrahabr.ru/post/314274/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox