Объединить / конвертировать несколько файлов 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

Sata
источник
2
это, кажется, самый простой на сегодняшний день
Baxx
1
Кажется, что qpdf нарушает гиперссылки в документе
Дэвид Гранквист,
2
Несмотря на то, что сложно начать разбираться со сложными опциями, qpdf - очень удобный и мощный инструмент. Онлайн документация доступна здесь
Джонатан Холви
Определенно самый удобный!
Счастливое
54

Также pdfjoin a.pdf b.pdfсоздам новый b-joined.pdfс содержимым a.pdf и b.pdf

rodrigob
источник
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
Noor
источник
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
skierpage
источник
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"

lumpchen
источник
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');
billynoah
источник
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родительский каталог .

user3709983
источник
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
raffaem
источник
0

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

  1. Выберите ваши файлы PDF
  2. Щелкните правой кнопкой мыши по выделенным файлам
  3. Выберите Быстрые действия > Создать PDF
DevonDahon
источник