Об'єднання / перетворення декількох файлів PDF в один PDF


1069

Як я міг об'єднати / перетворити декілька файлів PDF в один великий PDF-файл?

Я спробував наступне, але вміст цільового файлу був не таким, як очікувалося:

convert file1.pdf file2.pdf merged.pdf

Мені потрібно дуже просте / базове рішення командного рядка (CLI). Найкраще, якби я міг передати висновок злиття / перетворення прямо в pdf2ps(як спочатку було зроблено в моєму раніше заданому питанні: Linux piping (convert -> pdf2ps -> lp) ).


3
ymmv, але це, мабуть, не має такої гарної роздільної здатності у вихідному файлі, як pdfunite, і це також призводить до того, що розмір файлу перевищує вихід з pdfunite
sabujp


Кожен раз, коли посилання зберігаються чи не ці рішення обговорюються в цій публікації . Якщо ви хочете зберегти посилання (можливо, разом з іншими анотаціями), використовуйте pdftk, якщо потрібно інтерфейс командного рядка, pdfsam, якщо ви хочете графічний інтерфейс користувача, sejda, якщо ви хочете веб-інтерфейс.
Клімент

Відповіді:


1387

Зважаючи на те, що pdfuniteце частина poppler, вона має більший шанс встановити, використання також простіше, ніж pdftk:

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

20
Це швидко, але, здається, порушує гіперпосилання. Дивіться blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Данило Барген

425
Просто переконайтеся, що ви пам'ятаєте надати out.pdf, інакше він замінить останній файл у вашій команді, зітхніть.
mlissner

10
Пакет для pdfunite є poppler-utils в debian, але він може бути відсутнім у старих випусках debian.
Jocelyn delalande

16
Не можу рекомендувати цього. Розмір отриманого PDF дуже великий. Наприклад: Pdfunite дає мені файл 75 МБ, тоді як Ghostscript запаковує все в 1 Мб.
Торбен

64
Ви можете використовувати: pdfunite *.pdf out.pdfякщо припустити, що в цьому каталозі не існує жодного іншого pdf-файлу, а їх порядок зберігається "*". Якщо його не збережено, використовуючи діапазони: ім'я файлу_ {0..9} .pdf вирішує його.
lepe

548

Спробуйте добрий привид:

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

або навіть таким чином для покращеної версії PDF з низькою роздільною здатністю (завдяки Adriano, що вказав на це):

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

В обох випадках роздільна здатність вихідного сигналу набагато вище і краща, ніж цей спосіб за допомогою перетворення:

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

У такий спосіб вам не потрібно було б нічого інсталювати, просто працюйте з тим, що ви вже встановили у вашій системі (принаймні обидва приходять за замовчуванням у моєму релізі).

Сподіваюся, це допомагає,

ОНОВЛЕННЯ: насамперед дякую за всі ваші приємні коментарі !! просто порада, яка може працювати для вас, хлопці, після гуглінгу я знайшов чудовий трюк, щоб зменшити розмір PDF-файлів, я зменшив за допомогою нього один PDF у 300 МБ до всього 15 Мб з прийнятною роздільною здатністю! і все це з хорошим скриптом привидів, ось воно:

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

ура !!


27
Хороший наконечник, gsпрацює дуже швидко і сильно стискає. Однак якість значно покращилася після використання цього парамуму:-dPDFSETTINGS=/prepress
Adriano P

3
Я виявив, що -dPDFSETTINGS=/prepressце дуже приємно впливає на обертання сторінок, які є занадто широкими і змушують дратувати горизонтальні смуги прокрутки.
Роберт Сміт

24
Додайте до свого рядка наступний рядок, .bash_profileі у вас є хороший ярлик: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Це заощадить певний текст, якщо вам доведеться багато використовувати команду. Використання виглядає приблизно так:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben

2
Я намагався знайти опис прапора -dBATCH, але не зміг. Навіть людина gs нічого не каже. Але чудово і без додаткових програм!
Міхал Гонда

3
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfМоже бути скорочений до gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. З Документації : "В якості зручної стенограми ви можете скористатися -oопцією, за якою слідує специфікація вихідного файлу, як обговорювалося вище. -oОпція також встановлює параметри -dBATCHта -dNOPAUSEпараметри. Це призначено для швидкого виклику ghostscriptдля перетворення одного або декількох вхідних файлів."
MiniMax

513

Вибачте, мені вдалося знайти відповідь за допомогою google та трохи удачі:)

Для зацікавлених;

Я встановив pdftk (pdf toolkit) на наш сервер debian, і за допомогою наступної команди я досяг бажаного результату:

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

АБО

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

Це, в свою чергу, може бути передано безпосередньо в pdf2ps.


81
Використання Ghostscript також може спрацювати: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Нейт Кол

