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

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

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

convert file1.pdf file2.pdf merged.pdf

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

25 ответов

Решение

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

Учитывая, что 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 с низким разрешением (спасибо 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

ура!!

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

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

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

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

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

например

convert sub1.pdf sub2.pdf sub3.pdf merged.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 перед запуском вышеуказанной команды

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

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

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

https://github.com/MrLeeh/pdftools

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

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

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

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

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

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

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

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

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

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

Я использовал qpdf из терминала и работаю для меня в Windows (Mobaxterm) и Linux, например, команда для соединения A.pdf с B.pdf в новом файле C.pdf:

qpdf --empty --pages oficios/A.pdf informes/B.pdf -- salida/C.PDF

Если вам нужна дополнительная документация [https://net2.com/how-to-merge-or-split-pdf-files-on-linux/ visible[1]

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

Вы можете увидеть использование бесплатных pdftools с открытым исходным кодом (отказ от ответственности: я являюсь его автором).

Это в основном интерфейс Python для Latex. pdfpages пакет.

Чтобы объединить файлы PDF по одному, вы можете запустить:

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

Чтобы объединить вместе все файлы pdf в каталоге, вы можете запустить:

pdftools --input-dir ./dir_with_pdfs --output output.pdf

bash-скрипт, который проверяет ошибки слияния

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

Следующий bash-скрипт объединяет все доступные PDF-файлы в папке один за другим и выдает статус успеха после каждого слияния. Просто скопируйте его в папку с pdf-файлами и выполните оттуда.

    #!/bin/bash
    
    PDFOUT=_all_merged.pdf
    rm -f ${PDFOUT}
    
    for f in $(ls *.pdf)
    do
      printf "processing %-50s" "$f  ..."
      if [ -f "$PDFOUT" ]; then
        # https://stackru.com/questions/8158584/ghostscript-to-merge-pdfs-compresses-the-result
        #  -dPDFSETTINGS=/prepress
        status=`gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="${PDFOUT}.new" ${PDFOUT} "$f" 2> /dev/null`
        nChars=`echo -n "${status}" | wc -c`
        if [ $nChars -gt 0 ]
        then
          echo "gs ERROR"
        else
          echo "successfully"
        fi
        mv "${PDFOUT}.new" ${PDFOUT}
      else
        cp "$f" ${PDFOUT}
        echo "successfully"
      fi
    done

пример вывода:

processing inp1.pdf  ...                                     successfully
processing inp2.pdf  ...                                     successfully

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

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

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

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

PdfCpu отлично работает:

      pdfcpu merge c.pdf a.pdf b.pdf

https://pdfcpu.io/core/merge

      pdfconcat -o out.pdf 1.pdf 2.pdf

`` pdfconcat - это небольшая и быстрая утилита командной строки, написанная на ANSI C, которая может объединять (объединять) несколько файлов PDF в длинный документ PDF ''.

Если вы хотите объединить все PDF-файлы в каталоге с помощью Ghostscript, вы можете использовать find для этого. Вот пример

      find . -name '*.pdf' -exec gs -o -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=../out.pdf {} +

Найдет все pdf в текущем каталоге и создаст out.pdf в родительском каталоге. Может быть полезно, если они ищут быстрый способ создать весь каталог с помощью ghostscript.

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

Еще один полезный вариант, если вы хотите также выбрать страницы внутри документов, которые нужно объединить:

      pdfjoin image.jpg '-' doc_only_first_pages.pdf '1,2' doc_with_all_pages.pdf '-'

Поставляется с пакетом texlive-extra-utils

Другие вопросы по тегам