Menggabungkan / mengonversi banyak file PDF menjadi satu PDF

1071

Bagaimana saya bisa menggabungkan / mengonversi beberapa file PDF menjadi satu file PDF besar?

Saya mencoba yang berikut, tetapi konten file target tidak seperti yang diharapkan:

convert file1.pdf file2.pdf merged.pdf

Saya membutuhkan solusi baris perintah (CLI) yang sangat sederhana / dasar. Yang terbaik adalah jika saya dapat menyalurkan output dari penggabungan / konversi langsung ke pdf2ps(seperti yang awalnya dicoba dalam pertanyaan saya sebelumnya di sini: Linux piping (convert -> pdf2ps -> lp) ).

alkohol
sumber
3
ymmv, tetapi ini tampaknya tidak memiliki resolusi file output pdfunite sebaik dan juga menghasilkan ukuran file yang lebih besar daripada output dari pdfunite
sabujp
Setiap kali tautan dipertahankan atau tidak oleh solusi-solusi tersebut dibahas dalam posting ini . Jika Anda ingin mempertahankan tautan (mungkin bersama anotasi lainnya), gunakan pdftk jika ingin antarmuka baris perintah, pdfsam jika Anda ingin antarmuka pengguna grafis, sejda jika Anda ingin antarmuka web.
Clément

Jawaban:

1389

Mengingat itu pdfuniteadalah bagian dari poppler memiliki peluang lebih tinggi untuk diinstal, penggunaannya juga lebih sederhana daripada pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Hubert Kario
sumber
20
Ini cepat, tetapi tampaknya memutus hyperlink. Lihat blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen
426
Pastikan Anda ingat untuk memberikan out.pdf, atau itu akan menimpa file terakhir dalam perintah Anda, huh.
mlissner
10
paket untuk pdfunite adalah poppler-utils di debian tetapi mungkin tidak ada dalam rilis debian lama.
Jocelyn delalande
16
Tidak bisa merekomendasikan ini Ukuran PDF yang dihasilkan terlalu besar. Sebagai contoh: Pdfunite memberi saya file 75MB sementara Ghostscript mengemas semuanya menjadi 1MB.
Torben
64
Anda dapat menggunakan: pdfunite *.pdf out.pdfdengan asumsi tidak ada pdf lain di direktori itu dan pesanannya disimpan oleh "*". Jika tidak diawetkan, gunakan rentang: filename_ {0..9} .pdf menyelesaikannya.
lepe
549

Coba skrip ghost yang baik:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf

atau bahkan cara ini untuk versi yang disempurnakan untuk PDF resolusi rendah (terima kasih kepada Adriano karena menunjukkan ini):

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf

Dalam kedua kasus, resolusi ouput jauh lebih tinggi dan lebih baik daripada cara ini menggunakan convert:

convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

Dengan cara ini Anda tidak perlu menginstal apa pun, hanya bekerja dengan apa yang sudah Anda instal di sistem Anda (setidaknya keduanya datang secara default di rhel saya).

Semoga ini membantu,

UPDATE: pertama-tama terima kasih atas semua komentar Anda !! hanya tip yang dapat bekerja untuk kalian, setelah googling, saya menemukan trik luar biasa untuk mengecilkan ukuran PDF, saya mengurangi dengan itu satu PDF dari 300 MB menjadi hanya 15 MB dengan resolusi yang dapat diterima! dan semua ini dengan ghostscript yang bagus, ini dia:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

Bersulang!!

Gery
sumber
27
Tip yang bagus, gsberjalan sangat cepat dan kompres banyak. Namun, kualitasnya meningkat banyak setelah saya menggunakan param ini:-dPDFSETTINGS=/prepress
Adriano P
3
Saya menemukan bahwa -dPDFSETTINGS=/prepressmemiliki efek yang sangat bagus dari memutar halaman yang terlalu lebar dan memaksa bilah gulir horizontal yang mengganggu.
Robert Smith
24
Tambahkan baris berikut ke Anda .bash_profiledan Anda memiliki pintasan yang bagus: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Ini menghemat beberapa ketikan, jika Anda harus sering menggunakan perintah. Penggunaannya terlihat seperti ini:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben
2
Saya mencoba menemukan deskripsi untuk flag -dBATCH tetapi tidak bisa. Bahkan pria tidak mengatakan apa-apa. Tapi hebat dan tanpa program tambahan!
Michal Gonda
3
The gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfdapat dipersingkat dengan gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Dari Dokumentasi : "Sebagai istilah praktis yang mudah digunakan, Anda dapat menggunakan -oopsi yang diikuti oleh spesifikasi file keluaran seperti dibahas di atas. -oOpsi ini juga mengatur opsi -dBATCHdan -dNOPAUSE. Ini dimaksudkan sebagai cara cepat untuk memohon ghostscriptuntuk mengkonversi satu atau lebih file input."
MiniMax
513

