Как обрезать многостраничный PDF-файл, используя ghostscript с массивом полей для конкретных страниц

Этот пост является продолжением статьи "Как обрезать страницы 3 и 4 в многостраничном PDF-файле с использованием ghostscript", но он изменяет входные данные в массив данных.


Квест: у меня есть файл PDF (набор рисунков), где все страницы имеют одинаковый размер, и я хочу обрезать некоторые страницы одним способом, а другие - по-разному. На следующем снимке экрана показано, как я сгенерировал приведенные ниже данные для обрезки: электронная таблица "Левый, нижний, правый, верхний" должен быть передан команде 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, и это, вероятно, является хорошей отправной точкой для решения этого вопроса. Я просто не понял это самостоятельно.

Соответствующий код 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 ответ

Решение

Я бы посоветовал вам разместить информацию обрезки для каждой страницы в массиве, а затем добавить каждый массив в массив. Проблема, вероятно, заключается в сохранении информации.

Вероятно, лучший способ сделать это - создать массив информации о странице в виде именованного объекта в определенном словаре. Если вы не создаете свой собственный словарь, вместо него будет использоваться 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
Другие вопросы по тегам