我正在尝试建立一个带有外部文件链接的PDF文件。
我使用的规范是https://www.adobe.com/content/dam/adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf
在第348页上有一个具有远程加载的替代图像的图像示例。当我使用文档中的示例创建文档时,阅读器(使用acrobat reader XI)不会获取图像。没有错误消息,但没有发出请求(使用wireshark进行检查)。
谢谢
编辑:我使用LibreOffice创建了一个1x1像素的基本文档。http://pastebin.com/5gqcygmp
我最初是用Acrobat创建测试文档的,但是输出非常混乱。
然后用pdf规范中的示例替换流,并尝试修复startxref偏移量,但不确定它是否正确。http://pastebin.com/bt42g02p
此文档当前未正确打开,但我尝试获得一个最低测试用例。我以前的尝试显示没有错误只是运气(但远程图像没有工作无论如何)。
是否有任何工具实际上允许使用/url创建XObject?我不知道的文件格式足够创建他们可靠的手工。
首先,
我使用的规范是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
看起来很简单。