让 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 横向文件上试过,它似乎可以满足您的要求。
我是 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 横向文件上试过,它似乎可以满足您的要求。