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