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

Как я могу объединить/конвертировать несколько файлов PDF в один большой PDF файл?

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

convert file1.pdf file2.pdf merged.pdf

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

Ответ 1

Извините, мне удалось найти ответ, используя 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.

Ответ 2

Учитывая, что pdfunite является частью poppler, у него есть более высокий шанс быть установленным, использование также проще, чем pdftk:

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

Ответ 3

Попробуйте хороший 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

ура!!

Ответ 4

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

Ответ 5

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

например.

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

Ответ 6

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

PDFMerger Это приложение возьмет список PDF-документов и объединит их, сохранив результат в новом документе.

Использование: java -jar pdfbox-app-x.y.z.jar PDFMerger "Исходные файлы PDF (2..n)" "Целевой файл PDF"

Ответ 7

Используйте инструменты 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 перед запуском указанной команды

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

  • добавить
  • Вставка
  • Удалить
  • Rotate
  • Split
  • Объединить
  • Zip

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

https://github.com/MrLeeh/pdftools

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

Я второй рекомендации pdfunite. Однако я получал Argument list too long ошибок в 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)

Ответ 12

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

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

Предоставление нескольких исходных файлов на convert приводит к их объединению в общий pdf. Эта команда объединяет все файлы с расширением .pdf в фактическом каталоге в merged.pdf в родительском каталоге.

Ответ 13

Здесь используется метод, который работает и его легко реализовать. Для этого потребуются библиотеки 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');

Ответ 14

Я смещен, будучи одним из разработчиков 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.

Ответ 15

Другие ответы хороши, но если вы не можете объединить PDF файлы локально, находитесь ли вы в среде общего хостинга или по другим причинам, они вам не помогут.

Если вы ищете API для удаленного объединения PDF файлов, вы можете попробовать api2pdf, у которого есть конечная точка для объединения PDF файлов. Документация здесь.

Ответ 16

После поиска во многих доступных библиотеках PDF единственное, что отлично сработало для меня, это

https://libraries.io/npm/easy-pdf-merge

Это требует Java 6 или выше, чтобы быть установленным, но работает отлично. Pdftk полон ошибок.

var merge = require('easy-pdf-merge');

merge(source_files,dest_file_path,function(err){

        if(err)
        return console.log(err);

        console.log('Success');

});

Примечание. Это не cmd, но вы можете запустить его с помощью команд, таких как принятие имен файлов в качестве аргументов командной строки.

Ответ 17

Это самое простое решение, если у вас есть несколько файлов и вы не хотите вводить имена по одному:

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