ocr многостраничный PDF в python - PullRequest
0 голосов
/ 17 июня 2020

Я использую pytesseract для распознавания текста на изображениях. У меня есть pdf-файл с выпиской на 3-4 страницы. Мне нужен способ конвертировать их в несколько изображений .jpg / .png и распознавать эти изображения одно за другим. На данный момент я конвертирую одну страницу в изображение, а затем запускаю

text=str(pytesseract.image_to_string(Image.open("imagename.jpg"),lang='eng'))

, после чего я использую регулярное выражение для извлечения информации и создания фрейма данных. Регулярное выражение logi c одинаково для всех страниц. Понятно, что если я могу читать файлы изображений в al oop, этот процесс можно автоматизировать для любого PDF-файла того же формата.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

PyMuPDF будет еще одним вариантом для oop файлов изображений. Вот как этого добиться:

import fitz
from PIL import Image
import pytesseract 

input_file = 'path/to/your/pdf/file'
pdf_file = input_file
fullText = ""

doc = fitz.open(pdf_file) # open pdf files using fitz bindings 
### ---- If you need to scale a scanned image --- ###
zoom = 1.2 # scale your pdf file by 120%
mat = fitz.Matrix(zoom, zoom)
noOfPages = doc.pageCount 

for pageNo in range(noOfPages):
    page = doc.loadPage(pageNo) # number of pages
    pix = page.getPixmap(matrix = mat) # if you need to scale a scanned image
    output = '/path/to/save/image/files' + str(pageNo) + '.jpg'
    pix.writePNG(output) # skip this if you don't need to render a page

    text = str(((pytesseract.image_to_string(Image.open(output)))))
    fullText += text

fullText = fullText.splitlines() # or do something here to extract information using regex

Это очень удобно, в зависимости от того, как вы хотите поступать с файлами pdf. Для получения более подробной информации о PyMuPDF эти ссылки могут быть полезны: учебник по PyMuPDF и git для PyMuPDF

Надеюсь, это поможет.

EDIT Другой более простой способ сделать это с помощью PyMuPDF - напрямую интерпретировать обратно преобразованный текст, если у вас чистый формат файлов PDF, после page = doc.loadPage(pageNo) просто выполните следующие действия: достаточно:

blocks = page.getText("blocks")
blocks.sort(key=lambda block: block[3])  # sort by 'y1' values

for block in blocks:
    print(block[4])  # print the lines of this block

Отказ от ответственности: Вышеупомянутая идея использования blocks исходила от сопровождающего репо. Более подробную информацию можно найти здесь: обсуждение вопросов git

0 голосов
/ 17 июня 2020

Для меня работает следующее

from wand.api import library
from wand.image import Image
with Image(filename=r"imagepath.pdf", resolution=300) as img:


    library.MagickResetIterator(img.wand)
    for idx in range(library.MagickGetNumberImages(img.wand)):
        library.MagickSetIteratorIndex(img.wand, idx)

    img.save(filename="output.tiff")

Теперь проблема заключается в том, чтобы прочитать каждую страницу в файле tiff, потому что, если я извлекаю как

text=str(pytesseract.image_to_string(Image.open("test.tiff"),lang='eng'))

, он будет распознавать только первую страница

...