pdftoppm和pdftocairo命令行工具的包装器,用于将PDF转换为PIL Image列表。
项目描述
pdf2image
一个Python (3.7+) 模块,用于包装pdftoppm和pdftocairo以将PDF转换为PIL Image对象
如何安装
pip install pdf2image
Windows
Windows用户必须构建或下载Windows的poppler。我推荐使用 @oschwartz10612 版本,这是最新的。然后您需要将 bin/
文件夹添加到 PATH,或在 convert_from_path
中使用 poppler_path = r"C:\path\to\poppler-xx\bin" as an argument
。
Mac
Mac用户需要安装 poppler。
使用 Brew 安装
brew install poppler
Linux
大多数发行版都自带 pdftoppm
和 pdftocairo
。如果未安装,请参考您的包管理器安装 poppler-utils
平台无关性(使用 conda
)
- 安装poppler:
conda install -c conda-forge poppler
- 安装pdf2image:
pip install pdf2image
它是如何工作的?
from pdf2image import convert_from_path, convert_from_bytes
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError
)
然后只需这样做
images = convert_from_path('/home/belval/example.pdf')
或者
images = convert_from_bytes(open('/home/belval/example.pdf', 'rb').read())
或者更好的是
import tempfile
with tempfile.TemporaryDirectory() as path:
images_from_path = convert_from_path('/home/belval/example.pdf', output_folder=path)
# Do something here
images
将是一个包含PDF文档每页的PIL Image对象的列表。
以下是定义
convert_from_path(pdf_path, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', jpegopt=None, thread_count=1, userpw=None, use_cropbox=False, strict=False, transparent=False, single_file=False, output_file=str(uuid.uuid4()), poppler_path=None, grayscale=False, size=None, paths_only=False, use_pdftocairo=False, timeout=600, hide_attributes=False)
convert_from_bytes(pdf_file, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', jpegopt=None, thread_count=1, userpw=None, use_cropbox=False, strict=False, transparent=False, single_file=False, output_file=str(uuid.uuid4()), poppler_path=None, grayscale=False, size=None, paths_only=False, use_pdftocairo=False, timeout=600, hide_attributes=False)
有什么新功能?
- 允许用户在使用pdftoppm时隐藏属性(感谢@StaticRocket)
- 修复了在Windows上打开控制台的问题(感谢@OhMyAgnes!)
- 添加了
timeout
参数,在给定秒数后引发PDFPopplerTimeoutError
。 - 添加了
use_pdftocairo
参数,强制pdf2image
使用pdftocairo
。应该会提高性能。 - 修复了一个在使用多个线程的
pdf2image
(但不是多个进程)时引发异常的bug jpegopt
参数允许在fmt="jpeg"
时调整输出JPEG(pdftoppm CLI中的-jpegopt
)(感谢@abieler)pdfinfo_from_path
和pdfinfo_from_bytes
,它们公开了pdfinfo CLI的输出paths_only
参数将返回图像路径而不是Image对象,以防止在转换大PDF时出现内存不足size
参数允许您定义结果的图像形状(pdftoppm CLI中的-scale-to
)size=400
将图像适应到400x400的框中,保持宽高比size=(400, None)
将图像宽度调整为400像素,保持宽高比size=(500, 500)
将图像大小调整为500x500像素,不保持宽高比
grayscale
参数允许您将图像转换为灰度(pdftoppm CLI中的-gray
)single_file
参数允许您仅转换第一个PDF页面,而不在output_file
的末尾添加数字- 允许用户通过
poppler_path
指定poppler的安装路径
性能提示
- 如果使用SSD,使用输出文件夹会显著提高速度。否则,i/o通常会变成瓶颈。
- 使用多个线程可以带来一些收益,但避免超过4个,因为这会导致i/o瓶颈(即使在NVMe SSD上!)
- 如果i/o是瓶颈,使用JPEG格式可以带来显著收益。
- PNG格式相当慢,这是因为压缩。
- 如果您想了解最佳设置(大多数设置都很好),可以克隆项目并运行
python tests.py
以获取时间
限制/已知问题
- 相对较大的PDF将耗尽您的内存并导致进程被终止(除非使用输出文件夹)
- 有时DocuSign签名PDF读取失败,请参阅DocuSign问题解决方案。
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。