Hợp nhất / chuyển đổi nhiều tệp PDF thành một tệp PDF


1071

Làm cách nào tôi có thể hợp nhất / chuyển đổi nhiều tệp PDF thành một tệp PDF lớn?

Tôi đã thử như sau, nhưng nội dung của tệp mục tiêu không như mong đợi:

convert file1.pdf file2.pdf merged.pdf

Tôi cần một giải pháp dòng lệnh (CLI) rất đơn giản / cơ bản. Tốt nhất là nếu tôi có thể chuyển đầu ra của hợp nhất / chuyển đổi thành pdf2ps(như đã cố gắng ban đầu trong câu hỏi đã hỏi trước đây của tôi ở đây: đường ống Linux (convert -> pdf2ps -> lp) ).


3
ymmv, nhưng điều này dường như không có độ phân giải trong tệp đầu ra như pdfunite và nó cũng dẫn đến kích thước tệp lớn hơn đầu ra từ pdfunite
sabujp


Bất cứ khi nào các liên kết được bảo tồn hoặc không bởi các giải pháp được thảo luận trong bài viết này . Nếu bạn muốn giữ các liên kết (có thể cùng với các chú thích khác), hãy sử dụng pdftk nếu muốn giao diện dòng lệnh, pdfsam nếu bạn muốn giao diện người dùng đồ họa, sejda nếu bạn muốn giao diện web.
Clément

Câu trả lời:


1389

Xem xét rằng đó pdfunitelà một phần của poppler, nó có cơ hội được cài đặt cao hơn, việc sử dụng cũng đơn giản hơn pdftk:

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

20
Nó là nhanh, nhưng nó dường như phá vỡ các siêu liên kết. Xem blog.dbrgn.ch/2013/8/14/merge-mult Môn
Danilo Bargen

426
Chỉ cần đảm bảo rằng bạn nhớ cung cấp out.pdf, nếu không nó sẽ ghi đè lên tệp cuối cùng trong lệnh của bạn, thở dài.
mlissner

10
gói cho pdfunite là poppler-utils trong debian nhưng có thể không có trong các bản phát hành debian cũ.
Jocelyn delalande

16
Không thể đề nghị này. Kích thước của tệp PDF kết quả là quá lớn. Ví dụ: Pdfunite cung cấp cho tôi tệp 75MB trong khi Ghostscript đóng gói mọi thứ thành 1MB.
Torben

64
Bạn có thể sử dụng: pdfunite *.pdf out.pdfgiả sử không có pdf nào khác tồn tại trong thư mục đó và thứ tự của chúng được giữ nguyên bởi "*". Nếu nó không được bảo tồn, sử dụng phạm vi: filename_ {0..9} .pdf sẽ giải quyết nó.
Lepe

549

Hãy thử bản ghostscript tốt:

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

hoặc thậm chí theo cách này cho một phiên bản cải tiến cho các tệp PDF có độ phân giải thấp (cảm ơn Adriano đã chỉ ra điều này):

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

Trong cả hai trường hợp, độ phân giải ouput cao hơn và tốt hơn nhiều so với cách sử dụng convert này:

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

Theo cách này, bạn sẽ không cần phải cài đặt bất cứ thứ gì khác, chỉ cần làm việc với những gì bạn đã cài đặt trong hệ thống của bạn (ít nhất là cả hai đều được mặc định trong rrc của tôi).

Hi vọng điêu nay co ich,

CẬP NHẬT: đầu tiên cảm ơn tất cả các ý kiến ​​tốt đẹp của bạn !! chỉ là một mẹo có thể hiệu quả với các bạn, sau khi googling, tôi đã tìm thấy một mẹo tuyệt vời để thu nhỏ kích thước của các tệp PDF, tôi đã giảm với một tệp PDF 300 MB xuống chỉ còn 15 MB với độ phân giải chấp nhận được! và tất cả những điều này với bản ghostscript tốt, đây là:

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

chúc mừng !!


27
Mẹo hay, gschạy rất nhanh và nén rất nhiều. Tuy nhiên, chất lượng được cải thiện rất nhiều sau khi tôi sử dụng thông số này:-dPDFSETTINGS=/prepress
Adriano P

3
Tôi thấy rằng -dPDFSETTINGS=/prepresscó hiệu ứng rất đẹp của các trang xoay quá rộng và buộc các thanh cuộn ngang khó chịu.
Robert Smith

