Birden çok PDF dosyasını tek bir PDF'ye birleştirin / dönüştürün


1069

Birden fazla PDF dosyasını tek bir büyük PDF dosyasına nasıl birleştirebilirim / dönüştürebilirim?

Aşağıdakileri denedim, ancak hedef dosyanın içeriği beklendiği gibi değildi:

convert file1.pdf file2.pdf merged.pdf

Çok basit / temel bir komut satırı (CLI) çözümüne ihtiyacım var. En iyisi, birleştirme / dönüştürmenin çıktısını doğrudan içine çevirebilseydim pdf2ps(başlangıçta burada daha önce sorduğum soruda denendiği gibi: Linux piping (convert -> pdf2ps -> lp) ).


3
ymmv, ancak bu çıktı dosyasında pdfunite kadar iyi bir çözünürlüğe sahip görünmüyor ve aynı zamanda pdfunite çıktısından daha büyük bir dosya boyutu ile sonuçlanıyor
sabujp


Bağlantılar bu çözümlerle korunup korunmadığında bu yazıda tartışılmaktadır . Bağlantıları korumak istiyorsanız (muhtemelen diğer ek açıklamalarla birlikte), komut satırı arayüzü istiyorsanız pdftk, grafik kullanıcı arayüzü istiyorsanız pdfsam, web arayüzü istiyorsanız sejda kullanın.
Clément

Yanıtlar:


1388

Düşünülürse pdfunitekullanım daha da kolaydır, Poppler parçası yüklü olması şansı daha yüksek olur ise pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf

20
Hızlı, ama köprüleri koparmış gibi görünüyor. Bkz. Blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen

425
Out.pdf dosyasını vermeyi unutmayın, aksi takdirde komutunuzdaki son dosyanın üzerine yazacaktır, iç çek.
mlissner

10
pdfunite paketi debian'da poppler-utils'tir ancak eski debian sürümlerinde mevcut olmayabilir.
Jocelyn delalande

16
Bunu tavsiye edemez. Ortaya çıkan PDF'nin boyutu çok büyük. Örneğin: Pdfunite bana 75MB dosya verirken Ghostscript her şeyi 1MB olarak paketliyor.
Torben

64
Bu pdfunite *.pdf out.pdfdizinde başka bir pdf bulunmadığını ve sıralarının "*" korunduğunu varsayarak kullanabilirsiniz . Korunmazsa, aralıkları kullanarak: filename_ {0..9} .pdf bunu çözer.
lepe

548

İyi ghostscript'i deneyin:

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

hatta düşük çözünürlüklü PDF'ler için geliştirilmiş bir sürüm için bu şekilde (bunu belirttiği için Adriano'ya teşekkürler):

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

Her iki durumda da çıkış çözünürlüğü, convert kullanarak bu yoldan çok daha yüksek ve daha iyidir:

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

Bu şekilde başka bir şey yüklemenize gerek kalmaz, sadece sisteminizde zaten yüklü olanlarla çalışın (en azından her ikisi de varsayılan olarak benim rhel'imde gelir).

Bu yardımcı olur umarım,

GÜNCELLEME: her şeyden önce tüm güzel yorumlarınız için teşekkürler !! sadece sizin için işe yarayabilir bir ipucu, googling sonra, PDF'lerin boyutunu küçültmek için mükemmel bir hile buldum, onunla 300 MB'lık bir PDF'yi kabul edilebilir bir çözünürlükle sadece 15 MB'a indirdim! ve tüm bunlar iyi ghostscript ile, işte burada:

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

şerefe !!


27
Güzel uç, gsçok hızlı çalışır ve çok sıkıştırır. Ancak, bu param kullandıktan sonra kalite çok gelişti:-dPDFSETTINGS=/prepress
Adriano P

3
Bunun -dPDFSETTINGS=/prepress, çok geniş olan ve can sıkıcı yatay kaydırma çubuklarını zorlayan sayfaları döndürmenin çok güzel bir etkisi olduğunu buldum .
Robert Smith

24
Aşağıdaki satırı ekleyin .bash_profileve hoş bir kısayol var: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Komutu çok kullanmanız gerekiyorsa, bu size bazı yazımlar kazandırır. Kullanım şöyle görünür:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben

2
-DBATCH bayrağı için açıklama bulmaya çalıştım ama yapamadım. Erkek gs bile hiçbir şey söylemez. Ama harika ve herhangi bir ek program olmadan!
Michal Gonda

3
İçin gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfkısaltılabilir gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Gönderen Belgeleri : "kullanabileceğiniz kullanışlı bir stenografi olarak -oyukarıda tartışıldığı gibi bir seçenek çıktı dosyası şartname takip eder. -oSeçeneği de belirler -dBATCHve -dNOPAUSEseçenekler Bu çağırmak için hızlı bir yol olması amaçlanmıştır. ghostscriptBir veya daha fazla giriş dosyaları dönüştürün."
MiniMax

513

Özür dilerim, cevabı kendim google ve biraz şans kullanarak bulmayı başardım:)

