Страницы прерывания PDFs в несколько [закрытых] страниц

У меня есть набор файлов PDF, которые содержат две "реальных" страницы к единственной странице PDF; я хотел бы прервать их в половине и поместить каждую половину на отдельной странице. По существу мне нужно что-то, что делает полную противоположность pdfnup (или psnup). Как этот подвиг может быть достигнут?

Платформой является Linux, предпочтенный открытый исходный код; поскольку у меня есть большая груда их, чтобы сделать что-то, что может быть задано сценарием (в противоположность GUI), было бы хорошо, таким образом, я могу просто дать ему список их и иметь его, жуют далеко.

Существующий ранее сценарий не является единственной опцией, также; если существует пример кода для управления PDFs похожими способами со сторонней библиотекой, я могу, вероятно, взломать его выполнение, что я хочу.

16
задан 11.05.2019, 02:34

3 ответа

Можно решить это с помощью Ghostscript. pdftk один не может сделать этого (насколько я знаю). Я дам Вам, командная строка ступает, чтобы сделать это вручную. Будет легко написать сценарий этого как процедуры, также с различными параметрами для размеров страницы и номеров страниц. Но Вы сказали, что можно сделать это сами ;-)

Как решить это с помощью Ghostscript...

... и ради удовольствия, я недавно сделал это не с входным файлом, показывающим "двойные" страницы, но один с "тройными взлетами". Можно прочитать ответ для этого случая здесь.

Ваш случай еще более прост. У Вас, кажется, есть что-то подобное этому:

+------------+------------+   ^
|            |            |   |
|      1     |      2     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
             ^
            fold
             v
+------------+------------+   ^
|            |            |   |
|      3     |      4     |   |
|            |            | 595 pt
|            |            |   |
|            |            |   |
|            |            |   |
+------------+------------+   v
<---------- 842 pt -------->

Вы хотите создать 1 PDF с 4 страницами, каждая из которых имеет размер 421 ПБ x 595 ПБ.

Первый шаг

Давайте сначала извлечем левые разделы из каждой из входных страниц:

gs \
    -o left-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [0 0]>> setpagedevice" \
    -f double-page-input.pdf

Что делали эти параметры?

Во-первых, знайте это в PDF 1 дюйм == 72 точки. Затем остальное:

  • -o ...............: Выходной файл имен. Implicitely также использует -dBATCH -dNOPAUSE -dSAFER.
  • -sDEVICE=pdfwrite : мы хотим PDF как выходной формат.
  • -g................: наборы производят размер медиа в пикселях. разрешение pdfwrite по умолчанию составляет 720 точек на дюйм. Следовательно умножьтесь на 10 для получения достойными PageOffset.
  • -c "..............: просит Ghostscript обрабатывать данный фрагмент кода PostScript незадолго до основного входного файла (который должен следовать с -f).
  • <</PageOffset ....: смещение наборов страницы отображает на носителе. (Конечно, для левых страниц сдвиг на [0 0] не имеет никакого реального эффекта.)
  • -f ...............: обработайте этот входной файл.

Какого результата последняя команда достигала?

Этот:

Output file: left-sections.pdf, page 1
+------------+  ^
|            |  |
|     1      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: left-sections.pdf, page 2
+------------+  ^
|            |  |
|     3      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

Второй шаг

Затем, правильные разделы:

gs \
    -o right-sections.pdf \
    -sDEVICE=pdfwrite \
    -g4210x5950 \
    -c "<</PageOffset [-421 0]>> setpagedevice" \
    -f double-page-input.pdf

Отметьте отрицательное смещение, так как мы смещаем страницу налево при сохранении области просмотра стационарной.

Результат:

Output file: right-sections.pdf, page 1
+------------+  ^
|            |  |
|     2      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v

Output file: right-sections.pdf, page 2
+------------+  ^
|            |  |
|     4      |  |
|            |595 pt
|            |  |
|            |  |
|            |  |
+------------+  v
<-- 421 pt -->

Последний шаг

Теперь мы комбинируем страницы в один файл. Мы могли сделать это с ghostscript также, но мы будем использовать pdftk вместо этого, потому что это быстрее для этого задания:

pdftk \
  A=right-sections.pdf \
  B=left-sections.pdf \
  shuffle \
  output single-pages-output.pdf
  verbose

Готово. Вот желаемый результат. 4 различных страницы, измеренные 421x595 ПБ.

Результат:

+------------+ +------------+ +------------+ +------------+   ^
|            | |            | |            | |            |   |
|     1      | |     2      | |     3      | |     4      |   |
|            | |            | |            | |            |5595 pt
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
|            | |            | |            | |            |   |
+------------+ +------------+ +------------+ +------------+   v
<-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt -->
22
ответ дан 07.12.2019, 10:47

Так, после намного большего количества поиска (кажется, что "страницы сокращения PDF" намного лучший поиск), я нашел немного сценария названным unpnup который использует poster, Преобразование PDF/PS, и pdftk сделать точно, в чем я нуждаюсь. Это - что-то вроде длинного пути вокруг, но это далеко превосходит другие методы, которые я нашел (такие как использование imagemagick), потому что это не растеризирует страницы перед выкладыванием их.

На всякий случай mobileread уходит по некоторым причинам, ядро сценария (лицензируемый под GPLv2 или позже Harald Hackenberg <hackenberggmx.at>) следующие:

pdftk "$1" burst
for file in pg*.pdf;
do
    pdftops -eps $file
    poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps
    epstopdf `basename $file .pdf`.tps
done
pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf
3
ответ дан 07.12.2019, 10:47

На основе ответа pipta выше:

На окнах, для разделения размера буквы PDFs с единственным нанесенным на обложку изображением в запуске, следующее, работавшее отлично для меня (отмечают использование [-612 0] на втором шаге, положительное значение созданные пустые страницы, потому что это продвинуло неправильный путь.)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Отметьте использование -dFirstPage=2 который дает gs команду начинать обрабатывать на странице 2.

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

Это создает right-sections.pdf тот же путь. И теперь нанесенное на обложку изображение:

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Затем, так как я не хотел объединяться с pdftk, использующим вход страницы руководства, я разделил левые и правые разделы на отдельный PDFs в новом каталоге.

mkdir input_file
copy cover.pdf input_file\0000.pdf
pdftk left-sections.pdf burst output input_file\%04d_A.pdf
pdftk right-sections.pdf burst output input_file\%04d_B.pdf

Затем я присоединяюсь к PDFs в том каталоге, в алфавитном порядке (и к счастью который означает, что они отсортированы в правильном порядке!) и я также выполняю результат через ghostscript снова для фиксации "Предупреждения: число Поколения из 0.. 65 535 диапазонов, принимая 0". ошибки, произведенные pdftk, какой ghostscript, названный "itext-paulo-155 (itextpdf.sf.net-lawagie.com)" - это также, оказалось, сокращало размер файла в половине в моем использовании. С исходными 4.5 МБ результатом pdftk составляли 6.7 МБ, и повторная обработка gswin32c уменьшила это до 3,2 МБ.

pdftk input_file\*.pdf cat output input_temp.pdf
gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf

И мы сделаны! Не стесняйтесь удалять input_file папку, cover.pdf, input_temp.pdf, right_sections.pdf и left_sections.pdf.;-)

1
ответ дан 07.12.2019, 10:47

Теги

Похожие вопросы