如何使用ghostscript将单个pdf页面垂直拆分为一半

时间:2014-01-03 08:05:16

标签: pdf split ghostscript issuu

我有一个横向的pdf,是一个“页面传播”。

  1. 我需要在中间垂直地将页面分成两半。

    我使用此设置将pdf切成两半:这个获取页面的左侧部分

    "C:\Program Files (x86)\gs\gs9.10\bin\gswin32c.exe" -o output.pdf 
    -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dSubsetFonts=true -dEmbedAllFonts=true -g 750x1085 -c  
    "<</BeginPage{0.95 0.96 scale 20 22 translate}>> setpagedevice" "<</PageOffset [0 0]>> setpagedevice"  -f input.pdf
    
  2. 上面的命令工作正常。我现在的问题是我需要将Mediabox,Cropbox,Bleedbox,Trimbox和artbox设置为与分割页面的大小相似。在上面的例子中;它应该是750x1085。

    在GS上运行的正确命令/设置应该是什么,以便Mediabox,Cropbox,Bleedbox,Trimbox和artbox具有相同的大小?

  3. 更新
    这是我试图削减的PDF文件样本: PDF FILE TO SPLIT

    我现在正在使用/ PAGE pdfmark,这是我正在尝试使用的命令:

         "C:\Program Files (x86)\gs\gs9.10\bin\gswin32c.exe" -o output.pdf -sDEVICE=pdfwrite -dNOPAUSE -dBATCH 
        -dSAFER -dUseCropbox -dSubsetFonts=true -dEmbedAllFonts=true -g7500x10850 
        -c "[/CropBox [0 0 750 1085] /PAGES pdfmark" 
        "[/MediaBox [0 0 750 1085] /PAGES pdfmark" 
        "[/TrimBox [0 0 750 1085] /PAGES pdfmark" 
        "[/BleedBox [0 0 750 1085] /PAGES pdfmark"
        "[/ArtBox [0 0 750 1085] /PAGES pdfmark" 
        "<</BeginPage{0.95 0.96 scale 20 22 translate}>> setpagedevice" 
        "<</PageOffset [0 0]>> setpagedevice" 
        -f input.pdf
    

    我仍然无法设置具有相同大小的Cropbox,MediaBox,TrimBox,BleedBox,ArtBox。

    该命令的正确设置应该是什么?

1 个答案:

答案 0 :(得分:0)

在这里回答,评论太小了。

您的基本问题是原始PDF文件已包含您尝试修改的所有Box参数。对于某些类别的输出设备,Ghostscript PDF解释器将通过将自己的pdfmark版本写入设备来保留这些框。因为在你的pdfmark之后会发生,它会取代你的。

遗憾的是,没有机制来禁用此功能。此外,由于您使用的是Windows,因此您拥有ROM文件系统中内置的资源,因此您无法轻易修改它们。

所以在这一点上你无能为力。如果您愿意下载源代码并介入一些PostScript让我知道,我想我可以为您提供解决方案(您不需要重建GS,但PostScript资源不能单独提供)。

编辑以包含一些建议的解决方法

在pdf_main.ps中:

% Test whether the current output device handles pdfmark.
/.writepdfmarkdict 1 dict dup /pdfmark //null put readonly def
/.writepdfmarks {   % - .writepdfmarks <bool>
  currentdevice //.writepdfmarkdict .getdeviceparams
  mark eq { //false } { pop pop //true } ifelse
  systemdict /DOPDFMARKS known or
} bind def

您可以将/.writepdmarks更改为:

/.writepdfmarks {   % - .writepdfmarks <bool>
    false
} bind def

但请注意,输出PDF文件中会停止发送许多其他内容。

相反,您可以查看pdf_showpage_finish中的代码:

/pdfshowpage_finish {   % <pagedict> pdfshowpage_finish -
   save /PDFSave exch store
...
...
  .writepdfmarks {

        % Copy the boxes.
    { /CropBox /BleedBox /TrimBox /ArtBox } {
      2 copy pget {
        % .pdfshowpage_Install transforms the user space do same here with the boxes
        oforce_elems
        2 { Page pdf_cached_PDF2PS_matrix transform 4 2 roll } repeat
        normrect_elems 4 index 5 1 roll fix_empty_rect_elems 4 array astore
        mark 3 1 roll {/PAGE pdfmark} stopped {cleartomark} if
      } {
        pop
      } ifelse
    } forall

您可以修改“{/ CropBox / BleedBox / TrimBox / ArtBox}”行,您不想保留的任何框都可以从该行中删除。

如果您想阻止任何覆盖您的规范,请将“%复制框”中的行删除为“%复制注释和链接”

请注意,此适用于资源未内置到ROM文件系统中的系统,或资源至少在磁盘上可用的系统,并且指定了资源文件的路径使用-I开关。