İlgilenenler için;

Dedf sunucumuza pdftk (pdf araç seti) kurdum ve aşağıdaki komutu kullanarak istenen çıktıyı elde ettim:

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

VEYA

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

Bu da doğrudan pdf2ps'ye bağlanabilir.


81
Ghostscript kullanmak da işe yarayabilir: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl

15
Pdfftite cant iken pdftk şifreli pdfs birleştirebilirsiniz bahsetmeye değer
Thomas

3
pdftk ile daha iyi çözünürlük sağlar.
Kiran K Telukunta

13
pdftk file1.pdf file2.pdf cat output out.pdfbirleştirilmiş dosyayı çıktı olarakout.pdf
jmiserez

2
pdftkbağımlılık nedeniyle EL7 sistemleri için mevcut değildir libgcj.
bir kodlayıcı

72

Birden fazla dosyanız varsa ve adları tek tek yazmak istemiyorsanız bu en kolay çözümdür:

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


2
Bu şimdiye kadarki en kolay gibi görünüyor
baxx

1
qpdf, belgedeki köprüleri yıkıyor gibi görünüyor
David Granqvist

2
Başlamak için başınıza karmaşık seçenekler bulmak zor olsa da, qpdf çok kullanışlı ve güçlü bir araçtır. Online dokümantasyon burada
Jonathan Holvey

Kesinlikle en kullanışlı!
Şanslı

54

Ayrıca a.pdf ve b.pdf içeriği ile pdfjoin a.pdf b.pdfyeni bir b-joined.pdfdosya oluşturacak


5
Bu güzel ve özlüdür, ancak köprüleri koparır.
parlak yıldız

3
pdfjoin (pdflatex) çok sayfalı dosyalarda başarısız oluyor. 1k sayfa dosyalarıyla birleştirilemedi.
mdrozdziel

pdfjoin ek açıklamaları veya ek grafik olmayan öğeleri
kırıyor

"URW Palladio L" yazı tipi sayfaları pdf'ye ekledikten sonra görünmez oldu.
v_2e

9
pdfunite genellikle iyi çalışır, ancak "Uygulanmayan Özellik: Şifrelenmiş dosyalar birleştirilemedi" yazıyorsa, pdfjoin güzel bir alternatiftir. Hangi nedenle olursa olsun, pdfjoin şifrelemeden şikayet etmez.
Calaf

38

Convert komutunu doğrudan kullanabilirsiniz,

Örneğin

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf

40
Bu kayıpsız değil.
Ben Ruijl

12
Yapabilirsiniz convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, ancak ortaya çıkan dosya boyutu çok büyük olabilir. Bunun convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfyerine öneririm .
arielnmz

21
Bu, her şeyi raster görüntülere dönüştürmeyi içerir, öyle görünüyor ki, özellikle metin tabanlı PDF'lerle uğraşırken kesinlikle en iyisi değil.
Pterosaur

5
OP'nin çalışmadığı şeylerin neredeyse bir kopyası
user829755

15
Vektörden rasterlere geçip asla geri dönmediğiniz sürece postscript veya PDF dosyaları için convert kullanmayın. Bunun ne kadar kötü bir fikir olduğunu abartmak zor.
markgalassi

32

