在没有非 python 依赖项的情况下将 PDF 转换为图像
Converting PDF to Image without non-python dependencies
我想创建一个可以部署到其他计算机上的 exe。该程序需要能够读取 pdf 并将它们转换为图像,但我不希望其他用户必须下载依赖项。
我的理解是py2image和wand都需要外部依赖,如果你转成exe,其他用户也需要自己下载依赖。
是否有其他可用的选项/解决方法?
实际上,我花了一些时间来处理这个问题,但我认为这是值得的。
您需要仔细执行所有步骤才能使其正常工作。
- 安装 pdf2image 和
pip install pdf2image
。
- 获取 poppler windows 个二进制文件。
- 创建一个新目录,如
myproject
。
- 在
myproject
中创建脚本 converter.py
并添加以下代码。
- 在
myproject
中创建另一个目录并将其命名为 poppler
.
- 将下载的poppler 二进制文件夹中的所有文件复制到
poppler
目录中。尝试测试 pdfimages.exe
是否有效。
- 使用
pyinstaller converter.py -F --add-data "./poppler/*;./poppler" --noupx
- 您的可执行文件现已准备就绪。 运行 喜欢
converter.exe myfile.pdf
。结果将在可执行文件旁边的 output
目录中创建。
- 现在您的独立 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
.
增加更多设置
我在尝试使用 pyinstaller 使用 pyqt5 和 pdf2file 模块制作 .exe 文件时遇到了同样的问题。
如果需要添加在 PyQt5 中创建的 GUI,请不要在 pyinstaller 命令中添加 --windowed。这毁了我 2 天的工作
我找不到解决方案,显然无论如何都需要 PDF 渲染器。最轻量级的解决方案是 https://pymupdf.readthedocs.io/en/latest/intro.html. It is still a python binding for a PDF renderer (https://www.mupdf.com/),但您可以通过以下方式安装它,包括它的依赖项:
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 许可证,所以请记住这一点。
我想创建一个可以部署到其他计算机上的 exe。该程序需要能够读取 pdf 并将它们转换为图像,但我不希望其他用户必须下载依赖项。
我的理解是py2image和wand都需要外部依赖,如果你转成exe,其他用户也需要自己下载依赖。
是否有其他可用的选项/解决方法?
实际上,我花了一些时间来处理这个问题,但我认为这是值得的。 您需要仔细执行所有步骤才能使其正常工作。
- 安装 pdf2image 和
pip install pdf2image
。 - 获取 poppler windows 个二进制文件。
- 创建一个新目录,如
myproject
。 - 在
myproject
中创建脚本converter.py
并添加以下代码。 - 在
myproject
中创建另一个目录并将其命名为poppler
. - 将下载的poppler 二进制文件夹中的所有文件复制到
poppler
目录中。尝试测试pdfimages.exe
是否有效。 - 使用
pyinstaller converter.py -F --add-data "./poppler/*;./poppler" --noupx
- 您的可执行文件现已准备就绪。 运行 喜欢
converter.exe myfile.pdf
。结果将在可执行文件旁边的output
目录中创建。 - 现在您的独立 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
.
我在尝试使用 pyinstaller 使用 pyqt5 和 pdf2file 模块制作 .exe 文件时遇到了同样的问题。 如果需要添加在 PyQt5 中创建的 GUI,请不要在 pyinstaller 命令中添加 --windowed。这毁了我 2 天的工作
我找不到解决方案,显然无论如何都需要 PDF 渲染器。最轻量级的解决方案是 https://pymupdf.readthedocs.io/en/latest/intro.html. It is still a python binding for a PDF renderer (https://www.mupdf.com/),但您可以通过以下方式安装它,包括它的依赖项:
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 许可证,所以请记住这一点。