24
Thêm dòng sau vào của bạn .bash_profilevà bạn có một phím tắt đẹp: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Điều này giúp bạn tiết kiệm một số thao tác gõ, nếu bạn phải sử dụng lệnh nhiều. Cách sử dụng trông như thế này:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben

2
Tôi đã cố gắng tìm mô tả cho cờ -dBATCH nhưng không thể. Ngay cả người đàn ông gs cũng không nói gì. Nhưng tuyệt vời và không có bất kỳ chương trình bổ sung!
Michal Gonda

3
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfthể rút ngắn thành gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Từ Tài liệu : "Là một tốc ký thuận tiện, bạn có thể sử dụng -otùy chọn theo sau là đặc tả tệp đầu ra như đã thảo luận ở trên. -oTùy chọn này cũng đặt các tùy chọn -dBATCH-dNOPAUSEtùy chọn. Đây là một cách nhanh chóng để gọi ghostscriptđể chuyển đổi một hoặc nhiều tệp đầu vào."
MiniMax

513

Tôi xin lỗi, tôi đã tự mình tìm ra câu trả lời bằng cách sử dụng google và một chút may mắn :)

Đối với những người quan tâm;

Tôi đã cài đặt pdftk (bộ công cụ pdf) trên máy chủ debian của chúng tôi và sử dụng lệnh sau tôi đã đạt được đầu ra mong muốn:

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

HOẶC LÀ

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

Điều này đến lượt nó có thể được dẫn trực tiếp vào pdf2ps.


81
Sử dụng ghostscript cũng có thể hoạt động: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl

15
Điều đáng nói là pdftk có thể hợp nhất các pdf được mã hóa trong khi pdfunite không thể
Thomas

3
cung cấp độ phân giải tốt hơn với pdftk so với chuyển đổi trong các tùy chọn mặc định.
Kiran K Telukunta

13
pdftk file1.pdf file2.pdf cat output out.pdfsẽ xuất ra tệp được hợp nhất dưới dạngout.pdf
jmiserez

2
pdftkkhông có sẵn cho các hệ thống EL7 do thiếu phụ thuộc libgcj.
một lập trình viên

72

Đây là giải pháp đơn giản nhất nếu bạn có nhiều tệp và không muốn nhập từng tên một:

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


2
điều này có vẻ là dễ nhất cho đến nay
baxx

1
qpdf dường như phá vỡ các siêu liên kết trong tài liệu
David Granqvist

2
Mặc dù khó khăn để bắt đầu với các tùy chọn phức tạp để bắt đầu, qpdf là một công cụ rất tiện dụng và mạnh mẽ. Tài liệu trực tuyến có sẵn ở đây
Jonathan Holvey

Chắc chắn là tiện dụng nhất!
May mắn

54

Cũng pdfjoin a.pdf b.pdfsẽ tạo một cái mới b-joined.pdfvới nội dung của a.pdf và b.pdf


5
Điều này là tốt đẹp và cô đọng, nhưng phá vỡ các siêu liên kết.
ngôi sao sáng

3
pdfjoin (pdflatex) không thành công với các tệp có nhiều trang. Không thể hợp nhất các tệp 1k trang.
mdrozdziel

pdfjoin phá vỡ các chú thích hoặc các mục không phải đồ họa bổ sung
sabujp

Phông chữ "URW Palladio L" trở nên vô hình sau khi pdf vào các trang.
v_2e

9
pdfunite thường hoạt động tốt, nhưng nếu nó nói "Tính năng chưa thực hiện: Không thể hợp nhất các tệp được mã hóa", pdfjoin là một lựa chọn tốt. Vì lý do nào, pdfjoin không phàn nàn về mã hóa.
Calaf

38

Bạn có thể sử dụng lệnh convert trực tiếp,

ví dụ

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

40
Đây không phải là mất mát.
Ben Ruijl

12
Bạn có thể convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, nhưng kích thước tệp kết quả có thể quá lớn. Tôi muốn đề nghị convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfthay thế.
arielnmz

21
Điều này liên quan đến việc chuyển đổi mọi thứ thành hình ảnh raster, dường như, đây chắc chắn không phải là tốt nhất, đặc biệt là khi xử lý các tệp PDF dựa trên văn bản.
Pterizard

5
gần như một bản sao của những gì OP đã mô tả là không hoạt động
user829755

15
Không sử dụng chuyển đổi cho các tập tin postcript hoặc PDF trừ khi bạn đi từ vector sang raster và không bao giờ quay trở lại. Thật khó để nói quá những gì một ý tưởng tồi này là.
markgalassi