Maaf, saya berhasil menemukan jawabannya sendiri menggunakan google dan sedikit keberuntungan :)

Bagi mereka yang tertarik;

Saya menginstal pdftk (pdf toolkit) di server debian kami, dan menggunakan perintah berikut ini, saya mencapai hasil yang diinginkan:

pdftk file1.pdf file2.pdf cat output output.pdf

ATAU

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

Ini pada gilirannya dapat disalurkan langsung ke pdf2ps.

alkohol
sumber
81
Menggunakan ghostscript juga mungkin berfungsi: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl
15
Perlu disebutkan bahwa pdftk dapat menggabungkan pdf terenkripsi sementara pdfunite tidak dapat
Thomas
3
memberikan resolusi yang lebih baik dengan pdftk dibandingkan dengan mengkonversi dalam opsi default.
Kiran K Telukunta
13
pdftk file1.pdf file2.pdf cat output out.pdfakan menampilkan file yang digabungkan sebagaiout.pdf
jmiserez
2
pdftktidak tersedia untuk sistem EL7 karena tidak adanya ketergantungan libgcj.
seorang pembuat kode
72

Ini adalah solusi termudah jika Anda memiliki banyak file dan tidak ingin mengetikkan nama satu per satu:

qpdf --empty --pages *.pdf -- out.pdf

SaTa
sumber
2
ini tampaknya yang paling mudah
baxx
1
qpdf tampaknya memecah hyperlink dalam dokumen
David Granqvist
2
Meskipun sulit untuk memulai dengan pilihan rumit untuk memulai, qpdf adalah alat yang sangat berguna dan kuat. Dokumentasi online tersedia di sini
Jonathan Holvey
Pasti yang paling berguna!
Lucky
54

Juga pdfjoin a.pdf b.pdfakan membuat yang baru b-joined.pdfdengan isi a.pdf dan b.pdf

rodrigob
sumber
5
Ini bagus dan ringkas, tetapi merusak hyperlink.
Bintang terang
3
pdfjoin (pdflatex) gagal dengan file dengan banyak halaman. Gagal menggabungkan ke file halaman 1k.
mdrozdziel
pdfjoin memecah anotasi atau item non-grafis tambahan
sabujp
Font "URW Palladio L" menjadi tidak terlihat setelah membuka halaman-halamannya.
v_2e
9
pdfunite biasanya berfungsi dengan baik, tetapi jika tertulis "Fitur yang Tidak Diimplementasikan: Tidak dapat menggabungkan file yang dienkripsi", pdfjoin adalah alternatif yang bagus. Untuk alasan apa pun, pdfjoin tidak mengeluhkan enkripsi.
Calaf
38

Anda dapat menggunakan perintah convert secara langsung,

misalnya

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Noor
sumber
40
Ini bukan kerugian.
Ben Ruijl
12
Anda bisa convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, tetapi ukuran file yang dihasilkan bisa terlalu besar. Saya sarankan convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfsebagai gantinya.
arielnmz
21
Ini melibatkan pengubahan segalanya menjadi gambar raster, tampaknya, yang jelas bukan yang terbaik, terutama ketika berhadapan dengan PDF berbasis teks.
Pterosaur
5
hampir salinan apa yang OP telah gambarkan tidak berfungsi
user829755
15
Jangan gunakan konversi untuk file postscript atau PDF kecuali Anda beralih dari vektor ke raster dan tidak pernah kembali. Sulit untuk melebih-lebihkan betapa buruknya ide ini.
markgalassi
32

pdfuniteboleh menggabungkan seluruh PDF. Jika Anda ingin, misalnya, halaman 2-7 dari file1.pdf dan halaman 1,3,4 dari file2.pdf, Anda harus menggunakan pdfseparateuntuk membagi file menjadi PDF terpisah untuk setiap halaman pdfunite.

