我在网上和这里看到了许多解决方案,用于用PyMuPDF、PyPDF2和其他工具从PDF中提取图像,但它们都没有成功地保留透明度信息,它们使用的是过时的代码,不再起作用,或者问题没有答案。我尝试的例子显示了一个黑色的背景,其中的透明度应该是。如果我打开photoshop中的PDF并取出图像,它就像我所期望的那样是透明的背景。所以我知道信息就在那里。有谁用Python做过这样的例子吗?
下面是一个包含解决方案的post示例,它可以提取图像,但它们都转换为错误的文件格式,或者保存为png,但缺少透明的方面。
发布于 2022-07-30 22:25:18
PDF图片并不像你所期望的那样。因此,让我们拿一个样本,但所有的插入可以不同的操作(否则将不需要不同的提取应用程序)。PDF不是为了回顾性的分裂而设计的,许多对象被简化为墨粉油墨,以便在通常的白皮书上进行转移,因此透明度是事后考虑的,需要第四个版本(%PDF-1.4++)。
这里是一个文件,没有其他任何东西,似乎是一个单一的透明图像。注意,它说它的对象19,但没有其他东西!

让我们用poppler实用程序来查询文件中的内容,因为大多数python库都依赖于它或GhostScript。
Poppler\poppler-22.04.0\Library\bin>pdfimages -list tt.pdf
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 950 575 gray 1 8 image no 27 0 72 72 42.4K 7.9%
1 1 image 950 575 index 1 8 image no 19 0 72 72 2454B 0.4%
1 2 smask 950 575 gray 1 8 image no 19 0 72 72 42.4K 7.9%我们现在能看到的是3个图像,其中2个是数字19,所以现在我们看到了两个图像27和19,但是19也有一个覆盖(softMask)。
这是PDF不能将RGBA文件存储为一个对象的地方,但是它需要分割到RGB图像和灰色调以获得透明度。以下是在图形查看器中查看的2幅图像。许多库需要一些IMage库来将它们混合到一个PNG中。

另一个库是MuPDF
MuPDF\1.20.0-tesseract>mutool extract -a tt.pdf
extracting image-0019.png
extracting image-0020.png
extracting image-0027.png

因此,最简单的cli提取器是MuPDF,因此PyMuPDF应该能够导出类似的混合物。(但是,由于我使用的是单行程序,而没有python强加的开销,所以我无法确定在这种特定情况下所需的代码。)
附带注意,使用应该保持透明度的不同图像提取器提供了不同的内容视图,并提取了透明图像和较小的缩略图,这在查看生产者(Adobe )时解释了许多不同的图形问题。
pdfcpu_0.3.12>pdfcpu images list tt.pdf
pages: all
2 images available
page obj# id type width height colorspace comp bpc interp size filters
=========================================================================
1 19 Im0 smask 950 575 Indexed 3 8 2 KB FlateDecode
13 thumb 105 57 Indexed 3 8 171 ASCII85Decode,FlateDecode
<xmp:Thumbnails>
<rdf:Alt>
<rdf:li rdf:parseType="Resource">
<xmpGImg:width>256</xmpGImg:width>
<xmpGImg:height>156</xmpGImg:height>
<xmpGImg:format>JPEG</xmpGImg:format>
...
<photoshop:LayerText>Testing</photoshop:LayerText>
...
<rdf:li>Cyan</rdf:li>
<rdf:li>Magenta</rdf:li>
<rdf:li>Yellow</rdf:li>
<rdf:li>Black</rdf:li>
...
<</BC 23 0 R/G 24 0 R/S/Luminosity/Type/Mask>> 事实上,有几处提到了面具!
https://stackoverflow.com/questions/73177586
复制相似问题