32

pdfunitevẫn ổn để hợp nhất toàn bộ tệp PDF. Ví dụ: nếu bạn muốn các trang 2-7 từ file1.pdf và các trang 1,3,4 từ file2.pdf, bạn phải sử dụng pdfseparateđể chia các tệp thành các tệp PDF riêng biệt cho mỗi trang để cung cấp pdfunite.

Tại thời điểm đó bạn có thể muốn một chương trình với nhiều lựa chọn hơn. qpdflà tiện ích tốt nhất tôi tìm thấy để thao tác các tệp PDF. pdftklớn hơn và chậm hơn và Red Hat / Fedora không đóng gói vì phụ thuộc vào gcj. Các tiện ích PDF khác có phụ thuộc Mono hoặc Python. Tôi thấy qpdfsản xuất một tệp đầu ra nhỏ hơn nhiều so với sử dụng pdfseparatepdfuniteđể tập hợp các trang thành tệp PDF đầu ra 30 trang, 970kB so với 1.6450 kB. Bởi vì nó cung cấp nhiều tùy chọn hơn, qpdfdòng lệnh của nó không đơn giản; yêu cầu ban đầu để hợp nhất file1 và file2 có thể được thực hiện với

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

2
Rất nhiều điều này. Ví dụ, Parabola không còn gói pdftknữa vì phụ thuộc vào nó gcj, tôi đã bỏ hỗ trợ. Mặc dù tìm kiếm các công cụ thao tác pdf thông qua pacman -Ss pdf, tôi đã bỏ lỡ điều này. Cảm ơn câu trả lời này! Tôi sẽ nhận được nhiều cách nâng cấp hơn, vì vậy nó xuất hiện ngay bên cạnh các đề xuất cho pdfunitehoặc pdftk.
k.stm

1
Trên bản cài đặt Linux Mint mới của tôi, cái này chạy trong cửa sổ Terminal mà không yêu cầu bất kỳ cài đặt hay điều chỉnh đường dẫn nào. Đẹp!
Wallace Kelly

Điều này hoạt động hoàn hảo và cũng cho một tài liệu hợp nhất rõ ràng hơn mà các lệnh khác tôi đã thử. Cảm ơn vì bài đăng.
Siwoku Adeola

14

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

PDFMerger Ứng dụng này sẽ lấy một danh sách các tài liệu pdf và hợp nhất chúng, lưu kết quả vào một tài liệu mới.

cách sử dụng: java -jar pdfbox-app-xyzjar PDFMerger "Nguồn tệp PDF (2 ..n)" "Tệp PDF đích"


11

Sử dụng các công cụ PDF từ python https://pypi.python.org/pypi/pdftools/1.0.6

Tải xuống tệp tar.gz và giải nén nó và chạy lệnh như dưới đây

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

Bạn nên cài đặt pyhton3 trước khi chạy lệnh trên

Công cụ này hỗ trợ dưới đây

  • thêm vào
  • chèn
  • Tẩy
  • Quay
  • Tách
  • Hợp nhất
  • Zip

Bạn có thể tìm thêm chi tiết trong liên kết dưới đây và nó là nguồn mở

https://github.com/MrLeeh/pdftools


Đây là hoàn hảo. Sử dụng gs(tất cả các biến thể được liệt kê ở trên), một sự hợp nhất đơn giản của hai tệp PDF, 2MB và 500Kb, đã mất vài phút để hoàn thành và dẫn đến một tệp 40 MB! pdftoolshoàn thành ngay lập tức với kích thước tập tin giống hệt nhau.
supergra

10

Bạn có thể sử dụng sejda-console , mã nguồn mở và miễn phí. Giải nén nó và chạy sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Nó bảo tồn dấu trang, chú thích liên kết, acroforms, v.v. nó thực sự có khá nhiều tùy chọn bạn có thể chơi, chỉ cần chạy sejda-console merge -hđể xem tất cả.


OMHO công cụ tốt nhất để thực hiện các loại nhiệm vụ này
mario ruiz

8

Nếu bạn muốn chuyển đổi tất cả các hình ảnh được tải xuống thành một pdf thì thực hiện

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


6
Không sử dụng chuyển đổi cho các tập tin postcript hoặc PDF trừ khi bạn đi từ vector sang raster và không bao giờ quay trở lại. Thật khó để nói quá những gì một ý tưởng tồi này là.
markgalassi

