Преобразование PDF в изображение без не-Python зависимостей - PullRequest
0 голосов
/ 03 июня 2019

Я хочу создать исполняемый файл, который можно развернуть на других компьютерах. Программа должна иметь возможность читать PDF-файлы и превращать их в изображения, но я не хочу, чтобы другие пользователи загружали зависимости.

Насколько я понимаю, py2image и wand требуют внешних зависимостей, которые, если вы преобразуете в исполняемый файл, другим пользователям также потребуется загрузить сами зависимости.

Есть ли другие варианты / обходные пути?

1 Ответ

1 голос
/ 03 июня 2019

На самом деле, мне понадобилось время, чтобы справиться с этим, но я думаю, что оно того стоит. Вы должны сделать все шаги тщательно, чтобы заставить его работать.

  1. Установить pdf2image с pip install pdf2image.
  2. Получить poppler бинарных файлов Windows.
  3. Создайте новый каталог, например myproject.
  4. Создайте скрипт converter.py внутри myproject и добавьте приведенный ниже код.
  5. Создайте другой каталог внутри myproject и назовите его poppler.
  6. Скопируйте все файлы в двоичной папке загруженного poppler в каталог poppler. Попробуйте проверить pdfimages.exe, работает ли он.
  7. Использование pyinstaller converter.py -F --add-data "./poppler/*;./poppler" --noupx
  8. Ваш исполняемый файл теперь готов. Запустите его как converter.exe myfile.pdf. Результаты будут созданы в каталоге output рядом с исполняемым файлом.
  9. Теперь ваше автономное PDF2IMAGE конвертер готово!

converter.py

import sys
import os
from pdf2image import convert_from_path


def current_path(dir_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, dir_path)
    return os.path.join(".", dir_path)


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("PASS your PDF file: \"converter.exe myfile.pdf\"")
        input()
        sys.exit(0)
    os.environ["PATH"] += os.pathsep + \
        os.pathsep.join([current_path("poppler")])

    if not os.path.isdir("./output"):
        os.makedirs("output")
    images = convert_from_path(sys.argv[-1], 500)
    for image, i in zip(images, (range(len(images)))):
        image.save('./output/out{}.png'.format(i), 'PNG')

PS: Если вам это нравится, вы можете добавить графический интерфейс и добавить дополнительные настройки для pdf2images.

...