【问题标题】:Converting PDF to Image without non-python dependencies在没有非 python 依赖的情况下将 PDF 转换为图像
【发布时间】:2019-10-18 12:17:23
【问题描述】:

我想创建一个可以部署到其他计算机上的 exe。该程序需要能够读取 pdf 并将它们转换为图像,但我不希望其他用户必须下载依赖项。

我的理解是py2image和wand都需要外部依赖,如果你转换成exe,其他用户也需要自己下载依赖。

还有其他可用的选项/解决方法吗?

【问题讨论】:

  • 您是否正在尝试创建一个程序来将 PDF 转换为图像?如果是,“不使用 python 依赖项”是什么意思?
  • 这将是该计划的一部分,是的。我不想使用 imagemagick 或 poppler 之类的东西,因为当我将程序部署为 exe 时,其他用户需要安装这些程序。
  • 从工作的 py 脚本创建可执行文件与不为脚本使用外部依赖项完全不同。我认为你必须使用一个外部包来为你处理这项工作,然后你可以简单地将它打包到一个可执行文件中以在没有任何依赖关系的情况下运行。这是你想要的吗?
  • 是的,这就是我想要的。如果我要下载/使用 imagemagick,您知道如何使用 pyinstaller/其他方法将其包含到可执行文件中吗?

标签: python pdf pyinstaller wand


【解决方案1】:

实际上,我花了一些时间来处理这个问题,但我认为这是值得的。 您需要仔细执行所有步骤才能使其正常工作。

  1. 安装pdf2image 和pip install pdf2image。
  2. 获取poppler windows 二进制文件。
  3. 创建一个新目录,例如myproject。
  4. 在myproject 内创建一个脚本converter.py 并添加以下代码。
  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:如果你喜欢,可以加个GUI,为pdf2images添加更多设置。

【讨论】:

  • 你太棒了,谢谢你的帮助。这将成为更广泛的应用程序的一部分,我还没有开始应用程序的这一部分,但是当我到达那里时,我会对此进行测试。谢谢!
  • 我在 conda 环境中运行,我完全迷失了我应该如何--add-data conda-installed poppler 到命令。
  • 这需要poppler,并且问题明确要求非python依赖,所以我不确定为什么这个答案在这里。
  • @EmiliaApostolova 如果您不确定,请阅读有关问题的 cmets。
【解决方案2】:

我在尝试使用 pyinstaller 使用 pyqt5 和 pdf2file 模块制作 .exe 文件时遇到了同样的问题。 如果您需要添加在 PyQt5 中创建的 GUI,请不要在 pyinstaller 命令中添加 --windowed。这毁了我两天的工作

【讨论】:

    【解决方案3】:

    我无法找到解决方案,显然无论如何都需要 PDF 渲染器。最轻量级的解决方案是https://pymupdf.readthedocs.io/en/latest/intro.html。它仍然是 PDF 渲染器 (https://www.mupdf.com/) 的 python 绑定,但您可以通过以下方式安装它,包括它的依赖项:

    pip install PyMuPDF
    

    无需安装 poppler 或 imagemagick。

    然后您可以将pdf转换为图像,如下所示:

    import fitz  
    
    doc = fitz.open(stream=your_pdf_file_stream, filetype="pdf")  
    for idx, page in enumerate(doc):  
        pix = page.get_pixmap(dpi=600) 
        the_page_bytes=pix.pil_tobytes(format="PNG")
        with open("page-%s.png"%idx, "wb") as outf:
            outf.write(the_page_bytes)
    

    很遗憾,mupdf 有一个 copyleft 许可证,所以请记住这一点。

    【讨论】:

    • ?不知道你的意思,它有一个 GNU 许可证(apache 不是 copyleft 许可证),而且如果你使用 python 轮子,你不需要安装任何 exes,通过“pip install PyMuPDF”。根据文档:Python 轮子适用于 Windows(32 位和 64 位)、Linux(64 位、英特尔和 ARM)和 Mac OSX(64 位,仅限英特尔)。
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多