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

Posted

技术标签:

【中文标题】如何使用带有页面特定裁剪框数组的 ghostscript 裁剪多页 pdf【英文标题】:How to crop a multipage pdf using ghostscript with an array of page specific cropboxes 【发布时间】:2016-11-25 10:58:27 【问题描述】:

这篇文章是"How do I crop pages 3&4 in a multipage pdf using ghostscript" 的后续文章,但它将输入更改为数据数组。


任务:我有一个 pdf 文件(一组图纸),其中所有页面都具有相同的大小,我想以一种方式裁剪一些页面,而另一些则以不同的方式裁剪。以下屏幕截图显示了我如何生成以下数据以进行裁剪:spreadsheet“左、下、右、上”将交给 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 中裁剪特定页面,这可能是解决此问题的一个很好的起点。我只是没有自己弄清楚。

试图用作解决此问题的基础的相关后记代码是(感谢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】:

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

做到这一点的最佳方法可能是将页面信息数组创建为特定字典中的命名对象。如果您不创建自己的字典,则将使用 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文件:

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

【讨论】:

谢谢肯斯!再一次!这看起来就像我要找的一样!刚刚测试它,它还没有工作...错误/ typecheck in -- begin-- 有没有办法将错误消息通过管道传输到文本文件(我无法从ghostscript窗口复制粘贴) 错误 /typecheck in -- 开始 -- 当前文件位置是 77 我在原帖中添加了一些测试数据,用于将人像A4逐渐切割到A8... 抱歉错字,应该是 MyCrazyPageSizeDictionary 开始,即丢失了初始的正斜杠。 'get' 的情况也一样,我们需要字典对象,而不是名称对象。 谢谢肯斯。它现在遍历页面,但因错误 /rangecheck in --.endpage-- 而停止 错误:pdfmark 目标页面 8 点超出最后一页 7。有一个输出文件,但没有一个页面被裁剪...

以上是关于如何使用带有页面特定裁剪框数组的 ghostscript 裁剪多页 pdf的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有无效字符(重音)的 Pandas 数据框与数组匹配? [复制]

模型训练 - 对象的裁剪图像 VS 带有边界框的更大图像

如何使用 pdf.js 裁剪 PDF 页面的矩形区域

如何在winforms c#中从图片框中裁剪和保存非矩形但多边形区域[重复]

如何使用 jquery 裁剪缩放的图像

Android - 如何使用视图布局尺寸裁剪 jpeg