Я хотел бы извлечь текст из отсканированных PDF-файлов.
Мой «тестовый» код выглядит следующим образом:
from pdf2image import convert_from_path
from pytesseract import image_to_string
from PIL import Image
converted_scan = convert_from_path('test.pdf', 500)
for i in converted_scan:
i.save('scan_image.png', 'png')
text = image_to_string(Image.open('scan_image.png'))
with open('scan_text_output.txt', 'w') as outfile:
outfile.write(text.replace('\n\n', '\n'))
Я хотел бы знать, есть ли способ извлечь содержимое изображение непосредственно с объекта converted_scan
, без сохранения сканирования в виде нового «физического» файла изображения на диске?
По сути, я хотел бы пропустить эту часть:
for i in converted_scan:
i.save('scan_image.png', 'png')
У меня есть несколько тысяч сканов для извлечения текста. Хотя все сгенерированные новые файлы изображений не являются особенно тяжелыми, это не является незначительным, и я нахожу это немного излишним.
РЕДАКТИРОВАТЬ
Вот немного другой подход, основанный на этот пост .
from wand.image import Image as w_img
from PIL import Image as p_img
import pyocr.builders
import pyocr
import io
infile = 'my_file.pdf'
tool = pyocr.get_available_tools()[0]
lang = tool.get_available_languages()[0]
print("Language used: '%s'" % (lang))
# image to text
req_image = []
text = []
image_pdf = w_img(filename = infile, resolution = 300)
image_png = image_pdf.convert('png')
for img in image_png.sequence:
img_page = w_img(image = img)
req_image.append(img_page.make_blob('png'))
for i in req_image:
content = tool.image_to_string(
p_img.open(io.BytesIO(i)),
lang = lang,
builder = pyocr.builders.TextBuilder()
)
text.append(content)
# save output
with open(infile[:-4] + '.txt', 'w') as outfile:
full_txt = '\n'.join(text)
full_txt = full_txt.replace(r'\n\n', '\n')
outfile.write(full_txt)