pdfunitetüm PDF'leri birleştirmek iyidir. Örneğin, dosya1.pdf dosyasındaki 2-7. Sayfalar ve dosya2.pdf dosyasından 1,3,4. Sayfalar istiyorsanız pdfseparate, dosyaları verilecek her sayfa için ayrı PDF'lere bölmek için kullanmanız gerekir pdfunite.

Bu noktada muhtemelen daha fazla seçeneğe sahip bir program istiyorsunuz. qpdfPDF'leri işlemek için bulduğum en iyi yardımcı program. pdftkdaha büyük ve daha yavaş ve Red Hat / Fedora, gcj'ye bağımlı olması nedeniyle paketlemiyor. Diğer PDF yardımcı programlarının Mono veya Python bağımlılıkları vardır. Ben bulundu qpdfkullanarak çok daha küçük çıkış dosyası üretilmiş pdfseparateve pdfunite30 sayfalık çıktı PDF, 970KB vs 1,6450 kB içine sayfaları birleştirmek için. Çok daha fazla seçenek sunduğundan, qpdfkomut satırı basit değildir; orijinal dosya1 ve dosya2 birleştirmek için istek

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf

2
Çok fazla. Mesela Parabol , desteğinin düştüğü pdftkbağımlılığı nedeniyle artık paketlenmiyor gcj. Üzerinden pdf manipülasyon araçları aramasına rağmen pacman -Ss pdf, bunu kaçırdım. Bu cevap için teşekkürler! Daha fazla oy almalıyım, bu yüzden pdfuniteveya için önerilerin hemen yanında görünür pdftk.
k.stm

1
Yeni Linux Mint kurulumumda, herhangi bir kurulum veya yol ayarlaması gerekmeden Terminal penceresinde koştu. Güzel!
Wallace Kelly

Bu mükemmel çalıştı ve aynı zamanda denediğim diğer komutların daha net birleştirilmiş bir belge verdi. Gönderi için teşekkürler.
Siwoku Adeola

14

Apache PDF Kutusu http://pdfbox.apache.org/

PDFMerger Bu uygulama, pdf belgelerinin bir listesini alacak ve birleştirerek sonucu yeni bir belgeye kaydedecektir.

use: java -jar pdfbox-app-xyzjar PDFMerger "Kaynak PDF dosyaları (2 ..n)" "Hedef PDF dosyası"


11

Python https://pypi.python.org/pypi/pdftools/1.0.6 adresindeki PDF araçlarını kullanın

Tar.gz dosyasını indirin ve açın ve aşağıdaki gibi komutu çalıştırın

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

Yukarıdaki komutu çalıştırmadan önce pyhton3'ü yüklemelisiniz

Bu araçlar aşağıdakileri destekler

  • Ekle
  • insert
  • Kaldırmak
  • Döndürme
  • Bölünmüş
  • Birleştirmek
  • Zip

Aşağıdaki linkte daha fazla detay bulabilirsiniz ve açık kaynak kodludur.

https://github.com/MrLeeh/pdftools


Bu harika. Kullanılması gskomple dakika alıp bir 40MB dosyasında sonuçlanan, (her şeyden listelenen varyantları) iki PDF, 2MB ve 500 KB basit bir birleştirme oldu! pdftoolshemen aynı dosya boyutuyla tamamlanır.
supergra

10

Sen kullanabilirsiniz sejda-konsolu , ücretsiz ve açık kaynak. Sıkıştırın ve çalıştırın sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Yer imlerini, bağlantı ek açıklamalarını, akroformları vb. Korur. Aslında oynayabileceğiniz birçok seçenek var, sejda-console merge -hhepsini görmek için çalıştırın .


OMHO bu tür görevleri yapmak için en iyi araçtır
mario ruiz

8

İndirilen tüm görüntüleri tek bir pdf'ye dönüştürmek istiyorsanız,

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


6
Vektörden rasterlere geçip asla geri dönmediğiniz sürece postscript veya PDF dosyaları için convert kullanmayın. Bunun ne kadar kötü bir fikir olduğunu abartmak zor.
markgalassi

6

pdfuniteTavsiye ikinci . Ancak Argument list too long,> 2k PDF dosyalarını birleştirmeye çalıştığımda hata alıyordum .

