Автоматическое наложение 4 страниц PDF на лист формата А4 по индивидуальному заказу

Я хочу собрать свои документы PDF, чтобы распечатать их на принтере формата A5 в формате A4. Также мне нужно напечатать два сайта (слайды) на каждой странице A5, которые, конечно, должны быть двусторонними. Следовательно, страница А4 находится в альбомном формате. Чем я хочу разрезать его посередине. Краткий пример для 9 слайдов:

first A4   first back    second A4
 [1][5]      [3][7]       [9][-]
 [2][6]      [4][8]       [-][-]

После разрезания я получу слайды 1-4, 5-8, 9 на двусторонней бумаге формата А5.

Печать с использованием "Печать буклета" еще не работала. Я подумал о автоматической повторной сборке страниц PDF с помощью сценария оболочки, используя pdftk, и рассчитал mod 8, так как изменение порядка вручную невозможно. После изменения порядка я могу легко распечатать слайды, используя параметры моего принтера.

Как это можно сделать или есть более простой способ? Спасибо

2 ответа

Решение

Несмотря на то, что прошло немного времени с тех пор, как вы задали этот вопрос, вы можете попробовать jPdf Tweak, чтобы упорядочить ваши (текущие / будущие) слайды в формате PDF. Предположим, что ваши базовые слайды напечатаны в альбомной ориентации A4, возможная строка конфигурации для n-up макета, который вы изначально запрашивали, будет
8:!+1N0.5+0.0%+100.0%,+5N0.5+100.0%+100.0%,+2N0.5+0.0%+0.0%,+6N0.5+100.0%+0.0%,!+3N0.5+0.0%+100.0%,+7N0.5+100.0%+100.0%,+4N0.5+0.0%+0.0%,+8N0.5+100.0%+0.0%
соответствующий макет выглядит так (игнорируйте предустановленный заголовок здесь):

Если вы начнете с файлов postscript, аналогичная строка может быть использована с pstops.

Насколько я понимаю, вы пытаетесь наложить 4 страницы на каждый портрет А4, что даст вам 4 отдельных страницы А6 (два листа А5 для страницы А4), поскольку разделение области А4 на 4 части означает разделение каждой стороны на две. так что у нас будет:

29,7 см / 2 = 14,8 см (приблизительно)

21 см делится на два = 10,5 см

А4 делится на 4 части

Очевидно, что в одной и той же области портрета A4 можно найти 4 страницы A6 для портрета и 2 страницы A5 для ландшафта A5, как на рисунке:

А4 делится на 4 части с А5

Итак, Вы не хотите иметь возможность сделать буклет в формате А6, а только разрезать портрет А4 пополам, чтобы получить 2 листа А5 для страницы А4? Разве вы не заинтересованы в том, чтобы урезать эти страницы ландшафта A5, чтобы иметь брошюру A6 для переплета?

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

примечание: прежде чем начать, измените размер до A6 вашего входного многостраничного PDF (который имеет размер A4)

это можно сделать с помощью

Multivalent.jar

  • http://ge.tt/6fVll5H (последняя бесплатная версия с включенными инструментами)

java -cp path...to/Multivalent.jar tool.pdf.Impose -dim 1x1 -paper A6 input.pdf

затем возьмите полученный выходной файл (не забудьте поработать с копией), переименуйте его в исходный входной файл и используйте этот скрипт

