如何使用带有一系列页面特定裁剪框的 ghostscript 裁剪多页 pdf

How to crop a multipage pdf using ghostscript with an array of page specific cropboxes

此 post 是 的后续,但它将输入更改为数据数组。


任务: 我有一个 pdf 文件(一组图纸),其中所有页面的大小都相同,我想以一种方式裁剪某些页面,而另一些则不同。下面的截图显示了我如何生成下面的数据用于裁剪:spreadsheet "left,bottom,right,top" 将被交给 postscript /CropBox [934 350 3318 2034] 命令。页码只是连续的数字,因此可能不需要它们。

page#,left,bottom,right,top

1   0   0   4252    2384
2   0   0   4252    2384
3   0   0   4252    2384
4   0   0   4252    2384
5   934 350 3318    2034
6   934 350 3318    2034
7   441 0   3811    2384
8   441 0   3811    2384

通过上述问题的解决方案,我能够在多页 pdf 中裁剪特定页面,这可能是解决该问题的良好起点。我只是自己没有弄清楚。

试图用作解决此问题的基础的相关 post 脚本代码是(感谢 KenS):

<<
  /EndPage {
    0 eq {
      pop /Page# where {
        /Page# get
        3 eq {
          (page 3) == flush
          [/CropBox [0 0 1612 1792] /PAGE pdfmark 
          true
        }
        {
          (not page 3) == flush
          [/CropBox [500 500 612 792] /PAGE pdfmark
          true
        } ifelse
      }{
        true
      } ifelse
    }
    {
      false
    }
    ifelse
  }
>> setpagedevice

我想我们需要一些 "realistic" 页面大小的测试数字来我疯狂的页面大小字典...只是为了一些有趣的测试。

/MyCrazyPageSizeDictionary begin
/PageSizeArray [
[0 0 595 842]       % original A4 portrait
[87 123 508 719]    % cut to A5
[149 210 446 631]   % cut to A6
[192 272 403 570]   % cut to A7
[223 316 372 526]   % cut to A8
] def

我建议您将每个页面的裁剪信息放在一个数组中,然后将每个数组添加到一个封闭数组中。问题很可能是保留信息。

执行此操作的最佳方法可能是将页面信息数组创建为特定字典中的命名对象。如果您不创建自己的字典,那么将使用 userdict 代替。

然后在您的 EndPage 过程中,您只需拉取封闭数组的相关索引,这将为您提供裁剪大小的数组:

所以,例如;

%!
/MyCrazyPageSizeDictionary 1 dict def
/MyCrazyPageSizeDictionary begin
/PageSizeArray [
[   0   0   4252    2384]
[   0   0   4252    2384]
[   0   0   4252    2384]
[   0   0   4252    2384]
[   934 350 3318    2034]
[   934 350 3318    2034]
[   441 0   3811    2384]
[   441 0   3811    2384]
] def
end

<<
  /EndPage {
    0 eq {
      pop /Page# where {
        /Page# get                                    % stack - pagenum
        /MyCrazyPageSizeDictionary /PageSizeArray get % stack - pagenum [[]]
        exch                                          % stack - [[]] pagenum
        get                                           % stack - []
        [ /CropBox                                    % stack - [] [ /CropBox
        3 -1 roll                                     % stack - [ /CropBox []
        /Page pdfmark
        true
      }{
        true
      } ifelse
    }
    {
      false
    }
    ifelse
  }
>> setpagedevice

如果你把它放在一个文件中(命名为 crop.ps)然后 运行 你的 PDF 文件通过 Ghostscript 但是把 'crop.ps' 作为输入文件之一 之前 你的 PDF 文件:

gs <options....> crop.ps input.pdf

那么它应该做你想做的。需要注意的是,我没有以任何方式测试过这个程序......

[编辑,添加更正的程序]

/MyCrazyPageSizeDictionary 1 dict def
MyCrazyPageSizeDictionary begin
/PageSizeArray [
[   0   0   4252    2384]
[   0   0   4252    2384]
[   0   0   4252    2384]
[   0   0   4252    2384]
[   934 350 3318    2034]
[   934 350 3318    2034]
[   441 0   3811    2384]
[   441 0   3811    2384]
] def
end

<<
  /EndPage {
    0 eq {
      pop /Page# where {
        /Page# get                                    % stack - pagenum
        1 sub                                         % array index is 0 based, page numbers start at 1
        MyCrazyPageSizeDictionary /PageSizeArray get  % stack - pagenum [[]]
        exch                                          % stack - [[]] pagenum
        1 index length mod                            % get array, find length, clamp page number to length
        get                                           % stack - []
        [ /CropBox                                    % stack - [] [ /CropBox
        3 -1 roll                                     % stack - [ /CropBox []
        /PAGE pdfmark
        true
      }{
        true
      } ifelse
    }
    {
      false
    }
    ifelse
  }
>> setpagedevice