Pada titik itu Anda mungkin menginginkan program dengan lebih banyak opsi. qpdfadalah utilitas terbaik yang saya temukan untuk memanipulasi PDF. pdftklebih besar dan lebih lambat dan Red Hat / Fedora tidak mengemasnya karena ketergantungannya pada gcj. Utilitas PDF lainnya memiliki dependensi Mono atau Python. Saya menemukan qpdfmenghasilkan file output yang jauh lebih kecil daripada menggunakan pdfseparatedan pdfuniteuntuk merakit halaman menjadi 30-halaman output PDF, 970kB vs 1.6450 kB. Karena ia menawarkan lebih banyak opsi, qpdfbaris perintah tidak sesederhana itu; permintaan asli untuk menggabungkan file1 dan file2 dapat dilakukan dengan

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
skierpage
sumber
2
Begitu banyak ini. Parabola misalnya tidak mengemas pdftklagi karena tergantung pada gcj, untuk mana dukungan telah jatuh saya percaya. Meskipun mencari alat manipulasi pdf via pacman -Ss pdf, saya melewatkan ini. Terima kasih atas jawaban ini! Saya harus menerima lebih banyak upvotes, sehingga muncul tepat di sebelah saran untuk pdfuniteatau pdftk.
k.stm
1
Pada instalasi Linux Mint saya yang baru, ini berjalan di jendela Terminal tanpa memerlukan instalasi atau penyesuaian jalur. Bagus!
Wallace Kelly
Ini bekerja dengan sempurna dan juga memberikan dokumen gabungan yang lebih jelas bahwa perintah lain yang saya coba. Terima kasih untuk kirimannya.
Siwoku Adeola
14

Apache PDFBox http://pdfbox.apache.org/

PDFMerger Aplikasi ini akan mengambil daftar dokumen pdf dan menggabungkannya, menyimpan hasilnya dalam dokumen baru.

penggunaan: java -jar pdfbox-app-xyzjar PDFMerger "Sumber file PDF (2 ..n)" "Target file PDF"

lumpchen
sumber
11

Gunakan alat PDF dari python https://pypi.python.org/pypi/pdftools/1.0.6

Unduh file tar.gz dan buka kompres dan jalankan perintah seperti di bawah ini

python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3 

Anda harus menginstal pyhton3 sebelum Anda menjalankan perintah di atas

Alat ini mendukung hal-hal di bawah ini

  • Menambahkan
  • memasukkan
  • Menghapus
  • Memutar
  • Membagi
  • Menggabungkan
  • Zip

Anda dapat menemukan rincian lebih lanjut di tautan di bawah ini dan ini merupakan open source

https://github.com/MrLeeh/pdftools

Ravikiran Reddy Kotapati
sumber
Ini sempurna. Menggunakan gs(semua varian yang tercantum di atas), penggabungan sederhana dari dua PDF, 2MB dan 500Kb, membutuhkan waktu beberapa menit untuk diselesaikan dan menghasilkan file 40MB! pdftoolsmenyelesaikan secara instan dengan ukuran file yang identik.
supergra
10

Anda dapat menggunakan sejda-console , gratis dan open source. Buka zip dan jalankan sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Ini mempertahankan bookmark, anotasi tautan, acroforms dll. Sebenarnya memiliki cukup banyak opsi yang dapat Anda mainkan, jalankan sejda-console merge -huntuk melihat semuanya.

Andrea Vacondio
sumber
OMHO alat terbaik untuk melakukan jenis tugas ini
mario ruiz
8

Jika Anda ingin mengubah semua gambar yang diunduh menjadi satu pdf kemudian jalankan

convert img{0..19}.jpg slides.pdf

Trupti Kini
sumber
6
Jangan gunakan konversi untuk file postscript atau PDF kecuali Anda beralih dari vektor ke raster dan tidak pernah kembali. Sulit untuk melebih-lebihkan betapa buruknya ide ini.
markgalassi
6

Saya pdfunitemerekomendasikan kedua . Namun saya mendapatkan Argument list too longkesalahan karena saya mencoba untuk menggabungkan file PDF> 2k.

Saya beralih ke Python untuk ini dan dua paket eksternal: PyPDF2 (untuk menangani semua hal yang berhubungan dengan PDF) dan natsort (untuk melakukan semacam "alami" nama file direktori). Dalam hal ini dapat membantu seseorang:

from PyPDF2 import PdfFileMerger
import natsort
import os

DIR = "dir-with-pdfs/"
OUTPUT = "output.pdf"

file_list = filter(lambda f: f.endswith('.pdf'), os.listdir(DIR))
file_list = natsort.natsorted(file_list)

# 'strict' used because of
# https://github.com/mstamy2/PyPDF2/issues/244#issuecomment-206952235
merger = PdfFileMerger(strict=False)

for f_name in file_list:
  f = open(os.path.join(DIR, f_name), "rb")
  merger.append(f)