Bu ve iki harici paket için Python'a döndüm : PyPDF2 (PDF ile ilgili her şeyi işlemek için) ve natsort (dizinin dosya adlarının "doğal" bir türünü yapmak için). Bu birine yardımcı olabilirse:

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)

6
"Bağımsız değişken listesi çok uzun", kabuğun ortam için ayrılan arabellek boyutunu aştığınızı gösterir - aslında aracın bir sınırlaması değildir. Böyle bir durumda, sadece toplu iş yapabileceğiniz için Python'a geçiş aşırıya kaçabilir: find input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" date +%soutput- .pdf' && pdfunite output - *. pdf output.pdf (Seri olarak işlenen 500 dosyalık gruplar oluşturur, sonuçta elde edilen geçici dosyaların doğru sırada sıralanmasını sağlar ve uygun bir çıktı dosyası oluşturun; sonra geçici dosyaları temizlemeniz gerekir)
enkiv2

4

İşte işe yarayan ve uygulanması kolay bir yöntem. Bu, hem gerektirecektir FPDF ve fpdi buradan indirilebilir kütüphaneleri:

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');

4

PyMuPDF (MuPDF'nin bir Python bağlaması) geliştiricilerinden biri olduğum için önyargılıyım.

İstediğinizi (ve daha fazlasını) kolayca yapabilirsiniz. İskelet kodu şu şekilde çalışır:

#-------------------------------------------------
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")
#-------------------------------------------------

Bu kadar. Yalnızca sayfa aralıklarını seçmek, bir içindekiler tablosunu korumak, sayfa sırasını tersine çevirmek veya sayfa döndürmeyi değiştirmek vb. İçin çeşitli seçenekler mevcuttur.

PyPi'deyiz.


3

Chasmo fikrini seviyorum, ancak bunun gibi avantajları kullanmayı tercih ediyorum

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

Birden fazla kaynak dosyası vermek convert, onları ortak bir pdf olarak birleştirmeye yol açar. Bu komut .pdf, gerçek dizinde uzantıya sahip tüm dosyaları merged.pdfüst dizinde birleştirir .


5
Bunun orijinal soruya ne kadar benzediği göz önüne alındığında, bunun bir cevap değil, bir yorum olması gerektiği anlaşılıyor. Biraz daha temsilcisi ile yorum gönderebileceksiniz . O zamana kadar, lütfen cevapları geçici çözüm olarak kullanmayın.
Nathan Tuggy

1
@Silfheed Hayır, bu soruya cevap veriyor! Her ne kadar cevap belki daha ayrıntılı olmalıydı.
peterh - Monica'yı

7
Vektörden rasterlere geçip asla geri dönmediğiniz sürece postscript veya PDF dosyaları için convert kullanmayın. Bunun ne kadar kötü bir fikir olduğunu abartmak zor.
markgalassi

13
$(ls *.pdf)Basit joker karakter yerine kullanmanın anlamı nedir *.pdf?
firegurafiku

Ayrıca @firegurafiku cevabına atıfta bulunarak, ls *.pdfjoker karakter ile birleştirilmiş dosyaların sırası üzerinde bir kontrolü kaybedersiniz. Bir örnekte aşağıdaki liste: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf aslında 1.pdf, 10.pdf, 100 gibi birleştirilecektir. pdf, 2.pdf, 3.pdf (varsayılan Linux dosya siparişi nedeniyle - burada bu sorun hakkında daha fazla ayrıntı var - stackoverflow.com/q/22948042/1977012 ).
Egel

0

Bir komut satırı çözümü olmasa da, macoskullanıcılara yardımcı olabilir :

  1. PDF dosyalarınızı seçin
  2. Vurgulanan dosyalarınızı sağ tıklayın
  3. Hızlı işlemler > PDF oluştur'u seçin

0

Ücretsiz ve açık kaynak kodlu pdftools'u kullanabilirsiniz (feragatname: Ben yazarım).

Temelde Lateks pdfpagespaketine bir Python arayüzüdür .

PDF dosyalarını tek tek birleştirmek için şunları çalıştırabilirsiniz:

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

Bir dizindeki tüm pdf dosyalarını birleştirmek için şunları çalıştırabilirsiniz:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.