[Из песочницы] Как pdf преобразовать в текстовый txt-файл

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

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

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


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

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

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


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

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

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-файл содержал изображения не очень хорошего качества, поэтому в тексте получилась масса оЧЕпЯток. Поэтому появился следующий этап.

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


Воспользуемся программой LanguageTool. Нас интересует работа в командной строке, поэтому скачиваем «независимую версию». Для работы с 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.
Спасибо за внимание!

Комментарии (0)

© Habrahabr.ru