首页 > 解决方案 > 后记:同时重新缩放和调整页面大小

问题描述

对于我的一个绘图项目,我按照Eric Weeks 的 How-to重新调整我的后脚本页面,以便一个单位匹配 1 厘米的长度。我的 PS 文件的标题如下所示:

%!PS
matrix currentmatrix /originmat exch def
/umatrix {originmat matrix concatmatrix setmatrix} def
[28.3465 0 0 28.3465 0 0] umatrix

它可以完成这项工作,但我需要的另一件事是将页面大小从US Letter调整为 A4。例如,根据Postscript - 文件大小,我应该setpagedevice使用以下内容:

<< /PageSize [595 842] >> setpagedevice

但是我不能让它工作。当我把它放在重新定义的前面时matrix,它不起作用。当我在matrix重新定义之后放置它(甚至将新尺寸转换为厘米)时,它会重置矩阵比例并且页面仍然显示为US Letter,只有绘图被按比例缩小,因为坐标现在以 pts 为单位。

如何重新缩放页面并定义其大小?

编辑:我附上一个 MWE 提出我的问题。这将绘制一个矩形,该矩形将在页面周围绘制一个框,如果页面是 A4 大小,则留出 10 毫米的边距。在一个字母大小的介质上,它显示了纸张如何更短但更宽。

%!PS
matrix currentmatrix /originmat exch def
/umatrix {originmat matrix concatmatrix setmatrix} def
[28.3465 0 0 28.3465 0 0] umatrix
0.020000 setlinewidth
1.0 1.0 moveto 1.0 27.7 lineto 20.0 27.7 lineto 20 1.0 lineto 1.0 1.0 lineto
stroke

标签: resizescalepostscript

解决方案


在设置字母格式的文件中是否还有另一个 setpagedevice 调用?最后执行的调用将赢得页面大小,并且在调用之后已经完成了不同的矩阵设置,因为它在设置页面设​​备时重置了所有图形设置。

如果找不到调用它的位置,可以在 userdict 中重新定义 setpagedevice 运算符。这可能有效或无效,取决于整个 PostScript 文件的构建方式。在重新定义中,您将为 setpagedevice 创建一个新的 dict 操作数,复制所有条目,但将任何 PageSize 替换为您想要的值。

这可能会:

userdict /setpagedevice {
    dup length dict begin
        {
            1 index /PageSize eq {
                pop [595 842]
            } if
            def
        } forall
    currentdict
    end
    setpagedevice
} bind put

推荐阅读