web-dev-qa-db-pt.com

Mesclar/converter vários PDF arquivos em um PDF

Como eu poderia mesclar/converter vários PDF arquivos em um grande arquivo PDF?

Eu tentei o seguinte, mas o conteúdo do arquivo de destino não era o esperado:

convert file1.pdf file2.pdf merged.pdf

Eu preciso de uma solução de linha de comando (CLI) muito simples/básica. Melhor seria se eu pudesse canalizar a saída da mesclagem/converter diretamente para pdf2ps (como originalmente tentado na minha pergunta anterior aqui: Tubulação Linux (convert -> pdf2ps -> lp) ).

910
alcohol

Desculpe, consegui encontrar a resposta eu mesmo usando o google e um pouco de sorte :)

Para os interessados

Instalei o pdftk (pdf toolkit) em nosso servidor debian e, usando o seguinte comando, obtive a saída desejada:

pdftk file1.pdf file2.pdf cat output output.pdf

OR

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

Por sua vez, isso pode ser canalizado diretamente para o pdf2ps.

445
alcohol

Considerando que pdfunite faz parte do poppler, tem uma chance maior de ser instalado, o uso também é mais simples que pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
1208
Hubert Kario

Experimente o bom ghostscript:

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

ou mesmo assim, para uma versão melhorada para PDFs de baixa resolução (graças a Adriano por apontar isto):

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

Em ambos os casos, a resolução de saída é muito maior e melhor do que usando o convert:

convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

Desta forma, você não precisaria instalar mais nada, apenas trabalhe com o que você já instalou em seu sistema (pelo menos ambos vêm por padrão no meu rhel).

Espero que isto ajude,

ATUALIZAÇÃO: em primeiro lugar obrigado por todos os seus comentários agradáveis ​​!! apenas uma dica que pode funcionar para vocês, depois de googlar, eu encontrei um truque excelente para encolher o tamanho dos PDFs, eu reduzi com um PDF de 300 MB para apenas 15 MB com uma resolução aceitável! e tudo isso com o bom ghostscript, aqui está:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

felicidades!!

455
Gery

Também pdfjoin a.pdf b.pdf criará um novo b-joined.pdf com o conteúdo de a.pdf e b.pdf

46
rodrigob

Você pode usar o comando convert diretamente

por exemplo.

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
35
Noor

Essa é a solução mais fácil se você tiver vários arquivos e não quiser digitar os nomes um por um:

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

18
SaTa

pdfunite é bom para mesclar PDFs inteiros. Se você quiser, por exemplo, as páginas 2-7 de arquivo1.pdf e páginas 1,3,4 de arquivo2.pdf, você tem que usar pdfseparate para dividir os arquivos em PDFs separados para cada página para dar a pdfunite.

Nesse ponto, você provavelmente quer um programa com mais opções. qpdf é o melhor utilitário que encontrei para manipular PDFs. pdftk é maior e mais lento e o Red Hat/Fedora não o empacota por causa de sua dependência do gcj. Outros utilitários PDF possuem dependências Mono ou Python. Eu encontrei qpdf produziu um arquivo de saída muito menor do que usando pdfseparate e pdfunite para montar páginas em um PDF de saída de 30 páginas, 970kB contra 1.64450 kB. Como oferece muito mais opções, a linha de comando da variável qpdf não é tão simples; a solicitação original para mesclar file1 e file2 pode ser executada com

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

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

PDFMerger Esta aplicação terá uma lista de documentos em pdf e mesclá-los, salvando o resultado em um novo documento.

uso: Java -jar pdfbox-app-x.y.z.jar PDFMerger "Origem PDF arquivos (2 ..n)" "Destino PDF arquivo"

12
lumpchen

Use PDF ferramentas de python https://pypi.python.org/pypi/pdftools/1.0.6

Baixe o arquivo tar.gz e descompacte-o e execute o comando abaixo

python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3 

Você deve instalar pyhton3 antes de executar o comando acima

Estas ferramentas suportam o abaixo

  • adicionar
  • inserir
  • Remover
  • Girar
  • Split
  • Mesclar
  • Fecho eclair

Você pode encontrar mais detalhes no link abaixo e é open source

https://github.com/MrLeeh/pdftools

10
Ravikiran Reddy Kotapati

Se você quiser converter todas as imagens baixadas em um pdf, execute

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

8
Trupti Kini

Você pode usar sejda-console , livre e open source. Descompacte-o e execute sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Ele preserva bookmarks, anotações de link, acroforms etc. ele realmente tem muitas opções que você pode jogar, apenas rode sejda-console merge -h para ver todas elas.

8
Andrea Vacondio

Eu recomendo a recomendação pdfunite. No entanto, eu estava recebendo erros Argument list too long enquanto tentava mesclar> 2k PDF arquivos.

Eu virei para o Python para este e dois pacotes externos: PyPDF2 (para lidar com todas as coisas PDF relacionadas) e natsort (para fazer um tipo "natural" de nomes de arquivos do diretório) . Caso isso possa ajudar alguém:

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)
5
Greg Sadetsky

Aqui está um método que uso e que é fácil de implementar. Isso exigirá as bibliotecas fpdf e fpdi que podem ser baixadas aqui:

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');
4
billynoah

Eu sou tendencioso sendo um dos desenvolvedores do PyMuPDF (uma ligação Python do MuPDF).

Você pode facilmente fazer o que quiser com ele (e muito mais). O código de esqueleto funciona assim:

#-------------------------------------------------
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")
#-------------------------------------------------

É sobre isso. Várias opções estão disponíveis para selecionar apenas intervalos de páginas, mantendo um índice conjunto, invertendo a sequência de páginas ou alterando a rotação da página, etc., etc.

Estamos no PyPi.

4
Jorj McKie

Eu gosto da idéia do Chasmo, mas prefiro usar as vantagens de coisas como

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

Dar vários arquivos de origem para convert leva a mesclá-los em um pdf comum. Este comando mescla todos os arquivos com .pdfextension no diretório real em merged.pdf no diretório pai.

3
user3709983

As outras respostas são boas, mas se você não conseguir mesclar PDFs localmente, se estiver em um ambiente de hospedagem compartilhada ou por outros motivos, elas não o ajudarão.

Se você estiver procurando por uma API para mesclar PDFs remotamente, você pode tentar api2pdf que tem um endpoint para mesclar pdfs juntos. A documentação é aqui .

0
apexdodge