Объединить / конвертировать несколько файлов PDF в один PDF


1072

Как можно объединить / преобразовать несколько файлов PDF в один большой файл PDF?

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

convert file1.pdf file2.pdf merged.pdf

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


3
ymmv, но, похоже, разрешение выходного файла не так хорошее, как у pdfunite, и это также приводит к тому, что размер файла больше, чем у pdfunite
— sabujp


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

Ответы:


1389

Учитывая, что 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
— Данило Барген

426
Просто убедитесь, что вы не забыли предоставить out.pdf, иначе он перезапишет последний файл в вашей команде, вздох.
— mlissner

10
Пакет для pdfunite - это poppler-utils в Debian, но может отсутствовать в старых выпусках Debian.
— Джоселин Делаланде

16
Не могу рекомендовать это. Размер полученного PDF слишком велик. Например: Pdfunite дает мне файл размером 75 МБ, а Ghostscript упаковывает все в 1 МБ.
— Торбен

64
Вы можете использовать: pdfunite *.pdf out.pdfпри условии, что в этом каталоге нет других файлов pdf и их порядок сохраняется с помощью «*». Если его не сохранить, используйте диапазоны: filename_ {0..9} .pdf решает его.
— Лепе

549

Попробуйте хороший ghostscript:

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:

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

Таким образом, вам не нужно устанавливать что-либо еще, просто работайте с тем, что уже установлено в вашей системе (по крайней мере, оба поставляются по умолчанию в моем rhel).

Надеюсь это поможет,

ОБНОВЛЕНИЕ: прежде всего спасибо за все Ваши хорошие комментарии !! просто совет, который может сработать для вас, ребята, после поиска в Google я нашел отличный способ уменьшить размер PDF, уменьшив один PDF с 300 МБ до 15 МБ с приемлемым разрешением! и все это с хорошим ghostscript, вот оно:

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
— Торбен

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

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 ...
— Nate Kohl

15
Стоит отметить, что pdftk может объединять зашифрованные PDF-файлы, в то время как pdfunite не может
— Томас

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
Это не без потерь.
— Бен Руйл

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
Не используйте конвертирование для postscript или 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.
— 18:39

1
На моей новой установке Linux Mint это выполнялось в окне терминала, не требуя установки или корректировки пути. Ницца!
— Уоллес Келли

Это сработало отлично, а также дало более четкий объединенный документ, который опробовали другие команды. Спасибо за пост.
— Сивоку Адеола

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 перед запуском вышеуказанной команды

Эти инструменты поддерживают ниже

  • Добавить
  • вставка
  • Удалить
  • Поворот
  • Трещина
  • Объединить
  • застежка-молния

Вы можете найти более подробную информацию в ссылке ниже, и это с открытым исходным кодом

https://github.com/MrLeeh/pdftools


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

10

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

Он сохраняет закладки, аннотации ссылок, акроформы и т. Д., На самом деле у него довольно много опций, с которыми вы можете играть, просто запустите, sejda-console merge -hчтобы увидеть их все.


ОМХО лучший инструмент для выполнения задач такого типа
— Марио Руис

8

Если вы хотите конвертировать все загруженные изображения в один PDF, выполните

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


6
Не используйте конвертирование для postscript или 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 (Python-связка MuPDF).

Вы можете легко сделать то, что вы хотите с ним (и многое другое). Скелетный код работает так:

#-------------------------------------------------
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родительский каталог .


5
Учитывая, насколько это похоже на исходный вопрос, кажется, что это должен был быть комментарий, а не ответ. С чуть большим количеством представителей вы сможете оставлять комментарии . До тех пор, пожалуйста, не используйте ответы в качестве обходного пути.
— Натан Тагги

1
@ Silfheed Нет, это отвечает на вопрос! Хотя, возможно, ответ должен был быть более детальным.
— Петер - Восстановить Монику

7
Не используйте конвертирование для postscript или PDF-файлов, если вы не переходите от вектора к растру и никогда не возвращаетесь. Трудно переоценить, что это за плохая идея.
— Markgalassi

13
Какой смысл использовать $(ls *.pdf)вместо простого подстановочного знака *.pdf?
— firegurafiku

Кроме того, со ссылкой на ответ @firegurafiku, с ls *.pdfподстановочными знаками вы теряете контроль над порядком объединенных файлов. Например, следующий список: 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 ).
— Эгель

1

Вы можете увидеть использование свободного и открытого исходного кода 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

0

Хотя это не решение для командной строки, оно может помочь macosпользователям:

  1. Выберите ваши файлы PDF
  2. Щелкните правой кнопкой мыши по выделенным файлам
  3. Выберите Быстрые действия > Создать PDF
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.