如何向PDF文件中添加一个PostScript XObject?

4

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

谢谢,但不幸的是将额外的字节添加到长度值并没有帮助。我仍然遇到相同类型的错误。 - MattD
规范说明应该在“stream”标识符(第一个换行符)之后开始,在“endstream”之前结束。 - MattD
我在这里有些困惑。不确定出了什么问题。 - MattD
1个回答

5
我已经仔细查看了我收集的PDF文件,并找到了两个包含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应该包含从“stream”标记的EOL到“endstream”标记中“e”的前一个字节的所有字节。
我认为在流数据之后并在endstream之前插入0x0A是可以的。这会导致流数据和标记之间有一个空格,而PDF应该容忍空格。
这与第3.4表中流字典的/Length条目的描述一致(参见第1.7版PDF参考手册第62页):
“从关键字stream后面的第一行开始的字节数到关键字endstream之前的最后一个字节。 (可能会有一个额外的EOL标记,在endstream之前,它不计入计数,也不是流数据的逻辑部分。)有关进一步讨论,请参见“Stream Extent”。”
我认为(如果我数对了),在PostScript片段中每个字节的行终止符应为1个字节,你的示例中的/Length应该是87。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接