Як об'єднати кілька файлів PDF на одну сторінку за допомогою pdftk?


35

У мене є ряд PDF - файлів 1.pdf, 2.pdfі т.д. , що я хотів би об'єднати в один файл, з усіма PDF - черепичних на одній сторінці.

Наразі я намагався pdftkоб'єднати ці файли, але вони розміщуються на окремих сторінках:

pdftk 1.pdf 2.pdf ... cat output merged.pdf

Чи є спосіб замість цього передати окремі файли PDF на одну головну сторінку merged.pdf?


1
У випадках, коли користуватися програмою GUI нормально, хороша альтернатива - pdfsam.org
reinierpost

1
Ви знайшли якусь відповідь прийняти?
Лео Леопольд Герц 준영

Це посилання: verypdf.com/wordpress/201302/… показує VeryPDF PDF Stitcher може виконувати цю роботу вертикально або вбік. Завантажити за адресою: verypdf.com/app/pdf-stitch/index.html
Зімба

Відповіді:


29

Я перевірив це сьогодні:

pdfjam Page1.pdf Page2.pdf --nup 2x1 --landscape --outfile Page1+2.pdf

Він розміщує 2 сторінки на одній сторінці.


працює і під windows (з wsl )sudo apt-get install pdfjam
jan-glx

4
якщо ви хотіли склеювати сторінки вертикально, використовуйте--nup 1x2 --no-landscape
jan-glx

Якщо ви не хотіли автоматичного масштабування сторінок (моє розтягнення виводить на заповнення a4 за замовчуванням), використовуйте--noautoscale true
Jonathan Y.

1
Питання задається про pdftk, а не pdfjam. Це не дає відповіді на запитання; це пропозиція знайти альтернативу
Зімба

6

Можливо, для вас може працювати pdfnup на основі pdfLaTeX . Якщо у вас багато pdf-файлів, можливо, вам доведеться зробити довгу трубку pdfjam або запустити її кілька разів.

Існує також pdfnup в python .


4

Не впевнений, що ти маєш на увазі tiled on one page. Я шукав спосіб об’єднання декількох PDF-файлів на одній сторінці - поверх іншої. Це можна зробити pdftkтак:

pdftk foreground.pdf background background.pdf output merged.pdf


3

Цей скрипт додасть вам сторінки у форматі PDF. Змініть фрагмент на те, що вам потрібно на сторінці.

#!/usr/bin/ruby

latexhead = <<'EOF'
\documentclass{article}
\usepackage[pdftex]{graphicx}
\usepackage[margin=0.1in]{geometry}
\usepackage{pdfpages}
\begin{document}
EOF
latextail = <<'EOF'
\end{document}
EOF

