我正在演示我一直在玩的想法,虽然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
每次我测试过的任何PDF查看器都反对读取此对象时,我会收到错误,例如:“错误(741):缺少'endstream'”并且类似于该流中的每个标记。我确信我的抵消是正确的。虽然我知道我的PDF查看器确实支持某些PS表格等,但有什么明显不正确的。如果有人有PDF样本我可以去,那就太好了。我测试过我的读者的表单示例并没有太大帮助。如果我只运行GhostView的PS代码,它可以正常工作。感谢您的任何见解。
答案 0 :(得分:4)
我已经搜索了我的PDF文件集,并提出了2个包含PS XObjects的内容(这个
但是,以下是其中一个摘录:
74 0 obj
<<
/Type /XObject
/Subtype /PS
/Filter /FlateDecode
/Length 77 0 R
/Name /Ps1
>>
stream
....endstream
注1,数据末尾与'endstream'令牌之间没有EOL。
77 0 obj
4480
endobj
'stream'标记后面的0x0A偏移量为0xdab15,endstream中'e'的偏移量为0xdbc96。那是4481字节。所以在我看来,/ Length应该包含之后的所有字节用于“流”标记的EOL,直到在endstream标记中的'e'之前的最后一个字节。
我认为在流数据之后和endstream之前插入0x0A是可以的。这将在令牌之前的流数据之后变为空白,并且PDF应该容忍空格。
这与表3.4(1.7 PDF参考文献的第62页)中的流词典的/ Length条目描述一致:
从关键字流后面的行开头到关键字endstream之前的最后一个字节的字节数。 (在端流之前可能还有一个额外的EOL标记,它不包含在计数中,并且在逻辑上不是流数据的一部分。)请参阅上面的“流程范围”,以供进一步讨论。
我认为(如果我已正确计算)假设示例中的/ Length应为87,假设PostScript片段中有一个字节行终止符。