ImageMagick & PyPDF2 Crash Python при совместном использовании - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть PDF-файл, содержащий около 20-25 страниц.Цель этого инструмента - разделить файл PDF на страницы (используя PyPdf2), сохранить каждую страницу PDF в каталоге (используя PyPdf2), преобразовать страницы PDF в изображения (используя ImageMagick), а затем выполнить некоторое распознавание над ними с помощью tesseract (используя PIL и PyOCR) для извлечения данных.Инструмент в конечном итоге станет графическим интерфейсом через 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, но ошибки не фиксируются.Также я использую последнюю версию всех библиотек.Любая помощь или руководство приветствуется.

Спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

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

...