提问人:Sahil Lohiya 提问时间:8/25/2022 最后编辑:Mark SetchellSahil Lohiya 更新时间:11/18/2023 访问量:4277
将PDF转换为JPG图像的最快方法是什么?[关闭]
what is fastest way to convert pdf to jpg image? [closed]
问:
我正在尝试将多个pdf(10k +)转换为jpg图像并从中提取文本。我目前正在使用 python 库,但它很慢,有没有比这更快/最快的库?pdf2image
from pdf2image import convert_from_bytes
images = convert_from_bytes(open(path,"rb").read())
注意:我正在使用 ubantu 18.04
CPU:4 核 8 线程 (ryzen 3 3100)
内存:8 GB
答:
请尝试以下操作
- pypdfium2
- 使用 python , https://blog.alivate.com.au/poppler-windows/
subprocess
使用转换器,速度通常与文件大小和复杂性有关,因为每次运行内容都需要重新构建。对于可能需要不同解决方案的 PDF(您自己不生成),但是您引用的系统需要几个步骤,因此“最快”是核心机器代码二进制文件,通常是 cli 版本,没有任何较慢的包装应用程序。
粗略的经验法则是,每分钟 100 x 150dpi png 页面是合理的,因此 10 分钟前刚刚开始的运行刚刚完成了 947 页(例如,每秒 1.578 页或每页 0.6336 秒)。
在最近的一次压力测试中,使用单个复杂页面(在套件上与您的套件没有太大区别),分辨率是最大的因素,因此 1 个复杂图表页面需要 1.6 到 14+ 秒(取决于输出分辨率),而使用多线程仅将其减少到 12 秒 https://stackoverflow.com/a/73060439/10802527
Pdf2image 是围绕 pdfimages、pdftotext 和 pdftoppm 构建的,而不是 jpg,我建议使用 Pdf,因为结果应该更清晰,因此更快、更精简的输出看起来不错。poppler
pdftoppm -png
Imagemagick 没有 GhostScript 就无法转换,也无法输出文本,因此快速路由核心是 .还要考虑/与姊妹应用程序进行比较,它具有图像和文本输出、多线程和条带。Artifex GhostScript
MuPDF (Mutool)
Chrome/Edge/Chromium 和 Foxit/Skia 解决方案的核心是 PDFium 二进制文件,可以在不同平台上以各种形式找到。
我的工具包在 150 dpi 的大文件中遇到了一些困难
poppler/pdftoppm -f 1 -l 100 -png = 100 pages from 13,234 us-public-health-and-welfare-code.pdf
or similar speed
pdftocairo -f 1 -l 100 -png -r 150 us-public-health-and-welfare-code.pdf time/out
The current time is: 17:17:17
The current time is: 17:18:08
100 pages as png = 51 seconds
每分钟 100+ 页(比大多数高速打印机更好,但仅一个文件就超过 2 小时)
PDFium 通过 cli exe 的 100 页大约需要 30 秒,但分辨率需要 exif 设置,因此需要第二次通过,但是让我们慷慨地说,
每分钟大约 200 页(估计总共 1 小时 6 分钟)
xpdf pdftopng with settings for 150dpi x 100 from 13234pages.pdf
The current time is: 17:25:27
The current time is: 17:25:42
100 pages as png = 15 seconds
每分钟 400 页(预计总计 33 分钟)
MuTool convert -o time/out%d.png -O resolution=150 x 100 from 13234pages.pdf
The current time is: 17:38:14
The current time is: 17:38:25
100 pages as png = 11 seconds
每分钟 545 页(预计总时长 24.3 分钟)
这可以做得更好
mutool draw -st -P -T 4 -B 2048 -r 150 -F png -o ./time/out%d.png 13234pages.pdf 1-100
total 5076ms (0ms layout) / 100 pages for an average of 50ms
每分钟 1,182 页(预计总时长 11.2 分钟)
请注意 @jcupitt 的评论
我尝试了时间并行 mutool 转换 -A 8 -o page-%d.png -O resolution=150 us-public-health-and-welfare-code.pdf {}-{} ::: {1..100},它是 100 毫秒内 600 页。如果使用 pgm,则为 300 毫秒 (!!)。
这将是每分钟 10,000 或 20,000 页(估计总共 0.66-1.32 分钟)
还有其他好的库可以在同一时间范围内以同样快的速度渲染,但由于通常它们需要一个核心 GPU/CPU/内存/字体等,因此在一台设备上,多个并行进程通常会失败。一个看起来适合任务的应用程序在仅 2 页后就因内存失败而倒下。
如果您必须使用一台设备,您可以尝试在“并行”中单独调用,但是在本机窗口中,当对总线或支持文件的需求存在冲突时,我的尝试似乎总是被资源上的文件锁定所挫败。
多处理的唯一可靠方法是在并行设备中批量处理顺序文件集,因此可以升级到跨多个真正的“CPU/GPU”及其专用驱动器进行耕种。
请注意这个开发人员的比较,他们中最好的三个是
- MuPDF 2) Xpdf 3) PDFium(他们的选择(如上所述)具有更宽松的许可证)
评论
parallel pdftoppm us-public-health-and-welfare-code.pdf -png xxx -f {} -l {} ::: {1..100}
pdftoppm us-public-health-and-welfare-code.pdf -png xxx -f 1 -l 100
,即。100 dpi 的 150 页,是 44 秒的经过时间,所以离你的一个线程时间不远了。这台 PC 有 16 个内核 32 个线程,我看到并行速度提高了 18 倍。你可以试试 WSL2 -- 它包括并行,并且具有快速的光盘 IO。
time parallel mutool convert -A 8 -o page-%d.png -O resolution=150 us-public-health-and-welfare-code.pdf {}-{} ::: {1..100}
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")
通过此测试文档,我看到:
$ /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")
明白了:
$ /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 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
所以 100 秒内以 150dpi 的速度打印 1.8 页。
评论
在我的基准测试中,通常比 快 2 倍。但是,可能比光栅 pdf 页面快 2 倍,在数字页面上慢 20%fitz
pdf2image
pdfium2
fitz
评论
mutool convert -o page-1.txt my-pdf-file.pdf 1-1