pages = %x[pdfinfo #{ARGV[0]}].split(/\n/).select{|x| x=~ /Pages:/}[0].split(/\s+/)[1].to_i
puts latexhead
s = (1..pages).each_slice(4).to_a
s.each do |a|
  puts "\\begin{figure}"
  a.each do |p|
    puts "\\includegraphics[page=#{p},scale=0.4,width=.5\\textwidth]{#{ARGV[0]}}"
  end
  puts "\\end{figure}"
end
puts latextail

1

ви можете використовувати фотомонтаж з ImageMagick

$ montage *.pdf merged.pdf

див. також http://www.imagemagick.org/script/montage.php


13
ImageMagick фотомонтаж не буде належним чином обробляти векторні зображення та шрифти. Як результат, вихід з команди montage може виглядати розмитим. Дивіться також пояснення тут: superuser.com/a/479767/149568
Benedikt Köppel

1
Це НЕ відповідає на запитання, яке задають про pdftk
Zimba

0

Якщо назви файлів впорядковані в "системному режимі", вони pdftk *.pdf cat output merged.pdfповинні працювати добре.

Ось що я маю на увазі під "системним" замовленням.

Приклад:
У мене на Ubuntu 11.04 є 3 файли: 1.pdf, 2.pdf, 10.pdf
Файли об’єднуються в порядку: 10.pdf 1.pdf 2.pdf ( ls -lповертається той самий порядок, що і в об'єднаному файлі)

Найбезпечніша угода про іменування: 0001.pdf, 0002.pdf тощо.


1
Як я вже зазначив, ця команда створює багатосторінковий PDF. Як зазначено в моєму запитанні, я шукаю спосіб використання pdftkдля створення односторінкового PDF, який містить вхідні PDF у вигляді плиток.
Алекс Рейнольдс

Поєднайте мою відповідь із @ micke's. Я не перевіряв, чи може pdfnup приймати ім'я з підстановкою (* .pdf) як аргумент, але ви можете використовувати pdf, згенерований pdftk. Позначте pdfnupабо pdfjamз --nupопцією.
szemek

Якщо ви не цитуєте їх, подвійні символи *розширюються оболонкою, яку ви використовуєте. pdfnupніколи не бачить *.pdf, натомість він бачить список усіх файлів у робочому каталозі, у яких імена файлів закінчуються .pdf.
злий

0

Якщо у вас є велика кількість файлів PDF в один folderstructure, і у вас є TeX-установка, цей скрипт поміщає всі файли PDF recursivly в один великий файл:

    #!/bin/bash
#
# pdfdir OUTPUT_FILE
#
# produces one big PDF file of all PDF files in .
#
if [ $# -ne 1 ] || [ -z "$1" ]; then
  echo "Syntax: pdfdir OUTPUT_FILE"
  exit 1
fi
FILE="$(echo "$1"|sed -e 's/\.\(pdf\|tex\)$//')"
for F in "$FILE" "$FILE.tex" "$FILE.pdf" "$FILE.aux" "$FILE.log" ; do
  if [ -e "$F" ]; then
    echo "$F exists already."
    exit 2
  fi
done
cat >"$FILE.tex" <<EOF
\documentclass{article}%
\usepackage{pdfpages}%
\usepackage{grffile}%
\listfiles%
\begin{document}%
%\tableofcontents%
EOF
# helper functions
exist_pdf_files () {
  [ $(find -L "$1" -name \*.pdf -o -name \*.PDF -type f 2>/dev/null|wc -l) -eq 0 ] && return 1
  return 0
}
list_directories () {
  find -L "$1" -maxdepth 1 -mindepth 1 -type d 2>/dev/null | sort
}
list_pdf_files () {
  # version with " around filenames:
  #find -L "$1" -maxdepth 1 -mindepth 1 -name \*.pdf -o -name \*.PDF -type f 2>/dev/null | sort | \
  #  sed -e 's/^/\\includepdf[pages=-]{"/; s/$/"}%/'
  # version without " around filenames:
  find -L "$1" -maxdepth 1 -mindepth 1 -name \*.pdf -o -name \*.PDF -type f 2>/dev/null | sort | \
    sed -e 's/^/\\includepdf[pages=-]{/; s/$/}%/'
}
tex_headline () {
    echo "$1" | sed -e 's/_/\\_/g'
}
# current folder (lefel 0):
list_pdf_files . >>"$FILE.tex"
# Bearbeite Ebene 1:
list_directories . | while read -r DIR1; do
  # Are there PDFs in folders below that level?
  exist_pdf_files "$DIR1" || continue
  # Yes ...
  tex_headline "\section{${DIR1##*/}}%"
  # those:
  list_pdf_files "$DIR1"
  # Level 2:
  list_directories "$DIR1" | while read -r DIR2; do
    exist_pdf_files "$DIR2" || continue
    tex_headline "\subsection{${DIR2##*/}}%"
    list_pdf_files "$DIR2"
    # Level 3:
    list_directories "$DIR2" | while read -r DIR3; do
      exist_pdf_files "$DIR3" || continue
      tex_headline "\subsubsection{${DIR3##*/}}%"
      list_pdf_files "$DIR3"
      # Level 4:
      list_directories "$DIR3" | while read -r DIR4; do
        exist_pdf_files "$DIR4" || continue
        tex_headline "\paragraph{${DIR4##*/}}%"
        list_pdf_files "$DIR4"
        # Level 5:
        list_directories "$DIR4" | while read -r DIR5; do
          exist_pdf_files "$DIR5" || continue
          tex_headline "\subparagraph{${DIR5##*/}}%"
          list_pdf_files "$DIR5"
        done
      done
    done
  done
done >>"$FILE.tex"
echo "\end{document}%" >>"$FILE.tex"
echo "Sourcecode to PDF directly [J/n]"
read -r ANSWER
case "$ANSWER" in
[JjYy]) ;;
*) exit 0 ;;
esac
pdflatex "$FILE"
[ $? -eq 0 ] && rm -f "$FILE.aux" "$FILE.log" "$FILE.tex"

Я не писав цього коду, я отримав його з обговорення тут: http://www.listserv.dfn.de/cgi-bin/wa?A2=ind1201&L=tex-dl&T=0&P=10771

Це дуже корисно. Я переклав кілька німецьких коментарів англійською мовою.

З повагою, Олександре



-1
  1. Збережіть потрібні сторінки в PDF-документ із чимось на зразок Acrobat Pro.

  2. Роздрукуйте документ за допомогою декількох сторінок на функцію сторінки назад до документа в форматі PDF.

Кілька сторінок на одну сторінку. :-)


Я бачу, що ваша відповідь заперечується без коментарів. Це не круто, але, безумовно, є способи покращити свою відповідь. Вдосконаліть його граматику, додайте до початку опис того, чому ви це робите, тощо

підтримали цю відповідь - лише тому, що голоси без коментарів - це крутий ІМО!
Джеремі Девіс

1
Захищений тому, що тема пише "з pdftk". Ваша відповідь, можливо, не поза темою, але явно не те, що запитуючий шукає.
Нік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.