Невозможно успешно выполнить следующий скрипт - PullRequest
0 голосов
/ 24 июня 2018

Я написал скрипт, использующий python в сочетании с PyPDF2, PIL и pytesseract для извлечения текста с первой страницы the scanned pages файла pdf.Однако, когда я попробовал приведенный ниже скрипт, чтобы получить содержимое из first scanned page из этого pdf файла, он выдает следующую ошибку, когда достигает строки, содержащей img = Image.open(pdfReader.getPage(0)).convert('L').

Скрипт, который я пробовал такдалеко:

import PyPDF2
import pytesseract
from PIL import Image

pdfFileObj = open(r'C:\Users\WCS\Desktop\Scan project\Scanned.pdf', 'rb')

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
img = Image.open(pdfReader.getPage(0)).convert('L')
imagetext = pytesseract.image_to_string(img)
print(imagetext)
pdfFileObj.close()

У меня ошибка:

Traceback (most recent call last):
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python36-32\SO.py", line 8, in <module>
    img = Image.open(pdfReader.getPage(0)).convert('L')
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\Image.py", line 2554, in open
    fp = io.BytesIO(fp.read())
AttributeError: 'PageObject' object has no attribute 'read'

Как я могу сделать это успешно?

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Вы не можете прочитать ():

pdfReader.getPage(0)

потому что это не изображение. Из документации мы имеем, что:


GetPage (PageNumber)

Извлекает страницу по номеру из этого файла PDF.

Параметры: pageNumber (int) - Номер страницы, которую нужно получить (страницы начинаются с нуля)

Возвращает : PageObject экземпляр.

Тип возвращаемого значения: PageObject


Итак, для того, чтобы что-то с этим сделать, вам нужно прочитать документацию по этим классам:

extractText ()

Найдите все команды рисования текста в порядке их предоставления в потоке контента и извлеките текст. Это хорошо работает для некоторых файлов PDF, но плохо для других, в зависимости от используемого генератора. Это будет уточнено в будущем. Не полагайтесь на порядок текста, выходящего из этой функции, так как он изменится, если эта функция будет сделана более сложной.

Возвращает: строковый объект Unicode.

PageObject Doc


Подведение итогов

pdfFileObj = open(r'C:\Users\WCS\Desktop\Scan project\Scanned.pdf', 'rb')

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
txt = (pdfReader.getPage(0)).extractText()

pdfFileObj.close()

print(txt)

Если вы хотите, чтобы изображение было так плохо, посмотрите на ответ @TarunLalwani, который является более точным.

0 голосов
/ 24 июня 2018

Ваша проблема в том, что вы хотите, чтобы PIL прочитал PageObject, определенный как pypdf, что неверно. Вы должны конвертировать pdf в формат изображения, а затем использовать PIL, чтобы прочитать его. В этом случае, wand, вероятно, то, что вам нужно. см. Домашнюю страницу . Вот пример для сохранения всех страниц в формате PDF в формате jpg:

from wand.image import Image as WImage
with WImage(filename=your_pdf_path, resolution=(300,300)) as imgs:
    imgs.format = 'jpg'
    page_idx = 0
    for img in imgs.sequence:
        WImage(image=img).save(str(page_idx)+'.jpg')

Теперь вы можете проверить API, упомянутые выше, и решить вашу проблему.

0 голосов
/ 27 июня 2018

Вам нужно сначала преобразовать pdf в изображение, а затем сделать это

Python: извлечь страницу из pdf в формате jpeg

import PyPDF2
import pytesseract
from PIL import Image
from pdf2image import convert_from_path

pdfFileObj = r'C:\Users\WCS\Desktop\Scan project\Scanned.pdf'
pages = convert_from_path(pdfFileObj, 500)

page = pages[0]
page.save('out.png')

img = Image.open('out.png').convert('L')
imagetext = pytesseract.image_to_string(img)
print(imagetext)
pdfFileObj.close()
0 голосов
/ 24 июня 2018

img = Image.open(pdfReader.getPage(0), 'r').convert('L')

...