Как обрезать многостраничный 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