Об'єднання / перетворення декількох файлів 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.