15
Варто зазначити, що pdftk може об'єднати зашифровані pdfs, тоді як pdfunite cant
Томас

3
дає кращу роздільну здатність з pdftk порівняти для конвертування у параметри за замовчуванням.
Кіран К Телукунта

13
pdftk file1.pdf file2.pdf cat output out.pdfвиведе об’єднаний файл якout.pdf
jmiserez

2
pdftkнедоступний для систем EL7 через відсутність залежності libgcj.
кодер

72

Це найпростіше рішення, якщо у вас є кілька файлів і не хочете вводити імена по черзі:

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


2
це здається найпростішим на сьогоднішній день
baxx

1
qpdf, здається, порушує гіперпосилання в документі
Девід Гранквіст

2
Незважаючи на те, що важко обійти складні варіанти для початку, qpdf - це дуже зручний і потужний інструмент. Онлайн-документація доступна тут
Джонатан Холві

Однозначно найзручніше!
Пощастило

54

Також pdfjoin a.pdf b.pdfбуде створено нове b-joined.pdfзі змістом a.pdf та b.pdf


5
Це приємно і лаконічно, але порушує гіперпосилання.
яскрава зірка

3
pdfjoin (pdflatex) не підтримує файли з великою кількістю сторінок. Не вдалося об'єднати файли на 1 к. Сторінок.
mdrozdziel

pdfjoin розбиває анотації або додаткові не графічні елементи
sabujp

Шрифт "URW Palladio L" став непомітним після pdfjoin'ing сторінок.
v_2e

9
pdfunite зазвичай працює добре, але якщо на ньому написано "Невиконана функція: Не вдалося об'єднати зашифровані файли", pdfjoin - це приємна альтернатива. З будь-якої причини pdfjoin не скаржиться на шифрування.
Калаф

38

Ви можете використовувати команду перетворення безпосередньо,

напр

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

40
Це не без втрат.
Ben Ruijl

12
Можна convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, але розмір отриманого файлу може бути занадто великим. Я б convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfзамість цього запропонував .
arielnmz

21
Це передбачає перетворення всього на растрові зображення, здається, що, безумовно, не найкраще, особливо коли мова йде про текстові PDF-файли.
Птерозавр

5
майже копія того, що ОП назвала не працює
user829755

15
Не використовуйте конвертувати для постскрипту чи PDF-файлів, якщо ви не переходите від векторного до растрового та ніколи не повертаєтесь назад. Важко перебільшувати, що це за погана ідея.
markgalassi

32

pdfuniteдобре об’єднати цілі файли PDF. Якщо ви хочете, наприклад, сторінки 2-7 з file1.pdf та сторінки 1,3,4 з file2.pdf, ви повинні використовуватиpdfseparate для розділення файлів на окремі PDF-файли для кожної сторінки pdfunite.

У цей момент ви, мабуть, хочете, щоб програма мала більше варіантів. qpdf- найкраща утиліта, яку я знайшов для обробки PDF-файлів. pdftkбільший і повільніше, і Red Hat / Fedora не пакують його через свою залежність від gcj. Інші утиліти PDF мають залежність від Mono або Python. Я виявив, що qpdfвийшов набагато менший вихідний файл, ніж використання pdfseparateта pdfuniteзбирання сторінок у 30-сторінковий вихідний PDF, 970 кБ проти 1,6450 кБ. Оскільки він пропонує багато інших варіантів, qpdfкомандний рядок не такий простий; оригінальний запит на об'єднання file1 та file2 може бути виконаний за допомогою

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

2
Стільки цього. Наприклад, парабола більше не pdftkпакується, бо не залежало від того gcj, для чого підтримка була відхилена. Незважаючи на пошук інструментів маніпуляції у форматі PDF pacman -Ss pdf, я пропустив це. Дякую за цю відповідь! Я повинен отримати більше оновлень, тому він відображається поруч із пропозиціями щодо pdfuniteабо pdftk.
k.stm

1
У моєму новому встановленні Linux Mint, це було запущено у вікні терміналу, не вимагаючи жодних встановлень або коригування шляху. Приємно!
Уоллес Келлі

Це прекрасно спрацювало, а також дало чіткіший об'єднаний документ, який інші команди, які я випробував. Дякую за пост.
Siwoku Adeola

14

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

PDFMerger Цей додаток візьме список PDF-документів та об'єднає їх, зберігаючи результат у новому документі.

використання: java -jar pdfbox-app-xyzjar PDFMerger "Вихідні файли PDF (2 ..n)" "Цільовий PDF-файл"


11

Використовуйте інструменти PDF від python https://pypi.python.org/pypi/pdftools/1.0.6

Завантажте файл tar.gz і розпакуйте його та виконайте команду, як показано нижче

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

