ImageMagick и PyPDF2 Crash Python при совместном использовании

77
8

У меня есть PDF файл, содержащий около 20-25 страниц. Цель этого инструмента - разделить PDF файл на страницы (используя PyPdf2), сохранить каждую PDF-страницу в каталоге (используя PyPdf2), преобразовать PDF-страницы в изображения (используя ImageMagick), а затем выполнить некоторое распознавание текста с помощью tesseract ( используя PIL и PyOCR) для извлечения данных. Инструмент в конечном итоге станет GUI через tkinter, поэтому пользователи могут выполнять одну и ту же операцию много раз, нажимая на кнопку. Во время моего тяжелого тестирования я заметил, что если весь процесс повторяется примерно 6-7 раз, скрипт инструмента/сценария python вылетает, показывая, что он не отвечает в Windows. Я выполнил некоторую отладку, но, к сожалению, ошибки не возникло. Память и процессор хороши, поэтому никаких проблем нет. Я смог сузить проблему, заметив, что до достижения части тессеракта PyPDF2 и ImageMagick терпят неудачу, когда они работают вместе. Мне удалось воспроизвести проблему, упростив ее до следующего кода Python:

from wand.image import Image as Img
from PIL import Image as PIL
import pyocr
import pyocr.builders
import io, sys, os
from PyPDF2 import PdfFileWriter, PdfFileReader

def splitPDF (pdfPath):
#Read the PDF file that needs to be parsed.
pdfNumPages =0
with open(pdfPath, "rb") as pdfFile:
inputpdf = PdfFileReader(pdfFile)

#Iterate on every page of the PDF.
for i in range(inputpdf.numPages):
#Create the PDF Writer Object
output = PdfFileWriter()
output.addPage(inputpdf.getPage(i))
with open("tempPdf%s.pdf" %i, "wb") as outputStream:
output.write(outputStream)

#Get the number of pages that have been split.
pdfNumPages = inputpdf.numPages

return pdfNumPages

pdfPath = "Test.pdf"
for i in range(1,20):
print ("Run %s\n--------" %i)
#Split the PDF into Pages & Get PDF number of pages.
pdfNumPages = splitPDF (pdfPath)
print(pdfNumPages)
for i in range(pdfNumPages):
#Convert the split pdf page to image to run tesseract on it.
with Img(filename="tempPdf%s.pdf" %i, resolution=300) as pdfImg:
print("Processing Page %s" %i)

Я использовал оператор with для правильной обработки открытия и закрытия файлов, поэтому там не должно быть утечек памяти. Я попытался запустить разделение отдельно и преобразование изображений отдельно, и они работают нормально, когда запускаются в одиночку. Однако, когда коды объединяются, он будет повторяться после итерации примерно 5-6 раз. Я использовал блоки try и exception, но ошибки не фиксируются. Также я использую последнюю версию всех библиотек. Любая помощь или руководство приветствуется.

Спасибо.

спросил(а) 2019-02-03T19:33:00+03:00 1 год, 5 месяцев назад
1
Решение
93

Для дальнейшего использования проблема была связана с 32-битной версией ImageMagick, упомянутой в одном из комментариев (спасибо emcconville). Деинсталляция 32-битных версий Python и ImageMagick и установка обеих 64-битных версий устранили проблему. Надеюсь это поможет.

ответил(а) 2019-02-07T14:00:00+03:00 1 год, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема