如何将PostScript XObject添加到PDF?

时间:2011-04-16 23:28:29

标签: pdf postscript

我正在演示我一直在玩的想法,虽然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代码,它可以正常工作。感谢您的任何见解。

1 个答案:

答案 0 :(得分:4)

我已经搜索了我的PDF文件集,并提出了2个包含PS XObjects的内容(这个 已弃用)。遗憾的是,我不能分享tehm,因为它们是客户数据文件: - (

但是,以下是其中一个摘录:

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片段中有一个字节行终止符。