如何使用带有页面特定裁剪框数组的ghostscript裁剪多页pdf

时间:2016-11-25 10:58:27

标签: ghostscript postscript

此帖子是"How do I crop pages 3&4 in a multipage pdf using ghostscript"的后续内容,但它将输入更改为数据数组。

任务:我有一个pdf文件(一组图纸),其中所有页面都有相同的大小,我想以一种方式裁剪一些页面,而另一些页面则不同。以下屏幕截图显示了我如何生成以下数据进行裁剪:spreadsheet“左,下,右,上”将被移交给postscript / CropBox [934 350 3318 2034] 命令。 Pagenumbers只是连续的数字,所以它们可能不需要反弹。

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裁剪特定页面,这可能是解决此问题的一个很好的起点。我只是没有弄清楚自己。

尝试用作解决此问题的基础的相关postscript代码是(感谢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

我想我的疯狂页面大小字典需要一些“真实”页面大小的测试数字...只是为了一些有趣的测试。

/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

1 个答案:

答案 0 :(得分:1)

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

执行此操作的最佳方法可能是将页面信息数组创建为特定字典中的命名对象。如果您不创建自己的字典,则将使用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)然后通过Ghostscript运行你的PDF文件,但把'crop.ps'作为输入文件之一之前你的PDF文件:< / p>

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