我正在演示一个我一直在研究的想法,尽管Adobe规范说包含PS XObjects不是一个好主意,但某些PDF阅读器仍应支持此功能。无论如何,那是事实。我一直在使用Adobe PDF规范,并具有以下PDF对象。这仅使用PostScript生成伪随机值,然后将其打印到页面上。理想情况下,每次呈现此页面时,都应显示一个新值:
5 0 obj
<< /Type/XObject
/Subtype/PS
/Length 103
>>
stream
/Times findfont 10 scalefont setfont
/str 32 string def
10 20 moveto
rand str cvs show
endstream
endobj
Run Code Online (Sandbox Code Playgroud)
每当我针对此对象进行测试的任何PDF查看器读取该对象时,都会收到诸如“错误(741):缺少'endstream'”之类的错误,并且对该流中的每个令牌都类似。我确信我的补偿是正确的。而且,虽然我知道我的PDF查看器确实支持某些PS用于表单等,但显然有什么不正确的地方。如果有人可以提供示例PDF,那就太好了。我测试了读者的表单示例并没有太大帮助。如果我仅从GhostView运行PS代码,则效果很好。感谢您的见解。
我已经搜集了我的PDF文件集,并拿出2个包含PS XObjects(实际上已弃用)。不幸的是,我无法共享tehm,因为它们是客户数据文件:-(
但是,以下是其中之一的摘录:
74 0 obj
<<
/Type /XObject
/Subtype /PS
/Filter /FlateDecode
/Length 77 0 R
/Name /Ps1
>>
stream
....endstream
Run Code Online (Sandbox Code Playgroud)
注意1,在数据结尾和“ endstream”令牌之间没有EOL。
77 0 obj
4480
endobj
Run Code Online (Sandbox Code Playgroud)
紧随“流”令牌之后的0x0A的偏移量为0xdab15,最终流中的“ e”的偏移量为0xdbc96。那是4481个字节。因此,在我看来,/ Length应该包含“流”令牌在EOL 之后的所有字节,直到最终流令牌中“ e”之前的最后一个字节。
我认为可以在流数据之后和结束流之前插入0x0A。在令牌之前的流数据之后,这将归为空白,而PDF应该可以容忍空白。
这与表3.4中的流字典的/ Length条目的描述一致(1.7 PDF参考的p62):
从行开始到关键字流之后到关键字结束流之前的最后一个字节的字节数。(可能在末尾流之前有一个附加的EOL标记,该标记未包括在计数中,并且在逻辑上不是流数据的一部分。)有关进一步的讨论,请参见上面的“流范围”。
我认为(假设我计算正确),假设PostScript片段中有一个字节的行终止符,则示例中的/ Length应该为87。