pyvips https://pypi.org/project/pyvips/比 pdf2image 快一点。我做了一个小基准:
#!/usr/bin/python3
import sys
from pdf2image import convert_from_bytes
images = convert_from_bytes(open(sys.argv[1], "rb").read())
for i in range(len(images)):
images[i].save(f"page-{i}.jpg")
With 这个测试文档 http://www.rollthepotato.net/%7Ejohn/nipguide.pdf I see:
$ /usr/bin/time -f %M:%e ./pdf.py nipguide.pdf
1991624:4.80
2GB 内存和 4.8 秒的运行时间。
你可以在 pyvips 中将其写为:
#!/usr/bin/python3
import sys
import pyvips
image = pyvips.Image.new_from_file(sys.argv[1])
for i in range(image.get('n-pages')):
image = pyvips.Image.new_from_file(filename, page=i)
image.write_to_file(f"page-{i}.jpg")
I see:
$ /usr/bin/time -f %M:%e ./vpdf.py nipguide.pdf[dpi=200]
676436:2.57
670MB 内存和 2.6 秒运行时间。
它们都在幕后使用 poppler,但 pyvips 直接调用库而不是使用进程和临时文件,并且可以重叠加载和保存。
您可以将 pyvips 配置为使用 pdfium 而不是 poppler,尽管这需要更多工作,因为许多发行版仍未打包 pdfium。对于某些 PDF,pdfium 可能比 poppler 快 3 倍。
您可以使用多重处理来进一步提高速度。这对于 pyvips 来说效果更好,因为内存使用量较低,而且它不使用巨大的临时文件。
如果我修改 pyvips 代码以仅呈现单个页面,我可以使用gnu并行 https://www.gnu.org/software/parallel/在单独的进程中渲染每个页面:
$ time parallel ../vpdf.py us-public-health-and-welfare-code.pdf[dpi=150] ::: {1..100}
real 0m1.846s
user 0m38.200s
sys 0m6.371s
150dpi 下的 100 页只需 1.8 秒。