让 Ghostscript 以不同于横向页面的方式处理纵向页面?
Posted
技术标签:
【中文标题】让 Ghostscript 以不同于横向页面的方式处理纵向页面?【英文标题】:Get Ghostscript to handle portrait pages differently from landscape pages? 【发布时间】:2021-11-14 19:25:34 【问题描述】:我是 Ghostscript 的新手。我正在尝试为 PDF 中的页面添加额外的边距。我的命令行适用于纵向模式的页面,但会弄乱横向模式的页面。我想为纵向页面添加 30 点宽度和 42 点边距(以保持相同的纵横比),因此将 A4 页面大小增加一倍。对于横向,我颠倒了数字。
当更改命令使其适用于横向页面时,它现在会弄乱纵向页面。
有没有一种方法可以有条件地更改页面,使其适用于纵向和横向页面?
我的命令是(对于 Windows)
适用于纵向模式:gswin64 -o c:\temp\outport.pdf -sDEVICE=pdfwrite -g6550x9270 -c "<</Install 30 42 translate>> setpagedevice" -f "mysource.pdf"
gswin64 -o c:\temp\outland.pdf -sDEVICE=pdfwrite -g9270x6550 -c "<</Install 42 30 translate>> setpagedevice" -f "mysource.pdf"
我这样做是因为最初 PDF 需要在文本周围留出 2 厘米的边距。但现在我需要(大约)3 厘米的边距。这样,当我打印它时,它将以 A4 打印,边距为厘米,并且纵横比正确。
【问题讨论】:
创建一个 BeginPage 过程,而不是将偏移添加为安装。您可以在此时询问媒体尺寸,并根据是横向还是纵向或媒体的实际尺寸来决定要做什么。显然,您将无法使用 -g 参数,因为它是高级设备并且只有标称分辨率,所以您真的不应该将其与 pdfwrite 一起使用。您当然不能在命令行上指定媒体大小(这就是 -g 所做的)并期望在每页的基础上进行更改。 感谢@KenS 的建议。不过,这超出了我的范围 - 是否有可能提供可以做到这一点的代码? 谢谢@KJ。我现在在我的问题中添加了为什么我想要这个:最初 PDF 需要在文本周围留出 2 厘米的边距。但现在我需要(大约)3 厘米的边距。 【参考方案1】:我不情愿地将其发布为答案,因为它太大而无法发表评论。
使用此内容创建一个文本文件,将其命名为“intelligent_resize.ps”之类的令人难忘的名称:
%!
userdict begin
/ResetPageSize true def
end
<<
/BeginPage
userdict /ResetPageSize known not
(Error: ResetPageSize undefined!\n) print flush
//true
userdict /ResetPageSize get
ifelse
userdict /ResetPageSize //false put
currentpagedevice /PageSize get aload pop
2 copy gt
60 add exch 84 add exch
2 array astore /PageSize exch
1 dict dup 4 2 roll put
setpagedevice
42 30 translate
84 add exch 60 add exch
2 array astore /PageSize exch
1 dict dup 4 2 roll put
setpagedevice
30 42 translate
ifelse
userdict /ResetPageSize //true put
ifelse
>> setpagedevice
然后使用这个命令行(或类似的东西):
gswin64 -o c:\temp\outport.pdf -sDEVICE=pdfwrite intelligent_resize.ps "mysource.pdf"
这会安装一个 BeginPage 例程,该例程在每个页面的开头运行,但在 userdict 中有一个控件来确定例程的作用。
如果控件为 true,则将其设置为 false(防止 setpagedevice 中的递归)检查媒体是纵向还是横向,根据方向在宽度和高度上添加 60、84 或 84,60 点,并将内容翻译 30,42 或 42,30。
如果控件为假,则将其设置为真。
所以我们在第一页开始时被调用,控件为真,所以我们重置控件,计算新的媒体大小,并调用 setpagedevice 来设置新的大小。这意味着我们再次调用 BeginPage。这次控件为 false,因此我们将控件设置回 true 并返回到我们原来的 BeginPage 例程,然后转换新创建页面的 CTM。
然后页面的内容被执行。我们继续前进到下一页,然后我们又开始了。因此,这“应该”适用于包含多种方向的 PDF 文件。目前的代码只是将所有页面扩展所需的数量并重新居中内容,它不会尝试将内容适应不同大小的页面或任何复杂的内容。
我今天没有时间来评论这个程序,抱歉,如果需要,它应该不难解决和修改。它也没有那么小,可能有重复的代码可以被分解,但我今天也没有时间。
我在 Letter 纵向文件和 Letter 横向文件上进行了尝试,它似乎可以满足您的要求。
【讨论】:
感谢@kens:这是一个很棒的解决方案,它完全符合我的要求。以上是关于让 Ghostscript 以不同于横向页面的方式处理纵向页面?的主要内容,如果未能解决你的问题,请参考以下文章
为啥需要以不同于其他 MIME 类型的请求的方式处理多部分请求?
自定义表:SPSS 如何以不同于分类变量的方式处理多响应集?
如何在 Flask/Jinja 模板中以不同于过滤器的方式使用管道?