将PDF转换为JPG图像的最快方法是什么?[关闭]

what is fastest way to convert pdf to jpg image? [closed]

提问人:Sahil Lohiya 提问时间:8/25/2022 最后编辑:Mark SetchellSahil Lohiya 更新时间:11/18/2023 访问量:4277

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

5天前关闭。

我正在尝试将多个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

python imagemagick ghostscript 文本提取 pdf2image

评论

0赞 Harsha Biyani 8/25/2022
请添加您尝试的代码。
0赞 Harsha Biyani 8/25/2022
您可以在其中添加多进程。
0赞 Sahil Lohiya 8/25/2022
添加了 Conde Snippet。@HarshaBiyani
1赞 xenoid 8/25/2022
如果它们是 PDF,您不能从中提取文本数据吗?或者它们实际上只是普通的图像?
2赞 jcupitt 8/27/2022
正如@xenoid所说,您可以将 PDF 转换为文本格式,例如。 将第一页转换为纯文本。它非常非常快,而且不需要 OCR。当然,如果您的 PDF 包含带有渲染文本的图形,它将不起作用。mutool convert -o page-1.txt my-pdf-file.pdf 1-1

答:

2赞 Jitesh 8/25/2022 #1

请尝试以下操作

  1. pypdfium2
  2. 使用 python , https://blog.alivate.com.au/poppler-windows/subprocess
1赞 K J 8/26/2022 #2

使用转换器,速度通常与文件大小和复杂性有关,因为每次运行内容都需要重新构建。对于可能需要不同解决方案的 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,因为结果应该更清晰,因此更快、更精简的输出看起来不错。popplerpdftoppm -png

Imagemagick 没有 GhostScript 就无法转换,也无法输出文本,因此快速路由核心是 .还要考虑/与姊妹应用程序进行比较,它具有图像和文本输出、多线程和条带。Artifex GhostScriptMuPDF (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”及其专用驱动器进行耕种。

请注意这个开发人员的比较,他们中最好的三个是

  1. MuPDF 2) Xpdf 3) PDFium(他们的选择(如上所述)具有更宽松的许可证)

评论

1赞 jcupitt 8/27/2022
并行对我有用,试试......2.4 页为 100 秒。使用 pyvips 和并行,我看到 1.8s。parallel pdftoppm us-public-health-and-welfare-code.pdf -png xxx -f {} -l {} ::: {1..100}
1赞 jcupitt 8/27/2022
pdftoppm us-public-health-and-welfare-code.pdf -png xxx -f 1 -l 100,即。100 dpi 的 150 页,是 44 秒的经过时间,所以离你的一个线程时间不远了。这台 PC 有 16 个内核 32 个线程,我看到并行速度提高了 18 倍。你可以试试 WSL2 -- 它包括并行,并且具有快速的光盘 IO。
1赞 jcupitt 8/27/2022
我是开发人员,呵呵。我试过了,它在 100 毫秒内写了 600 页。如果使用 pgm,则为 300 毫秒 (!!)。time parallel mutool convert -A 8 -o page-%d.png -O resolution=150 us-public-health-and-welfare-code.pdf {}-{} ::: {1..100}
6赞 jcupitt 8/26/2022 #3

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 页。

评论

0赞 mara004 5/24/2023
Pyvips非常有趣,谢谢你提到它。然而,根据我的经验,一般来说,pdfium 在 reandering 方面比 poppler 快得多(尽管它可能因 PDF 而异)。请注意,如果您只想使用 pdfium,那么还有 pypdfium2(免责声明:我是作者,但如果当时我知道 pyvips,我可能不会开始这个项目;))。
0赞 jcupitt 5/24/2023
哦,有意思。我还没有找到pdfium明显更快的文档,但也许我运气不好。pdfium 有一个更自由的许可证,我认为这是它真正获胜的领域。
0赞 mara004 5/24/2023
我现在没有环境(和时间)来做基准测试,但上次我这样做非常明显,实际上在我尝试过的大多数(如果不是全部)文档上。例如,我似乎记得使用 PDF 1.7 规范和 Cinelerra GG 手册作为测试参考。
0赞 mara004 5/24/2023
反正我只是测试了一下。在我的设备上,使用 pypdfium2 渲染 CinGG 手册需要 ~50 秒,而使用 pdftoppm 则需要 ~57 (+14%),以 300dpi(rsp. 比例 4.2)使用 jpeg 作为输出。不过,做一个不包括图像转换和磁盘输出的纯渲染基准测试会很有趣。
1赞 jcupitt 5/24/2023
我尝试过使用 cinelerra-gg.org/download/CinelerraGG_Manual.pdf,如果您从 poppler 切换到 pdfium,则在该文件上,pyvips 的速度提高了大约 3 倍,所以我同意这是一个非常好的改进。我编辑了我的答案以包含此信息,谢谢!
0赞 Demetry Pascal 11/18/2023 #4

在我的基准测试中,通常比 快 2 倍。但是,可能比光栅 pdf 页面快 2 倍,在数字页面上慢 20%fitzpdf2imagepdfium2fitz