提问者:小点点

带有使用XObject的外部图像的PDF


我正在尝试建立一个带有外部文件链接的PDF文件。

我使用的规范是https://www.adobe.com/content/dam/adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

在第348页上有一个具有远程加载的替代图像的图像示例。当我使用文档中的示例创建文档时,阅读器(使用acrobat reader XI)不会获取图像。没有错误消息,但没有发出请求(使用wireshark进行检查)。

  1. 只能有远程映像(即没有“正常”映像和备用映像)。
  2. 是否有使用/fs/url语法的完整文档的示例(不只是对象)?我找不到任何实际执行此请求的。

谢谢

编辑:我使用LibreOffice创建了一个1x1像素的基本文档。http://pastebin.com/5gqcygmp

我最初是用Acrobat创建测试文档的,但是输出非常混乱。

然后用pdf规范中的示例替换流,并尝试修复startxref偏移量,但不确定它是否正确。http://pastebin.com/bt42g02p

此文档当前未正确打开,但我尝试获得一个最低测试用例。我以前的尝试显示没有错误只是运气(但远程图像没有工作无论如何)。

是否有任何工具实际上允许使用/url创建XObject?我不知道的文件格式足够创建他们可靠的手工。


共1个答案

匿名用户

首先,

我使用的规范是https://www.adobe.com/content/dam/adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

我建议不要使用PDF参考文件,而是使用ISO标准。Adobe PDF引用在本质上不是规范性的,而ISO标准则是。(实际内容差异很小,但如果有规范的规范,就应该使用它。)Adobe还发布了一个ISO标准的副本,只交换了标头。

那么,请不要把PDF当作文本文档。例如。通过在pastebin上共享它们,您将它们作为文本处理,这基本上破坏了内容。

话都说完了,让我们来看看你的实际问题:

在您的示例PDF中,您有:

4 0 obj
<</Type/XObject/Subtype/Image/Width 1/Height 1/BitsPerComponent 8/Length 0/F << /FS /URL
/F ( https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png )
>>/Filter/FlateDecode/ColorSpace/DeviceRGB
>>
stream
endstream
endobj

这表明PDF查看器将在URL https://upload.wikimedia.org/wikipedia/commons/c/ca/1x1.png上找到一个文件,该文件包含一个数组1(/width 1/height 1)RGB(/colorspace/devicergb)sample,每种颜色有1个字节(/bitspercomponent 8)。ISO 32000-1图像字典第8.9.5节。

我怀疑您的文件是否满足了这一点,我假设它实际上是一个PNG文件,特别是带有PNG结构的文件,而不是上面解释的结构。

PDF不支持PNG格式,您必须转换数据。不过,它确实支持使用/ffilter/dctdecode的JPEG格式,这就是为什么规范中的示例

16 0 obj
  << /Type /XObject
     /Subtype /Image
     /Width 1000
     /Height 2000
     /ColorSpace /DeviceRGB
     /BitsPerComponent 8
     /Length 0 % This is an external stream
     /F << /FS /URL
           /F (http://www.myserver.mycorp.com/images/exttest.jpg)
        >>
     /FFilter /DCTDecode
  >>
stream
endstream
endobj

看起来很简单。