Как 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.
Спасибо за внимание!
ссылка на оригинал статьи https://habrahabr.ru/post/314274/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *