Mesclar / converter vários arquivos PDF em um PDF

1071

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

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. O melhor seria se eu pudesse canalizar diretamente a saída da mesclagem / conversão pdf2ps(como originalmente tentado na minha pergunta anterior aqui: Linux piping (convert -> pdf2ps -> lp) ).

álcool
fonte
3
ymmv, mas isso não parece ter tão boa de uma resolução no arquivo de saída como pdfunite e também resulta em um tamanho de arquivo maior do que a saída de pdfunite
sabujp
1
relacionados: arquivos pdf comando Merge Linux com tipo numérico
Franck Dernoncourt
Sempre que os links são preservados ou não por essas soluções, é discutido neste post . Se você deseja preservar os links (provavelmente junto com outras anotações), use pdftk se desejar uma interface de linha de comando, pdfsam se desejar uma interface gráfica do usuário, sejda se desejar uma interface da Web.
Clément

Respostas:

1389

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

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Hubert Kario
fonte
20
É rápido, mas parece quebrar os hiperlinks. Veja blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen
426
Apenas lembre-se de fornecer out.pdf, caso contrário ele substituirá o último arquivo em seu comando, suspiro.
mlissner
10
O pacote para pdfunite é poppler-utils no debian, mas pode não estar presente em versões antigas do debian.
Jocelyn delalande
16
Não posso recomendar isso. O tamanho do PDF resultante é muito grande. Por exemplo: Pdfunite me fornece um arquivo de 75 MB, enquanto o Ghostscript agrupa tudo em 1 MB.
Torben
64
Você pode usar: pdfunite *.pdf out.pdfassumindo que não exista outro pdf nesse diretório e que a ordem deles seja preservada por "*". Se não for preservado, o uso de intervalos: filename_ {0..9} .pdf o resolverá.
Lepe
549

Experimente o bom ghostscript:

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

ou mesmo desta maneira para uma versão melhorada para PDFs de baixa resolução (obrigado Adriano por apontar isso):

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

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

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

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

Espero que isto ajude,

ATUALIZAÇÃO: obrigado por todos os seus comentários legais !! apenas uma dica que pode funcionar para vocês, depois de pesquisar no Google, achei um truque excelente para diminuir o tamanho de PDFs, reduzi um PDF de 300 MB para apenas 15 MB com uma resolução aceitável! e tudo isso com o bom fantasma, aqui está:

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

Felicidades!!

Gery
fonte
27
Ótima dica, gsroda muito rápido e comprime bastante. No entanto, a qualidade melhorou muito depois que eu usei esse parâmetro:-dPDFSETTINGS=/prepress
Adriano P
3
Descobri que isso -dPDFSETTINGS=/prepresstem o efeito muito bom de girar páginas muito grandes e forçar barras de rolagem horizontais irritantes.
Robert Smith
24
Adicione a seguinte linha ao seu .bash_profilee você terá um bom atalho: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Isso poupa algumas digitações, se você precisar usar muito o comando. O uso fica assim:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben
2
Tentei encontrar a descrição do sinalizador -dBATCH, mas não consegui. Até o homem gs não diz nada. Mas ótimo e sem nenhum programa adicional!
Michal Gonda
3
O gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfpode ser reduzido para o gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Da documentação : "Como uma abreviação conveniente, você pode usar a -oopção seguida pela especificação do arquivo de saída, conforme discutido acima. A -oopção também define as opções -dBATCHe -dNOPAUSE. Essa é uma maneira rápida de chamar ghostscriptpara converter um ou mais arquivos de entrada".
MiniMax
513

Sinto muito, eu consegui encontrar a resposta 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

OU

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.

álcool
fonte
81
Usando ghostscript também pode funcionar: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl
15
Vale a pena mencionar que pdftk pode mesclar PDFs criptografados enquanto não pode pdfunite
Thomas
3
oferece uma melhor resolução com o pdftk compare para converter nas opções padrão.
Kiran K Telukunta
13
pdftk file1.pdf file2.pdf cat output out.pdfproduzirá o arquivo mesclado comoout.pdf
jmiserez 28/09
2
pdftknão está disponível para sistemas EL7 devido à falta de dependência libgcj.
codificador
72

Esta é 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

SaTa
fonte
2
este parece ser o mais fácil de longe
Baxx
1
QPDF parece hyperlinks quebra no documento
David Granqvist
2
Embora seja difícil entender as opções complexas, o qpdf é uma ferramenta muito útil e poderosa. A documentação on-line está disponível aqui
Jonathan Holvey
Definitivamente o mais útil!
Sorte
54

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

rodrigob
fonte
5
Isso é legal e sucinto, mas quebra os hiperlinks.
estrela brilhante
3
O pdfjoin (pdflatex) falha com arquivos com muitas páginas. Falha ao mesclar para arquivos de 1k páginas.
Mdrozdziel
pdfjoin quebra anotações ou itens adicionais não gráficos
sabujp
A fonte "URW Palladio L" tornou-se invisível após o pdf entrar nas páginas.
v_2e
9
O pdfunite geralmente funciona bem, mas se aparecer "Recurso não implementado: não foi possível mesclar arquivos criptografados", o pdfjoin é uma boa alternativa. Por qualquer motivo, o pdfjoin não reclama de criptografia.
Calaf
38

Você pode usar o comando convert diretamente,

por exemplo

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Noor
fonte
40
Isso não é sem perdas.
precisa saber é o seguinte
12
Você pode convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, mas o tamanho do arquivo resultante pode ser muito grande. Eu sugiro em seu convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdflugar.
Arielnmz
21
Parece que isso envolve converter tudo em imagens rasterizadas, o que definitivamente não é o melhor, especialmente quando se trata de PDFs baseados em texto.
Pterosaur 28/08
5
quase uma cópia do que o OP tem descrito como não trabalhar
user829755
15
Não use convert para arquivos postscript ou PDF, a menos que você vá de vetor para raster e nunca volte. É difícil exagerar que idéia ruim é essa.
markgalassi
32

pdfuniteé bom mesclar PDFs inteiros. Se você quiser, por exemplo, as páginas 2 a 7 do arquivo1.pdf e as páginas 1,3,4 do arquivo2.pdf, será necessário pdfseparatedividir os arquivos em PDFs separados para cada página a ser entregue.pdfunite .

Nesse ponto, você provavelmente deseja 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 devido à sua dependência do gcj. Outros utilitários de PDF têm dependências Mono ou Python. Descobri que qpdfproduzi um arquivo de saída muito menor do que o uso pdfseparatee pdfunitea montagem de páginas em um PDF de saída de 30 páginas, 970kB vs. 1,6450 kB. Por oferecer muito mais opções, qpdfa linha de comando não é tão simples; a solicitação original para mesclar arquivo1 e arquivo2 pode ser realizada com

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
skierpage
fonte
2
Tanto isso. Parábola, por exemplo, não empacota pdftkmais por causa de sua dependência gcj, pela qual o suporte foi descartado, acredito. Apesar de procurar por ferramentas de manipulação de pdf via pacman -Ss pdf, eu perdi isso. Obrigado por esta resposta! Eu deveria receber muito mais votos, para que apareça ao lado das sugestões para pdfuniteou pdftk.
precisa saber é
1
Na minha nova instalação do Linux Mint, isso foi executado na janela Terminal sem exigir nenhuma instalação ou ajuste de caminho. Agradável!
Wallace Kelly
Isso funcionou perfeitamente e também deu um documento mesclado mais claro que os outros comandos que eu experimentei. Obrigado pelo post.
Siwoku Adeola 29/03
14

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

PDFMerger Este aplicativo pega uma lista de documentos PDF e os mescla, salvando o resultado em um novo documento.

uso: java -jar pdfbox-app-xyzjar PDFMerger "Arquivos PDF de origem (2 ..n)" "Arquivo PDF de destino"

lumpchen
fonte
11

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

Faça o download do arquivo tar.gz, 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 o pyhton3 antes de executar o comando acima

Essas ferramentas suportam o abaixo

  • adicionar
  • inserir
  • Retirar
  • Rodar
  • Dividido
  • Mesclar
  • Fecho eclair

Você pode encontrar mais detalhes no link abaixo e é de código aberto

https://github.com/MrLeeh/pdftools

Ravikiran Reddy Kotapati
fonte
Isto é perfeito. Usando gs(todas as variantes listadas acima), uma mesclagem simples de dois PDFs, 2 MB e 500 KB, estava demorando minutos para ser concluída e resultando em um arquivo de 40 MB! pdftoolstermina instantaneamente com tamanho de arquivo idêntico.
Supergraça #
10

Você pode usar o sejda-console , de código aberto e gratuito. Descompacte e execute sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Ele preserva marcadores, anotações de links, acroformas, etc. Na verdade, ele tem muitas opções com as quais você pode brincar, basta correr sejda-console merge -hpara ver todas elas.

Andrea Vacondio
fonte
OMHO a melhor ferramenta para fazer esse tipo de tarefa
mario ruiz
8

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

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

Trupti Kini
fonte
6
Não use convert para arquivos postscript ou PDF, a menos que você vá de vetor para raster e nunca volte. É difícil exagerar que idéia ruim é essa.
markgalassi
6

Eu segundo a pdfuniterecomendação. No entanto, eu estava recebendo Argument list too longerros, enquanto tentava mesclar arquivos> 2k PDF.

Voltei-me para o Python para este e dois pacotes externos: PyPDF2 (para lidar com todas as coisas relacionadas ao PDF) e natsort (para fazer um tipo "natural" dos nomes de arquivo 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)
Greg Sadetsky
fonte
6
"A lista de argumentos é muito longa" indica que você está analisando o tamanho do buffer alocado do shell para o ambiente - na verdade, não é uma limitação da ferramenta. Nesse caso, mudar para Python pode ser um exagero, pois você pode apenas agrupar: find input -name * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Isso criará lotes de 500 arquivos processados ​​em série, faça com que os arquivos temporários resultantes sejam classificados na ordem correta e produzir um arquivo de saída apropriada, você vai precisar para limpar os arquivos temporários após)
enkiv2
4

Aqui está um método que eu uso, que funciona e é fácil de implementar. Isso vai exigir tanto a fpdf e FPDI bibliotecas que pode ser baixado 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');
billynoah
fonte
4

Sou tendencioso por ser um dos desenvolvedores do PyMuPDF (uma ligação do MuPDF em Python).

Você pode facilmente fazer o que quiser com ele (e muito mais). O código do 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, manter um índice conjunto, reverter a sequência de páginas ou alterar a rotação da página, etc., etc.

Estamos em PyPi.

Jorj McKie
fonte
3

Eu gosto da ideia do Chasmo, mas prefiro usar as vantagens de coisas como

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

Fornecer vários arquivos de origem convertleva a mesclá-los em um pdf comum. Este comando mescla todos os arquivos com .pdfextensão no diretório real no diretório merged.pdfpai.

user3709983
fonte
5
Dado o quão semelhante isso parece à pergunta original, parece que isso deveria ter sido um comentário, não uma resposta. Com um pouco mais de rep, você poderá postar comentários . Até lá, não use respostas como solução alternativa.
Nathan Tuggy
1
@ Silfheed Não, responde à pergunta! Embora a resposta talvez devesse ter sido mais elaborada.
peterh - Restabelece Monica
7
Não use convert para arquivos postscript ou PDF, a menos que você vá de vetor para raster e nunca volte. É difícil exagerar que idéia ruim é essa.
markgalassi
13
Qual é o sentido de usar $(ls *.pdf)no lugar do curinga simples *.pdf?
Firegurafiku
Além disso, com referência à resposta @firegurafiku, com o ls *.pdfcuringa, você perde o controle sobre a ordem dos arquivos mesclados. Em um exemplo, a seguinte lista: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf será realmente mesclada como 1.pdf, 10.pdf, 100. pdf, 2.pdf, 3.pdf (devido à maneira padrão do Linux de solicitar arquivos - aqui você tem mais detalhes sobre esse problema - stackoverflow.com/q/22948042/1977012 ).
Egel
0

Embora não seja uma solução de linha de comando, pode ajudar os macosusuários:

  1. Selecione seus arquivos PDF
  2. Clique com o botão direito do mouse nos arquivos destacados
  3. Selecione Ações rápidas > Criar PDF
DevonDahon
fonte
0

Você pode ver usar o pdftools gratuito e de código aberto (isenção de responsabilidade: eu sou o autor dele).

É basicamente uma interface Python para o pdfpagespacote Latex .

Para mesclar arquivos pdf um por um, você pode executar:

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

Para mesclar todos os arquivos pdf em um diretório, você pode executar:

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