Объединить / конвертировать несколько файлов 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 перед запуском вышеуказанной команды
Эти инструменты поддерживают ниже
- добавлять
- вставить
- Удалить
- Поворот
- Трещина
- сливаться
- застежка-молния
Вы можете найти более подробную информацию в ссылке ниже, и это с открытым исходным кодом
Apache PDFBox http://pdfbox.apache.org/
PDFMerger Это приложение возьмет список документов PDF и объединит их, сохранив результат в новом документе.
использование: java -jar pdfbox-app-xyzjar PDFMerger "Исходные файлы PDF (2 ..n)" "Целевой файл PDF"
Хотя это не решение для командной строки, оно может помочь macos
пользователи:
- Выберите файлы PDF
- Щелкните правой кнопкой мыши выделенные файлы
- Выберите Быстрые действия > Создать 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
в родительском реж.
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