Слияние / преобразование нескольких файлов PDF в один PDF

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

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

convert file1.pdf file2.pdf merged.pdf

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

16 ответов


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

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

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

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

или даже таким образом для улучшенной версии для PDF-файлов с низким разрешением (спасибо Адриано за указание на это):

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

Надежда это помогает,

обновление: прежде всего спасибо за все ваши хорошие комментарии!! просто совет, который может сработать для вас, ребята, после того, как я нашел превосходный трюк, чтобы уменьшить размер 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

ура!!


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


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


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

например

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

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

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

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


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


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

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


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

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


Я второй 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)

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

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


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

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

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


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, 970kB против 1,6450 kB. Потому что он предлагает гораздо больше вариантов,qpdfкомандная строка не так проста; исходный запрос на слияние file1 и file2 может быть выполнен с помощью

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

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

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


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