Jak scalić wiele plików PDF na jednej stronie za pomocą pdftk?

35

Mam szereg plików PDF 1.pdf, 2.pdfitd, które chciałbym połączyć w jeden plik, wszystkie pliki PDF kafelkami na jednej stronie.

Obecnie próbowałem pdftkscalić te pliki, ale są one umieszczane na osobnych stronach:

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

Czy istnieje sposób, aby zamiast tego ułożyć pojedyncze pliki PDF na jednej stronie wzorcowej merged.pdf?

Alex Reynolds
źródło
1
W przypadkach, w których korzystanie z aplikacji GUI jest prawidłowe, dobrą alternatywą jest pdfsam.org
reinierpost
1
Czy znalazłeś odpowiedź do zaakceptowania?
Léo Léopold Hertz -
Ten link: verypdf.com/wordpress/201302/... pokazuje, że VeryPDF PDF Stitcher może wykonywać pracę w pionie lub na boki. Pobierz ze strony: verypdf.com/app/pdf-stitch/index.html
Zimba

Odpowiedzi:

29

Testowałem to dzisiaj:

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

Umieszcza 2 strony na jednej stronie.

Ole Tange
źródło
Prace pod oknami, jak również (z WSL )sudo apt-get install pdfjam
Jan-GLX
4
jeśli chcesz skleić strony w pionie, użyj--nup 1x2 --no-landscape
jan-glx
Jeśli nie chcesz automatycznego skalowania stron (kopalnia domyślnie rozciąga dane wyjściowe, aby wypełnić A4), użyj--noautoscale true
Jonathan Y.
1
Pytanie dotyczy pdftk, a nie pdfjam. To nie odpowiada na pytanie; sugeruje się znalezienie alternatywy
Zimba
6

Plik pdfnup oparty na pdfLaTeX może Ci pomóc . Jeśli masz dużo plików pdf, może być konieczne utworzenie długiej potoki pdfjam lub uruchomienie jej kilka razy.

Istnieje również pdfnup w Pythonie .

Micke
źródło
4

Nie jestem pewien, co masz na myśli tiled on one page. Szukałem sposobu scalenia wielu plików PDF na jednej stronie - na drugiej. Można to zrobić w pdftknastępujący sposób:

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

Nik
źródło
3

Ten skrypt umieści dla ciebie strony pdf. Zmień plasterek na to, czego potrzebujesz na stronie.

#!/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
anonimowy
źródło
1

możesz użyć montażu z ImageMagick

$ montage *.pdf merged.pdf

patrz także http://www.imagemagick.org/script/montage.php

Cesco
źródło
13
Montaż ImageMagick nie będzie poprawnie obsługiwał wektoryzowanych obrazów i czcionek. W rezultacie dane wyjściowe polecenia montowania mogą wyglądać na rozmyte. Zobacz także wyjaśnienie tutaj: superuser.com/a/479767/149568
Benedikt Köppel
1
To NIE odpowiada na pytanie, które dotyczy pdftk
Zimba
0

Jeśli nazwy plików są w kolejności „specyficznej dla systemu”, pdftk *.pdf cat output merged.pdfpowinno działać dobrze.

Oto, co rozumiem przez „specyficzne dla systemu” zamówienie.

Przykład:
Mam 3 pliki na moim Ubuntu 11.04: 1.pdf, 2.pdf, 10.pdf
Pliki są scalane w kolejności: 10.pdf 1.pdf 2.pdf ( ls -lzwrócił taką samą kolejność jak w scalonym pliku)

Najbezpieczniejsza konwencja nazewnictwa: 0001.pdf, 0002.pdf itp.

szemek
źródło
1
Jak już wspomniałem, polecenie to tworzy wielostronicowy plik PDF. Jak stwierdzono w moim pytaniu, szukam metody, pdftkaby utworzyć jednostronicowy plik PDF, który zawiera wejściowe pliki PDF jako kafelki.
Alex Reynolds,
Połącz moją odpowiedź z @ micke's. Nie sprawdziłem, czy pdfnup może przyjmować nazwę z symbolem wieloznacznym (* .pdf) jako argumentem, ale możesz użyć pdf wygenerowanego przez pdftk. Sprawdź pdfnuplub pdfjamz --nupopcją.
szemek
O ile ich nie zacytujesz, symbole wieloznaczne *zostaną rozszerzone o używaną powłokę. pdfnupnigdy nie widzi *.pdf, zamiast tego widzi listę wszystkich plików w katalogu roboczym z nazwami plików kończącymi się na .pdf.
evilsoup
0

Jeśli masz dużą liczbę plików PDF w jednej strukturze folderów i masz instalację TeX-a, ten skrypt umieszcza wszystkie pliki PDF rekursywnie w jednym dużym pliku:

    #!/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"

Nie napisałem tego kodu, mam go z dyskusji tutaj: http://www.listserv.dfn.de/cgi-bin/wa?A2=ind1201&L=tex-dl&T=0&P=10771

Jest to bardzo przydatne. Przetłumaczyłem niektóre niemieckie komentarze na angielski.

Z poważaniem, Alexander

Dawka Keksa
źródło
-1
  1. Zapisz żądane strony w dokumencie pdf za pomocą programu Acrobat Pro.

  2. Wydrukuj dokument przy użyciu funkcji wielu stron na stronie, z powrotem do dokumentu pdf.

Wiele stron na jednej stronie. :-)

Malcolm
źródło
Widzę, że twoja odpowiedź jest oceniona bez komentarza. To nie jest fajne, ale z pewnością istnieją sposoby na poprawienie odpowiedzi. Popraw jego gramatykę, dodaj opis na górze, dlaczego to robisz itp.
przegłosował tę odpowiedź - tylko dlatego, że głosy negatywne bez komentarza nie są fajne IMO!
Jeremy Davis
1
Przegłosowano, ponieważ temat mówi „z pdftk”. Twoja odpowiedź może nie jest nie na temat, ale wyraźnie nie jest tym, czego szuka pytający.
Nik