чтобы выполнить эту задачу и убедиться, что ваш многостраничный файл pdf имеет правильное количество страниц, необходимое для выполнения наложения (8 или целое число, кратное 8), вы будете использовать этот сценарий на основе pdftk (по крайней мере, версия 1.41, которая имеет функция штампа и Multivalent.jar - - http://ge.tt/6fVll5H (последняя бесплатная версия с включенными инструментами).

использование: namescript file.pdf multivalentpath

Мультивалентный путь является относительным: если вы загрузили Multivalent.jar в свой дом, то многовалентный путь будет / home /. Вы также можете настроить скрипт и напрямую заменить значение для второго аргумента (multivalentpath), поэтому вам не нужно вводить каждый раз многовалентный путь; в этом случае заменить multivalentpath=$2 с

multivalentpath=/home/Multivalent.jar

скрипт также добавит метки обрезки в окончательный вывод pdf

просматривать анимацию или полученный выходной файл с добавленными метками обрезки, чтобы упростить резку в два раза по количеству листов (сначала по горизонтали, а затем по вертикали)

результирующий выходной файл

как только вы закончили печатать и положить последний лист на другие листы, посмотрите на ваш последний наложенный лист

последняя страница, чтобы сократить

это нужно разрезать (я выделил пунктирной линией) пополам по горизонтали, чтобы иметь возможность закрыть две серии листов (верхнюю и нижнюю) друг друга (верх над нижним), получив одну серию листов из две оригинальные серии листов,

серия из одного листа

на этом этапе вы можете дополнительно разрезать по пунктирной линии лист, чтобы иметь возможность сопоставлять отдельные листы формата А6 и склеивать с помощью клея, зажима или другого материала, или использовать две точки сшивателя и сгибать созданный вами буклет.

примечание: пустые страницы, которые вы видели, автоматически размещаются после последней написанной страницы вашего исходного pdf, они необходимы, чтобы, как вы правильно указали в своем вопросе, выполнить правильную последовательность верстки, они не мешали порядку последовательной логики, в полученном переплетенном буклете порядок, в случае нашего примера, будет:

1,2,3,4,5,6,7,8,9,10,11,1,2,13,14,15,16

страницы, выделенные жирным шрифтом, будут оставлены пустыми и необходимы только для правильного наложения, их невозможно выполнить, если число страниц не кратно 8

#!/bin/bash
#
#
############################
#
#      use: namescript file.pdf multivalentpath
#
############################
#
#
#
#
file=$1
multivalentpath=$2
pages="`pdftk $file dump_data | grep NumberOfPages | cut -d : -f2`"
echo $pages
halfpages="`echo -n $(( $pages / 2 ))`"
echo $halfpages
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/8" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-2" |bc -l)"
u="u"
#first case
h="$(pdfinfo $file | grep "Page size" | cut -d x -f1 | tr 'Page size:' ' ' | xargs)"
w="$(pdfinfo $file | grep "Page size" | cut -d x -f2  | tr 'pts' ' ' | xargs)"
echo $h
echo $w
doubleheight="$(echo "scale=0; $h * 2" |bc -l)"
doublewidth="$(echo "scale=0; $w * 2" |bc -l)"
echo $doubleheight
echo $doublewidth
if [ $(( $pages % 8 )) -eq 0 ]
then
echo " the file has already a number of pages multiple by eight"
sequence="$(for ((x=$halfpages, y=$incr, z=$pages, w=1;x>=4, y<=4, z>=2, w<=$lastupperpage;x--, y++, z--, w++)); do echo "$x$u $y$u;$z $w"; done | tr ";" "\n" | tr " " "," | awk -F "," '{ print $2 "," $1; getline; print; getline; print; getline; print $2 "," $1 }' | tr "\n" "," | cut -d "," -f 1-`seq -s, 1 $pages`)"
echo "sequence is $sequence"
java -cp "$multivalentpath"Multivalent.jar tool.pdf.Impose -verbose -dim 2x2 -paper "$doubleheight"x"$doublewidth"pt -layout "$sequence" $file