Ви повинні встановити pyhton3 перед тим, як запустити вищевказану команду

Ці інструменти підтримують наведене нижче

  • додати
  • вставити
  • Видалити
  • Обертати
  • Розкол
  • Злиття
  • Zip

Більш детальну інформацію ви можете знайти за посиланням нижче, і це відкрите джерело

https://github.com/MrLeeh/pdftools


Це ідеально. Використовуючи gs(всі перераховані вище варіанти), просте злиття двох PDF-файлів, 2 МБ та 500 Кб, займало декілька хвилин, і в результаті вийшов файл 40 МБ! pdftoolsзавершується миттєво однаковим розміром файлу.
супергра

10

Ви можете використовувати консоль sejda , безкоштовний та відкритий код. Розпакуйте його та запустіть sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Він зберігає закладки, анотації на посилання, акроформи тощо. Насправді є досить багато варіантів, з якими можна грати, просто запустіть, sejda-console merge -hщоб побачити їх усі.


OMHO - найкращий інструмент для виконання подібних завдань
mario ruiz

8

Якщо ви хочете перетворити всі завантажені зображення в один pdf, виконайте виконання

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


6
Не використовуйте конвертувати для постскрипту чи PDF-файлів, якщо ви не переходите від векторного до растрового та ніколи не повертаєтесь назад. Важко перебільшувати, що це за погана ідея.
markgalassi

6

Я другу pdfuniteрекомендацію. Я все-таки отримувавArgument list too long у мене були помилки, коли я намагався об'єднати> 2k PDF-файли.

Я звернувся до Python для цього та двох зовнішніх пакетів: PyPDF2 (для обробки всіх речей, пов’язаних із PDF) та natsort (щоб зробити "природний" вид імен файлів каталогу). Якщо це може допомогти комусь:

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
"Список аргументів занадто довгий" вказує на те, що ви переходите через виділений розмір буфера оболонки для середовища - це насправді не обмеження інструменту. У такому випадку перехід на Python може бути надмірним, оскільки ви можете просто провести пакет: знайти input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Це створить партії з 500 файлів, що обробляються послідовно, і отримані тимчасові файли сортуватимуть у потрібному порядку , і створити відповідний вихідний файл; вам потрібно буде після цього очистити тимчасові файли)
enkiv2

4

Ось метод, який я використовую, який працює і його легко реалізувати. Для цього знадобляться бібліотеки fpdf та fpdi, які можна завантажити тут:

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 Python).

Ви можете легко робити з ним все, що завгодно (і багато іншого). Код скелета працює так:

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

Ось про це. Доступно декілька варіантів для вибору лише діапазонів сторінок, ведення спільної таблиці вмісту, перетворення послідовності сторінок або зміни обертання сторінки тощо тощо.

Ми на PyPi.


3

Мені подобається ідея Chasmo, але я вважаю за краще використовувати переваги подібних речей

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

Надання декількох вихідних файлів convertпризводить до об'єднання їх у загальний PDF. Ця команда об'єднує всі файли з .pdfрозширенням у фактичному каталозі merged.pdfу батьківський dir.


5
З огляду на те, наскільки це схоже на початкове запитання, схоже, це мав бути коментарем, а не відповіддю. З трохи більше представників ви зможете публікувати коментарі . До цього часу, будь ласка, не використовуйте відповіді як вирішення.
Натан Туггі

1
@Silfheed Ні, це відповідає на питання! Хоча відповідь, можливо, має бути більш детальною.
петерх

7
Не використовуйте конвертувати для постскрипту чи PDF-файлів, якщо ви не переходите від векторного до растрового та ніколи не повертаєтесь назад. Важко перебільшувати, що це за погана ідея.
markgalassi

13
Який сенс використовувати $(ls *.pdf)замість простої підстановки *.pdf?
firegurafiku

Крім того, з посиланням на відповідь @firegurafiku, з ls *.pdfwildcard ви втрачаєте контроль над порядком об'єднаних файлів. Наприклад, такий перелік: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf буде фактично об'єднано як 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (через Linux за замовчуванням спосіб замовлення файлів - тут ви маєте докладнішу інформацію про цю проблему - stackoverflow.com/q/22948042/1977012 ).
Егель

0

Хоча це не рішення командного рядка, воно може допомогти macosкористувачам:

  1. Виберіть PDF-файли
  2. Клацніть правою кнопкою миші на виділених вами файлах
  3. Виберіть Швидкі дії > Створити PDF

0

Ви можете бачити, як користуватися безкоштовним та відкритим вихідним кодом pdftools (відмова: я його автор).

Це в основному інтерфейс Python до pdfpagesпакету Latex .

Щоб об'єднати файли PDF один за одним, ви можете запустити:

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

Щоб об'єднати всі файли pdf у каталозі, ви можете запустити:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.