我想用C++从PDF文件中提取图片,但我不明白PDF文件中的图片格式,有人能帮助我吗?我看了看PDF文件的内容,用记事本打开它,我试图解压缩的内容,并未能extact图片
mbyulnm01#
要了解某些数据是如何以某种文件格式存储的,最好的方法通常是阅读规范。在手头的情况下,您应该阅读PDF规范ISO 32000,最好是当前的ISO 32000-2:2020,但对于初学者来说,旧的ISO 32000-1:2008也应该这样做。您可以在https://Adobe.com/go/pdfreference下载后者的免费副本同时,ISO 32000-2也是免费的; https://www.pdfa.org/announcing-no-cost-access-to-iso-32000-2-pdf-2-0/我假设“图片”是指位图图像,PDF规范称之为 * 采样图像 *。第8.9章我来处理
hxzsmxv22#
为了展示在PDF中渗透/排列图像的几十种方法中的一种,这里是我可以轻松编写的最小的工作示例。它有基本的9种颜色进行比较RGB CMY AWK
如果你的编辑器和微软记事本一样好,它应该像colours.pdf一样工作,但是粘贴在网上可能会损坏,所以下载在这里。Colours.pdf should work in most viewers只是没有显示为github页面(但稍后见)
%PDF-1.7%µ¶1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj2 0 obj <</Type/Pages/Count 1/Kids[3 0 R]>> endobj3 0 obj <</Type/Page/MediaBox[0 0 72 72]/Rotate 0/Resources 4 0 R/Contents 6 0 R/Parent 2 0 R>> endobj4 0 obj <</XObject<</Img3 7 0 R>>>> endobj5 0 obj <</Length 12/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray/Filter/FlateDecode>>streamxœûÿ¿þ? ú}endstreamendobj6 0 obj <</Length 40/Filter/FlateDecode>>streamxœ3T0 B]C]s#…ä\. Ó!}ÏÜtc—|. È >endstreamendobj7 0 obj<</Length 22/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB/Filter/FlateDecode>>streamxœûÏÀÀðŒÿÿ‡`L §sõendstreamendobjxref0 80000000000 00001 f0000000016 00000 n0000000062 00000 n0000000114 00000 n0000000218 00000 n0000000262 00000 n0000000427 00000 n0000000535 00000 ntrailer<</Size 8/Root 1 0 R>>startxref721%%EOF
%PDF-1.7
%µ¶
1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj
2 0 obj <</Type/Pages/Count 1/Kids[3 0 R]>> endobj
3 0 obj <</Type/Page/MediaBox[0 0 72 72]/Rotate 0/Resources 4 0 R/Contents 6 0 R/Parent 2 0 R>> endobj
4 0 obj <</XObject<</Img3 7 0 R>>>> endobj
5 0 obj <</Length 12/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray/Filter/FlateDecode>>
stream
xœûÿ¿þ? ú}
endstream
endobj
6 0 obj <</Length 40/Filter/FlateDecode>>
xœ3T0 B]C]s#…ä\. Ó!}ÏÜtc—|. È >
7 0 obj
<</Length 22/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB/Filter/FlateDecode>>
xœûÏÀÀðŒÿÿ‡`L §sõ
xref
0 8
0000000000 00001 f
0000000016 00000 n
0000000062 00000 n
0000000114 00000 n
0000000218 00000 n
0000000262 00000 n
0000000427 00000 n
0000000535 00000 n
trailer
<</Size 8/Root 1 0 R>>
startxref
721
%%EOF
所以要注意的是
Filter/CCITTFaxDecode
Filter/FlateDecode
因此,为了将两个图像提取为一个,您需要为您可能遇到的每个排列编写一个函数库。然而,在一个可执行文件中使用一个10-50 MB的小应用程序要简单得多,其中大部分排列都是经过多次试验和错误磨练的。这里是PDF解码,看看这些原始颜色是如何工作的。https://github.com/GitHubRulesOK/MyNotes/blob/master/colours_decoded.pdf请注意,颜色不再是真实的(你可以看到一些已经被中性作为文本。)简单的说明。
%PDF-1.7%µ¶1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj2 0 obj <</Type/Pages/Count 1/Kids [ 3 0 R ]>> endobj3 0 obj <</Type/Page/MediaBox [ 0 0 72 72 ]/Rotate 0/Resources 4 0 R/Contents 6 0 R/Parent 2 0 R>> endobj4 0 obj <</XObject<</Img3 7 0 R>>>> endobj5 0 obj <</Length 4/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray>>streamÿÿÿendstreamendobj6 0 obj <</Length 46>>stream1 0 0 -1 -0 72 cm72 0 0 -72 0 72 cm/Img3 Doendstreamendobj7 0 obj<</Length 27/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB>>streamÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿÿ endstreamendobjxref0 80000000000 00002 f 0000000015 00000 n 0000000060 00000 n 0000000114 00000 n 0000000220 00000 n 0000000263 00000 n 0000000399 00000 n 0000000493 00000 n trailer<</Size 8/Root 1 0 R>>startxref664%%EOF
2 0 obj <</Type/Pages/Count 1/Kids [ 3 0 R ]>> endobj
3 0 obj <</Type/Page/MediaBox [ 0 0 72 72 ]/Rotate 0/Resources 4 0 R/Contents 6 0 R/Parent 2 0 R>> endobj
5 0 obj <</Length 4/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray>>
ÿÿÿ
6 0 obj <</Length 46>>
1 0 0 -1 -0 72 cm
72 0 0 -72 0 72 cm
/Img3 Do
7 0 obj<</Length 27/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB>>
ÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿÿ
0000000000 00002 f
0000000015 00000 n
0000000060 00000 n
0000000220 00000 n
0000000263 00000 n
0000000399 00000 n
0000000493 00000 n
664
因此,颜色块是ÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿÿ,其中每个空间都应该为空。ÿ =R ÿ =G ÿ =B ÿÿ =C ÿ ÿ =M ÿÿ =Y =A `ÿÿÿ` =W =K还要注意,在这种奇怪的情况下,解压缩比压缩时小得多(RGB图像除外)。这种简化情况的第三种变体是WEB SAFE ASCII one https://github.com/GitHubRulesOK/MyNotes/blob/master/coloursAscii.pdf
ÿ
ÿÿ
ÿ ÿ
=A `ÿÿÿ` =W
这一个也许更容易看到到底发生了什么,无损图片明智的PDF,如果你只研究核心对象。
5 0 obj <</Length 7/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray/Filter/ASCIIHexDecode>>streamffff7f>endstreamendobj6 0 obj <</Length 46>>stream1 0 0 -1 -0 72 cm72 0 0 -72 0 72 cm/Img3 Doendstreamendobj7 0 obj <</Length 65/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB/Filter/ASCIIHexDecode>>streamff0000 00ff00 0000ff00ffff ff00ff ffff00000000 ffffff 000000>endstreamendobj
5 0 obj <</Length 7/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray/Filter/ASCIIHexDecode>>
ffff7f>
7 0 obj <</Length 65/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB/Filter/ASCIIHexDecode>>
ff0000 00ff00 0000ff
00ffff ff00ff ffff00
000000 ffffff 000000>
2条答案
按热度按时间mbyulnm01#
要了解某些数据是如何以某种文件格式存储的,最好的方法通常是阅读规范。
在手头的情况下,您应该阅读PDF规范ISO 32000,最好是当前的ISO 32000-2:2020,但对于初学者来说,旧的ISO 32000-1:2008也应该这样做。您可以在https://Adobe.com/go/pdfreference下载后者的免费副本
同时,ISO 32000-2也是免费的; https://www.pdfa.org/announcing-no-cost-access-to-iso-32000-2-pdf-2-0/
我假设“图片”是指位图图像,PDF规范称之为 * 采样图像 *。第8.9章我来处理
hxzsmxv22#
为了展示在PDF中渗透/排列图像的几十种方法中的一种,这里是我可以轻松编写的最小的工作示例。
它有基本的9种颜色进行比较RGB CMY AWK
如果你的编辑器和微软记事本一样好,它应该像colours.pdf一样工作,但是粘贴在网上可能会损坏,所以下载在这里。Colours.pdf should work in most viewers只是没有显示为github页面(但稍后见)
所以要注意的是
Filter/CCITTFaxDecode
,因此比较复杂,因此更改为与RGB颜色相同,因此所有颜色都缩小为Filter/FlateDecode
因此,为了将两个图像提取为一个,您需要为您可能遇到的每个排列编写一个函数库。然而,在一个可执行文件中使用一个10-50 MB的小应用程序要简单得多,其中大部分排列都是经过多次试验和错误磨练的。
这里是PDF解码,看看这些原始颜色是如何工作的。
https://github.com/GitHubRulesOK/MyNotes/blob/master/colours_decoded.pdf
请注意,颜色不再是真实的(你可以看到一些已经被中性作为文本。)简单的说明。
因此,颜色块是
ÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿÿ
,其中每个空间都应该为空。ÿ
=Rÿ
=Gÿ
=Bÿÿ
=Cÿ ÿ
=Mÿÿ
=Y=A `ÿÿÿ` =W
=K还要注意,在这种奇怪的情况下,解压缩比压缩时小得多(RGB图像除外)。
这种简化情况的第三种变体是WEB SAFE ASCII one https://github.com/GitHubRulesOK/MyNotes/blob/master/coloursAscii.pdf
这一个也许更容易看到到底发生了什么,无损图片明智的PDF,如果你只研究核心对象。