cat << EOF |uudecode
begin-base64 644 /tmp/grid.pdf
JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVy
IC9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nFWPuw7CUAiGd56C2USEw+EUnsDZ
OhonbzHRwTr4+p5Wq20YgP//wuWBTFyQ+xiLwx1WbYOXJ+xQEhbcV/EIBV8g
eIWBxXYNSyfR5IIlXEkV7+CaSKz8lBtsIdydfAIFZyeTGbT7LslhjKIRhXJF
v20dSTJwg+CZKYWOPv+dJrNS9tEpVpTEP76lILfJHaYNk+TZHYJ9dBfIjRtF
/cQlSLH+SWzxy90JzgvYwBusBz89ZW5kc3RyZWFtCmVuZG9iago2IDAgb2Jq
CjE3OAplbmRvYmoKNCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAg
MCA1OTUgODQyXQovUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREZdCi9FeHRHU3RhdGUgOCAwIFIKPj4KL0NvbnRlbnRzIDUgMCBSCj4+
CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBS
Cl0gL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxv
ZyAvUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwvVHlwZS9FeHRH
U3RhdGUKL09QTSAxPj5lbmRvYmoKOCAwIG9iago8PC9SNwo3IDAgUj4+CmVu
ZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKEVTUCBHaG9zdHNjcmlwdCA4MTUu
MDQpCi9DcmVhdGlvbkRhdGUoRDoyMDEyMTIwMTIzNDMzNCkKL01vZERhdGUo
RDoyMDEyMTIwMTIzNDMzNCk+PmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAw
IDY1NTM1IGYgCjAwMDAwMDA0NzIgMDAwMDAgbiAKMDAwMDAwMDU5MCAwMDAw
MCBuIAowMDAwMDAwNDEzIDAwMDAwIG4gCjAwMDAwMDAyODIgMDAwMDAgbiAK
MDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMjYzIDAwMDAwIG4gCjAwMDAw
MDA1MjAgMDAwMDAgbiAKMDAwMDAwMDU2MSAwMDAwMCBuIAp0cmFpbGVyCjw8
IC9TaXplIDkgL1Jvb3QgMSAwIFIgL0luZm8gMiAwIFIKL0lEIFso1xqpwgd/
HzDmRPwLQT3dEyko1xqpwgd/HzDmRPwLQT3dEyldCj4+CnN0YXJ0eHJlZgo3
MDEKJSVFT0YK
====
EOF

pdftk ${file%%.pdf}-up.pdf stamp /tmp/grid.pdf output gridded.pdf &&  mv gridded.pdf ${file%%.pdf}-up.pdf && echo "finished" && exit 0
else
echo "number of pages is not a multiple of 8, adding needed blank pages to complete the imposition sequence"
heightxwidth="`pdfinfo -box $file| grep MediaBox | cut -d : -f2 | awk '{print $3 FS $4}'`"
echo "%PDF-1.4
1 0 obj
<<
/CreationDate (D:20121202145344)
/Producer (text2pdf v1.1 (\251 Phil Smith, 1996))
/Title (blank.txt)
>>
endobj
2 0 obj
<<
/Type /Catalog
/Pages 3 0 R
>>
endobj
4 0 obj
<<
/Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Courier
>>
endobj
5 0 obj
<<
  /Font << /F1 4 0 R >>
  /ProcSet [ /PDF /Text ]
>>
endobj
6 0 obj
<<
/Type /Page
/Parent 3 0 R
/Resources 5 0 R
/Contents 7 0 R
>>
endobj
7 0 obj
<<
/Length 8 0 R
>>
stream
BT
/F1 10 Tf
1 0 0 1 50 798 Tm
12 TL
()'
ET
endstream
endobj
8 0 obj
44
endobj
3 0 obj
<<
/Type /Pages
/Count 1
/MediaBox [ 0 0 595 841 ]
/Kids [ 6 0 R ]
>>
endobj
xref
0 9
0000000000 65535 f 
0000000009 00000 n 
0000000132 00000 n 
0000000524 00000 n 
0000000181 00000 n 
0000000259 00000 n 
0000000330 00000 n 
0000000410 00000 n 
0000000506 00000 n 
trailer
<<
/Size 9
/Root 2 0 R
/Info 1 0 R
>>
startxref
609
%%EOF" | sed -e "s/595 841/$heightxwidth/g">/tmp/blank.pdf
fi
if [ $(( $pages / 8 )) -eq 0 ]
    then val0="`echo "scale=0; 8-$pages" | bc -l`"
else val1="`echo "scale=0; $pages/8" | bc -l`"; echo $val1
fi
if [ $(( $pages / 8 )) -eq 0 ] ; then echo "case 2: adding $val0 blank pages" ; sleep 1s && numpages=`for ((a=1; a <= $val0; a++)); do echo -n " B1 "; done` && pdftk A=$file B=/tmp/blank.pdf cat A $numpages output pagesadded.pdf && mv pagesadded.pdf $file
#new variable values for second case
unset pages
unset halfpages
unset incr
unset dividedby4
unset lastupperpage
pages="`pdftk $file dump_data | grep NumberOfPages | cut -d : -f2`"
halfpages="`echo -n $(( $pages / 2 ))`"
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/8" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-2" |bc -l)"

echo $pages

    else
val2="`let ADDITION=$val1+1; echo $ADDITION`"
val3="`let MULTIPLICATION=$val2*8; echo $MULTIPLICATION`"
val4="`echo "scale=0; $val3-$pages" |bc -l`"
echo " case 3: adding $val4 blank pages" ; sleep 1s


