将 pdf 图像转换为 jpg 图像的最快方法是什么?

Sah*_*iya 2 python text-extraction imagemagick ghostscript pdf2image

我正在尝试将多个 pdf(10k +)转换为 jpg 图像并从中提取文本。我目前正在使用pdf2imagepython 库,但它相当慢,有没有比这更快/最快的库?

from pdf2image import convert_from_bytes
images = convert_from_bytes(open(path,"rb").read())
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是 ubantu 18.04
CPU:4 核 8 线程(ryzen 3 3100)
内存:8 GB

jcu*_*itt 6

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")
Run Code Online (Sandbox Code Playgroud)

通过这个测试文档,我看到:

$ /usr/bin/time -f %M:%e ./pdf.py nipguide.pdf 
1991624:4.80
Run Code Online (Sandbox Code Playgroud)

2GB 内存和 4.8 秒的运行时间。

你可以在 pyvips 中将其写为:

$ /usr/bin/time -f %M:%e ./pdf.py nipguide.pdf 
1991624:4.80
Run Code Online (Sandbox Code Playgroud)

我懂了:

$ /usr/bin/time -f %M:%e ./vpdf.py nipguide.pdf[dpi=200]
676436:2.57
Run Code Online (Sandbox Code Playgroud)

670MB 内存和 2.6 秒运行时间。

它们都在幕后使用 poppler,但 pyvips 直接调用库而不是使用进程和临时文件,并且可以重叠加载和保存。

您可以将 pyvips 配置为使用 pdfium 而不是 poppler,尽管这需要更多工作,因为许多发行版仍未打包 pdfium。对于某些 PDF,pdfium 可能比 poppler 快 3 倍。

您可以使用多重处理来进一步提高速度。这对于 pyvips 来说效果更好,因为内存使用量较低,而且它不使用巨大的临时文件。

如果我修改 pyvips 代码以仅渲染单个页面,我可以使用gnu 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
Run Code Online (Sandbox Code Playgroud)

150dpi 下的 100 页只需 1.8 秒。