Como posso combinar vários PDFs usando a linha de comando?


52

Existe um one-liner rápido para combinar vários PDFs em um?

Eu sei que isso pode ser feito usando o Preview.app

Respostas:


75

Consulte "Combinando arquivos PDF na linha de comando no OSX" em Associando arquivos PDF no OS X na linha de comando .

Acontece que a partir de Tiger, o OSX é fornecido com um script Python que faz exatamente o que você precisa. O script já é executável e o Python está pré-instalado no OS X; portanto, tudo o que você precisa fazer para executá-lo é abrir o Terminal e digitar

"/System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py" -o PATH/TO/YOUR/MERGED/FILE.pdf /PATH/TO/ORIGINAL/1.pdf /PATH/TO/ANOTHER/2.pdf /PATH/TO/A/WHOLE/DIR/*.pdf

Também na página do link que sugere fazer um link simbólico para o join.pyarquivo para facilitar a digitação porém omitiu a -sno ln -s ... ..., e sem ele, um hard link é criado. Provavelmente não importaria, no entanto, embora eu mencionei isso.


Trabalhou para mim. Uma grande coisa aqui é evitar a instalação de pacotes extras que você nunca poderá usar novamente. Obrigado.
gvrocha 27/01

Trabalhou para mim no El Capitan 10.11.6.
pabuisson

2
Aviso : eu tinha PDFs em que atrapalhava a rotação de várias páginas
adius

28

Basta instalar o Ghostscript usando o Brew com o comando:

brew install gs

Em seguida, execute o comando com todos os arquivos listados:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=merged.pdf source1.pdf source2.pdf source3.pdf

O OS X / macOS já possui uma maneira nativa de combinar arquivos PDF a partir da linha de comando. Por que perder o tempo necessário para instalar primeiro as Ferramentas de Linha de Comando para Xcode, Homebrew e Ghostscript, para fazer algo que já pode ser feito de forma nativa sem precisar instalar algum dos pacotes mencionados acima?
user3439894

5
@ user3439894 muitas pessoas já têm esses pacotes comuns instalados e já estão usando, gsportanto, para referência futura, essa solução seria igualmente conveniente.
HTOR

1
@ user3439894 vejo a confusão. Estou falando com você porque você estava questionando o valor desta resposta. o uso do homebrew para instalar utilitários de linha de comando é muito comum atualmente, então eu não chamaria isso de perda de tempo. para muitas pessoas, essa resposta fornece uma solução igualmente boa como a sua.
HTOR

7
isso funcionou para mim, o comando py não #
Thieme Hennis 27/03

2
De acordo com o comentário de Thieme Hennis, o script join.py trava para mim em High Sierra com uma falha de segmentação. Mas o gs funciona perfeitamente.
arcdale

2

O script python da Apple na ação Automator é muito lento, pois usa as APIs CGPDFDocument da CoreGraphics, em vez da nova estrutura PDFKit. Também importa toda a biblioteca CoreGraphics, em vez de apenas as APIs necessárias.

Um script python alternativo e mais rápido pode ser encontrado aqui:

Esse script também adiciona um índice ao PDF, listando cada arquivo de componente (e mesclando os ToCs existentes), o que a Apple não inclui.

Ele pode ser usado na linha de comando (com nomes de arquivos PDF como argumentos) ou em uma ação de script do shell do Automator, para criar uma Ação / Serviço Rápido para o Finder.


1
Como teste, usando o time comando em conjunto com o seu joinpdfs.py script , o join.py script interno e dois arquivos ~ 200 MB cada, seu joinpdfs.py script foi 9 segundos mais rápido que o join.py script interno , com o benefício adicional de manter o TOC intacto . Agradável! +1
user3439894 18/01

BTW 9 segundos pode não parecer muito, mas era 1/3 do tempo total do script interno , portanto, 1/3 do tempo mais rápido é significativo.
User3439894 18/01

1

FWIW, escrevi um pequeno programa rápido que permite fazer isso sem precisar depender de dependências externas como o python do sistema e outras coisas. No github aqui: pdfmerge e bastante simples de usar, pode passar uma lista de arquivos PDF para mesclar pdfmerge in1.pdf in2.pdf ... out.pdf, passar uma lista de arquivos para mesclar em um arquivo de texto pdfmerge infileslist.txt out.pdfou apenas fazer o diretório atual em ordem ABC pdfmerge out.pdf. Eu o escrevi como um projeto de aprendizado, tão gratuito e aberto, e você pode obter o binário mais recente na guia releases no github.


Como o Python é instalado por padrão no MacOS e como parte dele, eu não o considero necessariamente uma dependência externa em si. Em outras palavras, para usar o que já está disponível no macOS para ingressar em arquivos PDF, o join.pyscript da ação Combinar páginas PDF no Automator, nada mais precisa ser baixado ou instalado, mas para usar o seu, é necessário faça o download e instale. Também não vi um binário no link.
User3439894 18/01

1
BTW, eu examinei seu código e é interessante que você esteja usando dois dos principais componentes (Foundation e Quartz) que o script python já está usando também. Existe algo no seu código que é intrinsecamente melhor para influenciar o uso do que sobre o que já é oferecido por padrão sem ter que baixar nada, enquanto que no seu é necessário executar etapas adicionais e extras para usá-lo?
User3439894 18/01

1
Para pessoas que não usam o Python para mais nada, provavelmente faz mais sentido usar o script fornecido pela Apple. Mas para as pessoas que usam Python, pode ser um grande aborrecimento gerenciar várias versões (o sistema Python é 2.7, o Python moderno é 3.x) com diferentes instalações de módulos e outras coisas. Na minha máquina, por exemplo, meu $ PATH aponta para um Python totalmente diferente. Isso pode ser resolvido com o uso criterioso de shebangs e afins, mas acho isso irritante. YMMV, é claro. Além disso, link direto para a página de download binário: github.com/paultopia/pdfmerge/releases/latest
Paul Gowder

1

com base em @Bartosz Petryński 's resposta agradável , podemos fazer próprio mínima cpdfutilidade em cima do GhostScript:

brew install gs
cpdf () { 
  gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$1" "${@:2}"
}

então use-o como:

cpdf merged.pdf file1.pdf file2.pdf file3.pdf

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.