Вы скажете, что самый простой способ — выделить весь текст в pdf, скопировать его в буфер обмена и вставить из буфера обмена в текстовый файл. И будете правы. Но это не наш случай. Файл pdf — результат сканирования многостраничного документа. Т.е. содержимое pdf — это изображения текста.
Предлагаемый вариант решения реализован под 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()
На этом можно было бы закончить, т.к. в основном текст получился вполне читабельным, но местами в тексте образовалась масса оЧЕпЯток.
Например, картинка с текстом
преобразовалась в нечто такое:
управление процессом моделирования, в том числе посредствомвременного прерывания, промежуточного сохранения и повторного запускапроцесса моделирования из приостановленного состояния, задания различныхначальных условий, введа отказов бортовых систем, метеоусловий, временисуток, различных возмущающих факторов (ветер, турбулентность и др.);
Поэтому появился следующий этап.
Исправление ошибок в тексте
Воспользуемся программой 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.
Спасибо за внимание!
Автор: Yanovets