c++ 如何从PDF文件中提取图片

edqdpe6u  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(296)

我想用C++从PDF文件中提取图片,但我不明白PDF文件中的图片格式,有人能帮助我吗?
我看了看PDF文件的内容,用记事本打开它,我试图解压缩的内容,并未能extact图片

mbyulnm0

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章我来处理

hxzsmxv2

hxzsmxv22#

为了展示在PDF中渗透/排列图像的几十种方法中的一种,这里是我可以轻松编写的最小的工作示例。
它有基本的9种颜色进行比较RGB CMY AWK

如果你的编辑器和微软记事本一样好,它应该像colours.pdf一样工作,但是粘贴在网上可能会损坏,所以下载在这里。Colours.pdf should work in most viewers只是没有显示为github页面(但稍后见)

  1. %PDF-1.7
  2. %µ¶
  3. 1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj
  4. 2 0 obj <</Type/Pages/Count 1/Kids[3 0 R]>> endobj
  5. 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
  6. 4 0 obj <</XObject<</Img3 7 0 R>>>> endobj
  7. 5 0 obj <</Length 12/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray/Filter/FlateDecode>>
  8. stream
  9. xœûÿ¿þ? ú}
  10. endstream
  11. endobj
  12. 6 0 obj <</Length 40/Filter/FlateDecode>>
  13. stream
  14. xœ3T0 B]C]s#…ä\. Ó!}ÏÜtc—|. È >
  15. endstream
  16. endobj
  17. 7 0 obj
  18. <</Length 22/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB/Filter/FlateDecode>>
  19. stream
  20. xœûÏÀÀðŒÿÿ‡`L §sõ
  21. endstream
  22. endobj
  23. xref
  24. 0 8
  25. 0000000000 00001 f
  26. 0000000016 00000 n
  27. 0000000062 00000 n
  28. 0000000114 00000 n
  29. 0000000218 00000 n
  30. 0000000262 00000 n
  31. 0000000427 00000 n
  32. 0000000535 00000 n
  33. trailer
  34. <</Size 8/Root 1 0 R>>
  35. startxref
  36. 721
  37. %%EOF

所以要注意的是

  • 它是3像素宽乘3像素高
  • 每个像素在两个方向上都是1/3英寸
  • 源可以是PBM、PNG、GIF、TIF或任何其他位图格式(甚至是jpeg),但PDF作者需要丢弃任何此类标题并使用原始像素,因此只需要9种颜色来存储此图像。
  • 如果源是基线JPG,则可以100%导入,而不带条带标题。
  • 如果图像具有Alpha颜色(如这里来自PNG),则Alpha数据也将是单独的对象。
  • 每个对象都可以有自己的压缩格式(许多过滤器中的一个或两个),甚至可以加密。这里的Alpha是Filter/CCITTFaxDecode,因此比较复杂,因此更改为与RGB颜色相同,因此所有颜色都缩小为Filter/FlateDecode

因此,为了将两个图像提取为一个,您需要为您可能遇到的每个排列编写一个函数库。然而,在一个可执行文件中使用一个10-50 MB的小应用程序要简单得多,其中大部分排列都是经过多次试验和错误磨练的。
这里是PDF解码,看看这些原始颜色是如何工作的。
https://github.com/GitHubRulesOK/MyNotes/blob/master/colours_decoded.pdf
请注意,颜色不再是真实的(你可以看到一些已经被中性作为文本。)简单的说明。

  1. %PDF-1.7
  2. %µ¶
  3. 1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj
  4. 2 0 obj <</Type/Pages/Count 1/Kids [ 3 0 R ]>> endobj
  5. 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
  6. 4 0 obj <</XObject<</Img3 7 0 R>>>> endobj
  7. 5 0 obj <</Length 4/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray>>
  8. stream
  9. ÿÿÿ
  10. endstream
  11. endobj
  12. 6 0 obj <</Length 46>>
  13. stream
  14. 1 0 0 -1 -0 72 cm
  15. 72 0 0 -72 0 72 cm
  16. /Img3 Do
  17. endstream
  18. endobj
  19. 7 0 obj<</Length 27/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB>>
  20. stream
  21. ÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿÿ
  22. endstream
  23. endobj
  24. xref
  25. 0 8
  26. 0000000000 00002 f
  27. 0000000015 00000 n
  28. 0000000060 00000 n
  29. 0000000114 00000 n
  30. 0000000220 00000 n
  31. 0000000263 00000 n
  32. 0000000399 00000 n
  33. 0000000493 00000 n
  34. trailer
  35. <</Size 8/Root 1 0 R>>
  36. startxref
  37. 664
  38. %%EOF

因此,颜色块是ÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿÿ,其中每个空间都应该为空。
ÿ =R ÿ =G ÿ =B ÿÿ =C ÿ ÿ =M ÿÿ =Y =A `ÿÿÿ` =W =K
还要注意,在这种奇怪的情况下,解压缩比压缩时小得多(RGB图像除外)。
这种简化情况的第三种变体是WEB SAFE ASCII one https://github.com/GitHubRulesOK/MyNotes/blob/master/coloursAscii.pdf

这一个也许更容易看到到底发生了什么,无损图片明智的PDF,如果你只研究核心对象。

  1. 5 0 obj <</Length 7/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 1/ColorSpace/DeviceGray/Filter/ASCIIHexDecode>>
  2. stream
  3. ffff7f>
  4. endstream
  5. endobj
  6. 6 0 obj <</Length 46>>
  7. stream
  8. 1 0 0 -1 -0 72 cm
  9. 72 0 0 -72 0 72 cm
  10. /Img3 Do
  11. endstream
  12. endobj
  13. 7 0 obj <</Length 65/Type/XObject/Subtype/Image/Width 3/Height 3/BitsPerComponent 8/SMask 5 0 R/ColorSpace/DeviceRGB/Filter/ASCIIHexDecode>>
  14. stream
  15. ff0000 00ff00 0000ff
  16. 00ffff ff00ff ffff00
  17. 000000 ffffff 000000>
  18. endstream
  19. endobj
展开查看全部

相关问题