Como eu crio um PDF em branco a partir da linha de comando?

53

Recentemente, precisei de uma única página PDF em branco (tamanho 8,5 "x 11") e percebi que não sabia como fazer uma a partir da linha de comando.

Emitir touch blank.pdf produz um arquivo PDF vazio . Existe uma ferramenta de linha de comando que produz um PDF vazio página ?

    
por Brian Fitzpatrick 20.04.2016 / 20:38

7 respostas

77

convert , o utilitário ImageMagick usado na resposta de Ketan, também permite que você escreva algo como

convert xc:none -page Letter a.pdf

ou

convert xc:none -page A4 a.pdf

ou (para papel A4 horizontal)

convert xc:none -page 842x595 a.pdf

etc. , sem criar um arquivo de texto vazio. @brown notou que isso cria um arquivo pdf menor.

"xc:" significa "X Imagem Constante", mas pode ser considerado como "x canvas". É uma maneira de especificar um único bloco de uma cor, neste caso nenhum. Mais informações no link que é o manual "de fato" do ImageMagick. [complementados com informações do pipe] (Coisas como pdf:a podem ser usadas para declarar explicitamente o formato de um arquivo. label:'some text' , gradient: , rose: e logo: parecem ser outros exemplos de formatos de arquivo especiais. )

Anko sugeriu postar essa modificação como uma resposta separada, então estou fazendo isso.

    
por 21.04.2016 / 06:29
31

Assim como o menor GIF possível , o menor PDF possível em uma página em branco precisa ser trabalhado à mão, porque é tão pequeno que bits de metadados desnecessários, mas inofensivos, se tornam uma parte significativa do tamanho do arquivo, e a compactação realmente torna as coisas maiores . Ele também requer cuidadosa atenção às regras da especificação do PDF sobre quais bits da estrutura do arquivo são ou não necessários. (Você sabia que os objetos de página devem conter um dicionário /Resources , mesmo se estiver vazio, mas não são necessários para incluir um fluxo /Contents ?)

Se você não usa o objeto PDF 1.5 e fluxos de referência cruzada (que tem a vantagem de que o arquivo pode ser completamente imprimível ASCII) eu acredito que o melhor que você pode fazer é 317 bytes. Se estiver copiando e colando, observe que é preciso haver um espaço à direita em todas as quatro entradas da tabela de referência cruzada (as linhas entre 0 4 e trailer<<... ) e que não há não deveria ser uma nova linha final após o %%EOF .

%PDF-1.4
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
xref
0 4
0000000000 65535 f 
0000000009 00000 n 
0000000052 00000 n 
0000000101 00000 n 
trailer<</Size 4/Root 1 0 R>>
startxref
178
%%EOF

Substituir a tabela de referência cruzada por um fluxo de referência cruzada v1.5 criado manualmente torna o arquivo um pouco menor, com o preço de não mais ser ASCII: 294 bytes imprimíveis. (Para facilitar a leitura, para não mencionar a possibilidade de digitá-lo, o fluxo de xref abaixo foi hexdumped, mas isso não é não refletido em seu dicionário de fluxo. Para recuperar um PDF válido, deve substituir o hexdump pelos bytes binários brutos correspondentes ou alterar /Length 15 para /Length 30/Filter/ASCIIHexDecode e aceitar um arquivo com 328 bytes de comprimento.

%PDF-1.5
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj
2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj
4 0 obj<</Type/XRef/Size 5/W[1 1 1]/Root 1 0 R/Length 15>>stream
0000ff01090001340001650001b200endstream endobj
startxref
178
%%EOF

Eu também experimentei agrupar objetos de 1 a 3 em um fluxo de objetos, mas isso adiciona mais sobrecarga do que economiza, mesmo quando o fluxo é compactado.

Uma possível formulação alternativa do fluxo xref é

4 0 obj<</Type/XRef/Size 4/W[0 1 0]/Index[1 4]/Root 1 0 R/Length 4>>stream
091365b2endstream endobj

Infelizmente, apesar das economias substanciais na duração dos dados reais do stream, o /Index[1 4] adicional consome todos menos um byte da economia. Além disso, não está claro se você está autorizado a deixar o objeto 0 completamente fora do arquivo. (Também não está claro para mim se o objeto 0 deve ter o número de geração -1. Se isso não é necessário, você realmente salva mais bytes com

4 0 obj<</Type/XRef/Size 5/W[1 1 0]/Root 1 0 R/Length 10>>stream
000001090134016501b2endstream endobj

.

Para alterar o tamanho do papel, substitua 612 792 pela largura e altura apropriadas, expressas em pontos PostScript (72 pontos PostScript = 1 polegada norte-americana ou 25,4 milímetros). Por exemplo, 595 842 para A4. Você poderia inserir isso em um script de shell que cosesse um PDF em branco de qualquer tamanho de papel desejado; a única parte complicada seria certificar-se de que o startxref offset permanecesse exato, mesmo se o tamanho do objeto 3 fosse alterado.

    
por 21.04.2016 / 02:33
23

Se você tiver convert (um utilitário ImageMagick) instalado, poderá fazer isso:

touch a.txt && convert a.txt -page Letter a.pdf
    
por 20.04.2016 / 20:42
10

echo .bp | groff -T pdf > t.pdf

Trazido a você pelo groff, o software mais subestimado do mundo.

    
por 21.04.2016 / 06:13
9

Você pode usar o pdfTeX:

echo '\shipout\hbox{}\end' | pdftex

que produz uma página única em branco texput.pdf de cerca de 900 bytes, metade do que o ImageMagick usa.

Isso coloca você à mercê do padrão de tamanho de papel da sua instalação do TeX, no entanto. Para definir o tamanho explicitamente, você pode ir ao LaTeX:

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry}
      \begin{document}\shipout\hbox{}\end{document}' | pdflatex

Outra opção seria usar o driver PDF do Ghostscript, com o prático script ps2pdf :

echo showpage | ps2pdf -sPAPERSIZE=letter - blank.pdf

que é muito mais silencioso que o TeX, mas produz uma saída menos compacta (cerca de 2300 bytes).

    
por 21.04.2016 / 01:29
3

Uma maneira fácil de criar um PDF com uma página em branco é usar rst2pdf :

echo -e '.. raw:: pdf\n\n   PageBreak' | rst2pdf -o blank.pdf

apenas ecoar em um único espaço não funcionará, você terminará com um arquivo PDF sem páginas (o que não é o mesmo que um arquivo vazio).

    
por 20.04.2016 / 20:46
2

Na linha de comando, digite:

ps2pdf blank.pdf

o comando ps2pdf é usado para converter o arquivo PostScript para pdf

ps2pdf file.ps file.pdf
    
por 21.04.2016 / 02:32