6

Tôi thứ hai pdfuniteđề nghị. Tuy nhiên, tôi đã gặp Argument list too longlỗi khi tôi cố gắng hợp nhất các tệp PDF> 2k.

Tôi đã chuyển sang Python cho gói này và hai gói bên ngoài: PyPDF2 (để xử lý tất cả những thứ liên quan đến PDF) và natsort (để thực hiện một loại "tên tự nhiên" của tên tệp của thư mục). Trong trường hợp điều này có thể giúp ai đó:

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
"Danh sách đối số quá dài" biểu thị rằng bạn đang vượt qua kích thước bộ đệm được phân bổ của shell cho môi trường - đó thực sự không phải là giới hạn của công cụ. Trong trường hợp như vậy, việc chuyển sang Python có thể là quá mức cần thiết, vì bạn chỉ có thể bó: tìm đầu vào -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Điều này sẽ tạo ra các lô 500 tệp được xử lý theo kiểu seri, tạo ra các tệp tạm thời sắp xếp theo đúng thứ tự và tạo một tệp đầu ra thích hợp, bạn sẽ cần dọn sạch các tệp tạm thời sau)
enkiv2

4

Đây là một phương pháp tôi sử dụng để làm việc và dễ thực hiện. Điều này sẽ yêu cầu cả thư viện fpdffpdi có thể được tải xuống ở đây:

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

Tôi thiên vị là một trong những nhà phát triển của PyMuPDF (một ràng buộc Python của MuPDF).

Bạn có thể dễ dàng làm những gì bạn muốn với nó (và nhiều hơn nữa). Bộ xương hoạt động như thế này:

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

Đó là về nó. Một số tùy chọn có sẵn để chỉ chọn phạm vi trang, duy trì một bảng mục lục chung, đảo ngược trình tự trang hoặc thay đổi xoay trang, v.v., v.v.

Chúng tôi đang trên PyPi.


3

Tôi thích ý tưởng về Chasmo, nhưng tôi thích sử dụng những lợi thế của những thứ như

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

Đưa ra nhiều tệp nguồn để convertdẫn đến việc hợp nhất chúng thành một tệp pdf phổ biến. Lệnh này hợp nhất tất cả các tệp có .pdfphần mở rộng trong thư mục thực tế vào merged.pdftrong thư mục mẹ.


5
Cho rằng nó giống với câu hỏi ban đầu như thế nào, có vẻ như đây nên là một bình luận, không phải là một câu trả lời. Với một chút đại diện, bạn sẽ có thể gửi bình luận . Cho đến lúc đó, xin vui lòng không sử dụng câu trả lời như một cách giải quyết.
Nathan Tuggy

1
@Silfheed Không, nó trả lời câu hỏi! Mặc dù câu trả lời có lẽ nên có nhiều chi tiết hơn.
peterh - Phục hồi Monica

7
Không sử dụng chuyển đổi cho các tập tin postcript hoặc PDF trừ khi bạn đi từ vector sang raster và không bao giờ quay trở lại. Thật khó để nói quá những gì một ý tưởng tồi này là.
markgalassi

13
Điểm sử dụng $(ls *.pdf)thay cho ký tự đại diện đơn giản là *.pdfgì?
firegurafiku

Ngoài ra với tham chiếu đến câu trả lời @firegurafiku, với ls *.pdfký tự đại diện, bạn sẽ mất quyền kiểm soát thứ tự các tệp được hợp nhất. Trong một ví dụ, danh sách sau: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf sẽ thực sự được hợp nhất như 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (do cách đặt hàng tệp mặc định của Linux - ở đây bạn có thêm chi tiết về vấn đề này - stackoverflow.com/q/22948042/1977012 ).
Egel

0

Mặc dù đây không phải là giải pháp dòng lệnh, nhưng nó có thể giúp macosngười dùng:

  1. Chọn tệp PDF của bạn
  2. Nhấp chuột phải vào các tập tin được tô sáng của bạn
  3. Chọn Thao tác nhanh > Tạo PDF

0

Bạn có thể thấy sử dụng các pdftools miễn phí và mã nguồn mở (từ chối trách nhiệm: Tôi là tác giả của nó).

Về cơ bản, nó là một giao diện Python cho latex pdfpages gói .

Để hợp nhất từng tệp pdf, bạn có thể chạy:

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

Để hợp nhất tất cả các tệp pdf trong một thư mục, bạn có thể chạy:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.