numpages="`for ((a=1; a <=  $val4; a++)); do echo -n " B1 "; done`"
echo $numpages
pdftk A=$file B=/tmp/blank.pdf cat A $numpages output pagesadded.pdf && mv pagesadded.pdf $file
fi

#new variable values for third case
unset pages
unset halfpages
unset incr
unset dividedby4
unset lastupperpage
pages="`pdftk $file dump_data | grep NumberOfPages | cut -d : -f2`"
halfpages="`echo -n $(( $pages / 2 ))`"
incr="$(echo "scale=0; $halfpages+1" |bc -l)"
dividedby4="$(echo "scale=0; $pages/8" |bc -l)"
lastupperpage="$(echo "scale=0; $pages-2" |bc -l)"

sequence="$(for ((x=$halfpages, y=$incr, z=$pages, w=1;x>=4, y<=4, z>=2, w<=$lastupperpage;x--, y++, z--, w++)); do echo "$x$u $y$u;$z $w"; done | tr ";" "\n" | tr " " "," | awk -F "," '{ print $2 "," $1; getline; print; getline; print; getline; print $2 "," $1 }' | tr "\n" ","  | cut -d "," -f 1-`seq -s, 1 $pages` | xargs)"
echo $sequence
java -cp "$multivalentpath"Multivalent.jar tool.pdf.Impose -verbose -dim 2x2 -paper "$doubleheight"x"$doublewidth"pt -layout "$sequence" $file

cat << EOF |uudecode
begin-base64 644 /tmp/grid.pdf
JVBERi0xLjMKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVy
IC9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nFWPuw7CUAiGd56C2USEw+EUnsDZ
OhonbzHRwTr4+p5Wq20YgP//wuWBTFyQ+xiLwx1WbYOXJ+xQEhbcV/EIBV8g
eIWBxXYNSyfR5IIlXEkV7+CaSKz8lBtsIdydfAIFZyeTGbT7LslhjKIRhXJF
v20dSTJwg+CZKYWOPv+dJrNS9tEpVpTEP76lILfJHaYNk+TZHYJ9dBfIjRtF
/cQlSLH+SWzxy90JzgvYwBusBz89ZW5kc3RyZWFtCmVuZG9iago2IDAgb2Jq
CjE3OAplbmRvYmoKNCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAg
MCA1OTUgODQyXQovUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0
Wy9QREZdCi9FeHRHU3RhdGUgOCAwIFIKPj4KL0NvbnRlbnRzIDUgMCBSCj4+
CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBS
Cl0gL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxv
ZyAvUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwvVHlwZS9FeHRH
U3RhdGUKL09QTSAxPj5lbmRvYmoKOCAwIG9iago8PC9SNwo3IDAgUj4+CmVu
ZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKEVTUCBHaG9zdHNjcmlwdCA4MTUu
MDQpCi9DcmVhdGlvbkRhdGUoRDoyMDEyMTIwMTIzNDMzNCkKL01vZERhdGUo
RDoyMDEyMTIwMTIzNDMzNCk+PmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAw
IDY1NTM1IGYgCjAwMDAwMDA0NzIgMDAwMDAgbiAKMDAwMDAwMDU5MCAwMDAw
MCBuIAowMDAwMDAwNDEzIDAwMDAwIG4gCjAwMDAwMDAyODIgMDAwMDAgbiAK
MDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMjYzIDAwMDAwIG4gCjAwMDAw
MDA1MjAgMDAwMDAgbiAKMDAwMDAwMDU2MSAwMDAwMCBuIAp0cmFpbGVyCjw8
IC9TaXplIDkgL1Jvb3QgMSAwIFIgL0luZm8gMiAwIFIKL0lEIFso1xqpwgd/
HzDmRPwLQT3dEyko1xqpwgd/HzDmRPwLQT3dEyldCj4+CnN0YXJ0eHJlZgo3
MDEKJSVFT0YK
====
EOF

pdftk ${file%%.pdf}-up.pdf stamp /tmp/grid.pdf output gridded.pdf && mv gridded.pdf ${file%%.pdf}-up.pdf

echo "finished 2"
exit 0
Другие вопросы по тегам