让 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 模板中以不同于过滤器的方式使用管道?

为啥我的场景在横向调整大小以不使用整个屏幕空间?

使 String.format("%s", arg) 以不同于 "null" 的方式显示空值参数

Python 程序以不同于英语的语言显示消息