Як перетворити 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 ukr"
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 uk %1 > %1-res.txt

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

Був використаний Python 3.5 і PyCharm.
Спасибі за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.