output = open(OUTPUT, "wb")
merger.write(output)
Greg Sadetsky
sumber
6
"Daftar argumen terlalu panjang" menunjukkan bahwa Anda memeriksa ukuran buffer yang dialokasikan shell untuk lingkungan - sebenarnya bukan batasan alat. Dalam kasus seperti itu, beralih ke Python mungkin berlebihan, karena Anda bisa batch: cari input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Ini akan membuat kumpulan 500 file yang diproses secara seri, membuat file sementara yang dihasilkan diurutkan dalam urutan yang benar. , dan menghasilkan file output yang sesuai; Anda harus membersihkan file sementara setelah)
enkiv2
4

Inilah metode yang saya gunakan yang berfungsi dan mudah diterapkan. Hal ini akan membutuhkan kedua fpdf dan FPDI perpustakaan yang dapat didownload di sini:

require('fpdf.php');
require('fpdi.php');

$files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf'];

$pdf = new FPDI();

foreach ($files as $file) {
    $pdf->setSourceFile($file);
    $tpl = $pdf->importPage(1, '/MediaBox');
    $pdf->addPage();
    $pdf->useTemplate($tpl);
}

$pdf->Output('F','merged.pdf');
billynoah
sumber
4

Saya bias menjadi salah satu pengembang PyMuPDF (pengikatan Python MuPDF).

Anda dapat dengan mudah melakukan apa yang Anda inginkan dengannya (dan banyak lagi). Kode kerangka berfungsi seperti ini:

#-------------------------------------------------
import fitz         # the binding PyMuPDF
fout = fitz.open()  # new PDF for joined output
flist = ["1.pdf", "2.pdf", ...]  # list of filenames to be joined

for f in flist:
    fin = fitz.open(f)  # open an input file
    fout.insertPDF(fin) # append f
    fin.close()

fout.save("joined.pdf")
#-------------------------------------------------

Itu saja. Beberapa opsi tersedia untuk memilih hanya rentang halaman, mempertahankan daftar isi bersama, membalik urutan halaman atau mengubah rotasi halaman, dll., Dll.

Kami berada di Pypi.

Jorj McKie
sumber
3

Saya suka ide Chasmo, tetapi saya lebih suka menggunakan kelebihan dari hal-hal seperti

convert $(ls *.pdf) ../merged.pdf

Memberi banyak file sumber untuk convertmengarahkan penggabungannya ke dalam pdf umum. Perintah ini menggabungkan semua file dengan .pdfekstensi di direktori aktual ke merged.pdfdalam direktori induk.

pengguna3709983
sumber
5
Mengingat betapa miripnya ini dengan pertanyaan awal, sepertinya ini seharusnya komentar, bukan jawaban. Dengan sedikit rep, Anda dapat memposting komentar . Sampai saat itu, tolong jangan gunakan jawaban sebagai solusinya.
Nathan Tuggy
1
@ Silfheed Tidak, itu menjawab pertanyaan! Meskipun jawabannya mungkin harus lebih diuraikan.
peterh
7
Jangan gunakan konversi untuk file postscript atau PDF kecuali Anda beralih dari vektor ke raster dan tidak pernah kembali. Sulit untuk melebih-lebihkan betapa buruknya ide ini.
markgalassi
13
Apa gunanya menggunakan $(ls *.pdf)wildcard sederhana *.pdf?
firegurafiku
Selain itu dengan mengacu pada jawaban @firegurafiku, dengan ls *.pdfwildcard Anda kehilangan kontrol atas urutan file yang digabungkan. Dalam sebuah contoh, daftar berikut: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf sebenarnya akan digabung seperti 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (karena cara pemesanan file Linux standar - di sini Anda memiliki detail lebih lanjut tentang masalah ini - stackoverflow.com/q/22948042/1977012 ).
Egel
0

Meskipun ini bukan solusi baris perintah, ini dapat membantu macospengguna:

  1. Pilih file PDF Anda
  2. Klik kanan pada file yang Anda sorot
  3. Pilih Tindakan cepat > Buat PDF
DevonDahon
sumber
0

Anda dapat melihat menggunakan pdftools sumber gratis dan terbuka (disclaimer: Saya adalah penulisnya).

Ini pada dasarnya adalah antarmuka Python ke pdfpagespaket Lateks .

Untuk menggabungkan file pdf satu per satu, Anda dapat menjalankan:

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

Untuk menggabungkan semua file pdf dalam direktori, Anda dapat menjalankan:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
raffaem
sumber