让 Ghostscript 以不同于横向页面的方式处理纵向页面?

Get Ghostscript to handle portrait pages differently from landscape pages?

我是 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 厘米的边距。这样,当我打印它时,它会以 cm 边距和正确的宽高比打印在 A4 纸上。

我很不情愿地不得不 post 这个作为答案,因为它太大了,无法发表评论。

创建一个包含此内容的文本文件,将其命名为令人难忘的名称,例如 '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。

如果控件为 false,则将其设置为 true。

所以我们在第一页开始时被调用,控件为真所以我们重置控件,计算新的媒体大小,并调用 setpagedevice 来设置新的大小。这意味着我们再次调用 BeginPage。这次控件为 false,所以我们将控件设置回 true 并返回到我们原来的 BeginPage 例程,然后转换新创建页面的 CTM。

然后执行页面内容。我们继续前进到下一页并再次进行。所以这个 'ought' 适用于包含混合方向的 PDF 文件。目前的代码只是按所需数量扩展所有页面并重新居中内容,它不会尝试将内容适应不同大小的页面或任何复杂的内容。

我今天没有时间评论这个程序,抱歉,但如果需要的话,应该不难制定和修改。它也没有尽可能小,可以分解出重复的代码,但我今天也没有时间。

我在 Letter 纵向文件和 Letter 横向文件上试过,它似乎可以满足您的要求。