如何将一个页面的PostScript(但不是Encapsulated PostScript)嵌入到另一个文档中?

3
在某种意义上,我想知道psnup是如何工作的。
假设我有一个遵循文档结构约定的现有文档。我可以扫描它,提取出前言、尾页和各个页面。然后,我想将选定的页面嵌入到另一个文档的输出中,同时进行缩放和平移。我尝试过遵循封装后置脚本的约定,但这些约定假设源材料符合正确的规则。
我尝试过以下方法:
在前言中定义这些内容:
/BeginEPSF {
  /b4_inc_state save def            % save state for cleanup
  /dict_count countdictstack def    % count objects on dict stack
  /op_count count 1 sub def         % count objects on operand stack
  userdict begin                    % push userdict on dict stack
  /showpage { } def                 % redefined showpage
  0 setgray 0 setlinecap
  1 setlinewidth 0 setlinejoin
  10 setmiterlimit [] 0 setdash newpath
  /languagelevel where
  {pop languagelevel
  1 ne
    {false setstrokeadjust false setoverprint
    } if
  } if
} bind def


/EndEPSF {
  count op_count sub {pop} repeat   % clean up stacks
  countdictstack dict_count sub {end} repeat
  b4_inc_state restore
} bind def

然后在我的一个输出页面中,我做了这样的事情:
%%Page: "1" 1
BeginEPSF
gsave
0.00000 49.76471 translate
0.64706 0.64706 scale

(copy one page from source document, discarding its leading %%Page)

grestore
EndEPSF
showpage

然而,嵌入的页面在输出文档中仍然保持不变。嵌入页面中的某些内容覆盖了我的BeginEPSF函数。

我已经比较并确认了我的代码和psnup都未改变页面内容(除了删除%%Page注释),所以问题应该出在包装代码上。

与其花费几天时间去理解psnup代码,我想知道是否有一份类似于EPS规范的文档,说明应该如何处理这个问题。


没有看到原始程序和你的“转换为EPS”程序,很难说清楚。请记住,PostScript是一种编程语言,因此在将一个程序块插入另一个程序时,发生的情况并不总是明显的。然而,注释会被忽略,所以问题不可能出在注释上。最有可能的是,“EPS”程序直接使用了systemdict中的操作符,而不是你在userdict中重新定义的操作符,但也可能有其他很多原因。 - undefined
嗯,那就是问题所在。假设有一个遵循DSC约定的任何后续文件(理论上允许从文档中提取单个页面),我想要将这些页面嵌入到我正在生成的新的后续文件中。psnup程序就是一个例子,它可以据说接受任何输入的后续文件,并生成一个包含多个输入页面的输出页面的文件。 - undefined
我拼凑了一个快速而简单的程序,它能够满足我的需求。如果你想看一下,可以访问这个链接:https://github.com/efalk/Tools/blob/master/ps2book.py - undefined
(叹气。看着我写的代码,还需要一些改进。请不要以我匆忙拼凑出来的东西来评判我。) - undefined
抱歉,我目前正在度假,离开了办公桌,无法查看此事。我保证不会做出评判,但在下周之前我无法进一步发表评论。 - undefined
显示剩余2条评论
1个回答

2

虽然这不是最终答案,但我通过复制 psnup 中的 Prolog 代码并按需修改解决了它。

目前将问题保持开放,因为我希望找到一个正式的“官方”答案,而不是复制粘贴我并不真正理解的代码。


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