Не удается загрузить PDF с помощью Wand / ImageMagick в облачной функции Google - PullRequest
0 голосов
/ 03 апреля 2019

Попытка загрузить PDF из локальной файловой системы и ошибка «не авторизован».

«Файл» /env/local/lib/python3.7/site-packages/wand/image.py ", строка 4896, в файле read self.raise_exception ()" /env/local/lib/python3.7 /site-packages/wand/resource.py ", строка 222, в повышение_подъема поднимите e wand.exceptions.PolicyError: не авторизовано` / tmp / tmp_iq12nws '@ error / constitute.c / ReadImage / 412

Файл PDF успешно сохранен на локальном «сервере» из GCS, но не загружается Wand. Загрузка изображений в OpenCV не проблема, просто происходит при попытке загрузить PDF с помощью Wand / ImageMagick

Код для загрузки PDF из GCS в локальную файловую систему в Wand / ImageMagick ниже

_, temp_local_filename = tempfile.mkstemp()
gcs_blob = STORAGE_CLIENT.bucket('XXXX').get_blob(results["storedLocation"])
gcs_blob.download_to_filename(temp_local_filename)
# load the pdf into a set of images using imagemagick
with(Image(filename=temp_local_filename, resolution=200)) as source:
    #run through pages and save images etc.

ImageMagick должен быть авторизован для доступа к файлам в локальной файловой системе, поэтому он должен загружать файл без проблем вместо этой ошибки «Не авторизовано».

1 Ответ

2 голосов
/ 03 апреля 2019

Чтение PDF с помощью ImageMagick было отключено из-за уязвимости безопасности Ghostscript имел .Проблема заключается в дизайне, и смягчение безопасности от команды ImageMagick будет существовать до.ImageMagick снова позволяет Ghostscript обрабатывать PDF-файлы и обновлять Google Cloud Functions до этой новой версии ImageMagick с включенной обработкой PDF.

Нет исправления проблемы ImageMagick / Wand в GCF, которую я мог бы найти, но как обходной путь дляПреобразование PDF-файлов в изображения в Google Cloud Functions позволяет использовать эту [оболочку ghostscript] [2], чтобы напрямую запросить преобразование PDF-файла в изображение с помощью Ghostscript и обойти ImageMagick / Wand.Затем вы можете загрузить PNG в ImageMagick или OpenCV без проблем.

needs.txt

google-cloud-storage
ghostscript==0.6

main.py

    # create a temp filename and save a local copy of pdf from GCS
    _, temp_local_filename = tempfile.mkstemp()
    gcs_blob = STORAGE_CLIENT.bucket('XXXX').get_blob(results["storedLocation"])
    gcs_blob.download_to_filename(temp_local_filename)
    # create a temp folder based on temp_local_filename
    temp_local_dir = tempfile.mkdtemp()
    # use ghostscript to export the pdf into pages as pngs in the temp dir
    args = [
        "pdf2png", # actual value doesn't matter
        "-dSAFER",
        "-sDEVICE=pngalpha",
        "-o", temp_local_dir+"page-%03d.png",
        "-r300", temp_local_filename
        ]
    # the above arguments have to be bytes, encode them
    encoding = locale.getpreferredencoding()
    args = [a.encode(encoding) for a in args]
    #run the request through ghostscript
    ghostscript.Ghostscript(*args)
    # read the files in the tmp dir and process the pngs individually
    for png_file_loc in glob.glob(temp_local_dir+"*.png"):
        # loop through the saved PNGs, load into OpenCV and do what you want
        cv_image = cv2.imread(png_file_loc, cv2.IMREAD_UNCHANGED)

Надеюсь, это поможет кому-то столкнуться с той же проблемой.

...