我使用Ghostscript将PDF文档转换为PCL进行打印。最近我还要求在打印前将所有页面旋转到Portrait。我已经找到了一种使用Ghostscript和以下命令和postscript函数的方法。
"C:\Program Files (x86)\gs\bin\gswin32c.exe" "-dNOPAUSE" "-dNOPROMPT" "-dBATCH" "-sDEVICE=pxlmono" "-Ic:\Program Files (x86)\gs\fonts\;c:\Program Files (x86)\gs\lib\;c:\Program Files (x86)\gs\lib\;" "-r300" "-sOutputFile=C:\EXPORTFILE_e542e04f-5e84-4c8e-9b41-55480cd5ec52.cache" "rotate612x792.ps" "C:\EXPORTFILE_3a5de9da-d9ca-4562-8cb6-10fb8715385a.cache"
rotate612x792.ps的内容
%! Rotate Pages
<< /Policies << /PageSize 5 >>
/PageSize [612 792]
/InputAttributes currentpagedevice
/InputAttributes get mark exch {1 index /Priority eq not {pop << /PageSize [612 792] >>} if } forall >>
>> setpagedevice
问题是此功能会用字母大小替换所有页面大小。我的文件有时是合法的或A4。我试图修改此功能,以使用肖像对应物替换横向大小,但无法生成功能性的postscript。我需要指向正确的方向来生成与以下伪代码等效的postscript。
for(each page)
{
if(PageSize == [792 612])
PageSize = [612 792];
}
我知道有非Ghostscript旋转页面的方法,但是如果我可以使用它,它将很好地适应我的过程并且不会降低性能。
以下是我的一个pdf文件的示例: Sample1.pdf
答案 0 :(得分:4)
PostScript是一种编程语言,因此您可以使用它做很多事情。您需要做的是重新定义请求页面大小的操作。页面大小和内容在PostScript中是分开的,因此您需要做两件事:
1)更改从横向到纵向的媒体请求
2)旋转页面内容
最简单的方法是重新定义'setpagedevice'运算符。这是一个例子:
/oldsetpagedevice /setpagedevice load def %% copy original definition
/setpagedevice {
dup /PageSize known { %% Do we have a page size redefinition ?
dup /PageSize get %% get the array if so
aload pop %% get elements remove array copy
gt { %% is width > height ?
dup /PageSize get aload %% get size array, put content on stack
3 1 roll %% roll stack to put array at back
exch %% swap width and height
3 -1 roll %% bring array back to front of stack
astore %% put swapped elements into array
/PageSize exch %% put key on stack and swap with value
2 index %% copy the original dict
3 1 roll %% move dict to back of stack
put %% put new page size array in dict
90 rotate %% rotate content 90 degrees anti-clockwise
} if
} if
oldsetpagedevice %% call the original definition
} bind def
这会检查配置更改,以查看是否更改了页面大小,是否获得新大小,并查看是否宽度&gt;高度(景观的简单定义)。如果这是真的,那么它通过交换宽度和高度来改变请求,然后将页面内容旋转90度。
您可以将上述内容放在一个文件(例如prolog.ps)中,然后在您自己的工作之前运行该文件,将其与Ghostscript一起使用:
gs ...... prolog.ps job.ps
我已经尝试了这个,但没有使用横向文件,因为我没有亲自动手。另请注意,可以构建一个可以解决此问题的PostScript程序。
答案 1 :(得分:2)
我找到了一个可行的解决方案。它并不像我希望的那样多才多艺,但它满足了我的所有要求。
以下postscript脚本将A4,Letter和Legal文档旋转到Portrait。要让它做其他页面大小,请调整最小和最大尺寸。
%!PS
% Sequence to set up for a single page size, auto fit all pages.
% Autorotate A4 Letter and Legal page sizes to Portrait
<< /Policies << /PageSize 3 >>
/InputAttributes currentpagedevice /InputAttributes get %current dict
dup { pop 1 index exch undef } forall % remove all page sizes
dup 0 << /PageSize [ 595 0 612 99999 ] >> put % [ min-w min-h max-w max-h ]
>> setpagedevice
此附言脚本将A4,Letter和Legal文件旋转到横向。唯一的区别是最小/最大页面大小值。
%!PS
% Sequence to set up for a single page size, auto fit all pages.
% Autorotate A4 Letter and Legal page sizes to Landscape
<< /Policies << /PageSize 3 >>
/InputAttributes currentpagedevice /InputAttributes get %current dict
dup { pop 1 index exch undef } forall % remove all page sizes
dup 0 << /PageSize [ 0 595 99999 612 ] >> put % [ min-w min-h max-w max-h ]
>> setpagedevice
此解决方案基于我在hylafax项目的源代码中找到的auto-rotate.ps文件。该项目似乎是在BSD下获得许可。
答案 2 :(得分:1)
尽管Zig158的答案很好,但此后出现了新的选择 -dFIXEDMEDIA 女巫适用于任何纸张尺寸,不仅适用于a4。
有关其他详细信息,请参见Ghostscript bug tracker。