使用 pdf2image 时,如何将 poppler 包含到 pyinstaller 生成的 exe 中?

问题描述

我制作了一个简单的脚本,可以将当前目录中的 pdf 文件转换为图像。我想把它做成一个独立的 .exe 文件,以便在他的电脑上没有安装 python 的人可以使用它。

问题在于 pyinstaller 未能将 poppler 包含到 exe 文件中,因此 pdf2image 无法正确运行并且构建的 exe 失败。这是错误消息:

pdf2image.exceptions.PDFInfonotinstalledError:无法获取页面 数数。 poppler 是否已安装并在 PATH 中? [32024] 执行失败 脚本bulk_pdf2img

我目前正在使用从 pyinstaller 命令安装了 pdf2imagepoppler 以及 conda install 的 conda 环境。当我从提示符执行 python 脚本时它工作得很好,但是当脚本转换为 exe 时,它​​会引发上述错误

我尝试了以下方法

1.添加--add-data选项

我尝试通过这样做来添加 poppler 数据。

$ pyinstaller --onedir --add-data="C:/Users/myusername/anaconda3/pkgs/poppler-0.89.0-h20e2fe3_4/Library/include/poppler/*;./poppler" bulk_pdf2img.py

不起作用。

2.添加additional-hooks-dir选项

添加projectdirectory/hooks/hook-pdf2image.py 具有

from PyInstaller.utils.hooks import collect_all

data,binaries,hiddenimports = collect_all('pdf2image')

进去就跑

$ pyinstaller --onefile --additional-hooks-dir=hooks bulk_pdf2img.py

也不起作用。

搜索了几乎所有 Stackoverflow 问题,这些问题显然与我的问题完全相同,但找不到任何有效的解决方案。我现在该怎么办?

解决方法

来自docs

然后您必须将 bin/ 文件夹添加到 PATH 或使用 poppler_path = r"C:\path\to\poppler-xx\bin" 作为 convert_from_path 中的参数。

现在,如果您使用 --onefilepyinstaller 选项,它会在执行期间将所有文件解压到一个临时文件夹中,您可能需要查看此 answer 和相关帖子,以获得正确的路径。

您可以执行以下任何操作

  • 在开头执行此操作,将 binpoppler 文件夹添加到 PATH

    os.environ["PATH"]+=os.pathsep+os.path.join('path/to/poppler','bin')
    
  • pdf2image.convert_from_path('path/to/pdf',poppler_path=r"path\to\poppler\bin") 
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...