首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python从PDF中提取所有图像,并保持其透明性

用Python从PDF中提取所有图像,并保持其透明性
EN

Stack Overflow用户
提问于 2022-07-30 17:03:16
回答 1查看 265关注 0票数 1

我在网上和这里看到了许多解决方案,用于用PyMuPDF、PyPDF2和其他工具从PDF中提取图像,但它们都没有成功地保留透明度信息,它们使用的是过时的代码,不再起作用,或者问题没有答案。我尝试的例子显示了一个黑色的背景,其中的透明度应该是。如果我打开photoshop中的PDF并取出图像,它就像我所期望的那样是透明的背景。所以我知道信息就在那里。有谁用Python做过这样的例子吗?

下面是一个包含解决方案的post示例,它可以提取图像,但它们都转换为错误的文件格式,或者保存为png,但缺少透明的方面。

Extract images from PDF without resampling, in python?

EN

回答 1

Stack Overflow用户

发布于 2022-07-30 22:25:18

PDF图片并不像你所期望的那样。因此,让我们拿一个样本,但所有的插入可以不同的操作(否则将不需要不同的提取应用程序)。PDF不是为了回顾性的分裂而设计的,许多对象被简化为墨粉油墨,以便在通常的白皮书上进行转移,因此透明度是事后考虑的,需要第四个版本(%PDF-1.4++)。

这里是一个文件,没有其他任何东西,似乎是一个单一的透明图像。注意,它说它的对象19,但没有其他东西!

让我们用poppler实用程序来查询文件中的内容,因为大多数python库都依赖于它或GhostScript。

代码语言:javascript
复制
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

代码语言:javascript
复制
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 )时解释了许多不同的图形问题。

代码语言:javascript
复制
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>>   

事实上,有几处提到了面具!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73177586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档