Como crio um PDF em branco na linha de comando?

57

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

A emissão touch blank.pdfproduz um arquivo PDF vazio . Existe uma ferramenta de linha de comando que produz uma página PDF vazia ?

Brian Fitzpatrick
fonte
Por que você precisa disso? Eu tenho um pacote de impressão para emular a impressão em frente e verso (duplex) em impressoras não duplex. Para fazer isso, é necessário colocar uma página em branco extra ao imprimir as páginas pares para um trabalho com uma contagem ímpar de páginas. Para fazer isso, enviei um feed de formulário para lp. Que faz o truque sem criar um arquivo de página em branco, etc ..
Joe
10
@ Joe Não é da nossa conta porque Brian quer ou precisa disso.
Iain Titular
6
@IainHolder: Desejo que mais usuários do SE pensem como você.
Mehrdad
3
@IainHolder - Não estou tentando me intrometer nos negócios do OP! Eu só queria sugerir que, se é algo parecido com o que eu estava fazendo, existe outra maneira de fazer isso. Muitas vezes, coisas assim são problemas xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), portanto, perguntar qual é o objetivo pode ser bastante apropriado.
Joe
5
Acabei de ler o link acima em detalhes. Não sabia que era uma questão tão controversa. TL; DR - se você sabe o que está fazendo, apenas deseja a resposta para a pergunta que fez. Se você não é tão versado, pode ter feito a pergunta errada e esclarecimentos sobre qual é o problema real.
Joe

Respostas:

85

convert, o utilitário ImageMagick usado na resposta do Ketan também permite escrever 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. @chbrown notou que isso cria um arquivo pdf menor.

"xc:" significa "X Constant Image", mas pode ser realmente considerado como "x canvas". É uma maneira de especificar um único bloco de uma cor, neste caso nenhum. Mais informações em http://imagemagick.org/Usage/canvas/#solid, que é o manual "de fato" do ImageMagick. [complementado com informações da tubulação] (Coisas como pdf:apode ser usado para declarar explicitamente o formato de um arquivo. label:'some text', gradient:, rose:e logo: parecem ser outros exemplos de formatos de arquivos especiais.)

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

BartekChom
fonte
2
O ImageMagick não possui realmente um manual útil. "xc: <foo>" significa "X Constant Image", mas pode ser realmente considerado como "x canvas". É uma maneira de especificar um único bloco de uma cor, neste caso nenhum . Mais informações em imagemagick.org/Usage/canvas/#solid, que é o manual "de fato" do ImageMagick.
pipe
2
Por sinal, também funciona com A4 em vez de Carta, se você desejar tamanhos de papel sensíveis.
TRiG 21/04
@TRiG: Claro. Lamento não ter mencionado você na minha edição, mas, neste caso, eu sabia disso.
BarrekChom
Eu mudei isso para a resposta aceita, já que é o que eu colocar no meu~/bin
Brian Fitzpatrick
Este comando pode ser alterado para produzir um arquivo pdf com n páginas em branco?
Brian Fitzpatrick
34

Como o menor GIF possível , o menor possível em branco páginas PDF precisa ser trabalhado à mão, porque é tão pequena que os bits desnecessários-mas-inofensiva de metadados tornam-se uma parte significativa do tamanho do arquivo e compressão realmente torna as coisas maiores . Também requer atenção cuidadosa às regras na especificação do PDF sobre quais bits da estrutura do arquivo são e não são necessários. (Você sabia que os objetos da página devem conter um /Resourcesdicionário, mesmo que esteja vazio, mas não precisam incluir um /Contentsfluxo?)

Se você não usar o objeto PDF 1.5 e fluxos de referência cruzada (que tem a vantagem de que o arquivo pode ser completamente imprimível em ASCII), acredito que o melhor que você pode fazer é 317 bytes. Se estiver copiando e colando, observe que precisa haver um espaço à direita em todas as quatro entradas da tabela de referência cruzada (as linhas entre 0 4e trailer<<...) e que não deve haver 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, pelo preço de não ser mais ASCII imprimível: 294 bytes. (Para fins de legibilidade, sem mencionar a possibilidade de digitá-lo, o fluxo de refex abaixo foi hexdump, mas isso não é refletido em seu dicionário de stream. Para recuperar um PDF válido, você deve substituir o hexdump pelo bytes binários brutos correspondentes ou altere /Length 15para /Length 30/Filter/ASCIIHexDecodee aceite um arquivo com 328 bytes.)

%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

Também experimentei agrupar os objetos 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 de refex é

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 no comprimento dos dados reais do fluxo, o adicional /Index[1 4]consome quase um byte da economia. Além disso, não está claro para mim se você tem permissão para 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 for necessário, você realmente salvará 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 792pela largura e altura apropriadas, expressas em pontos PostScript (72 pontos PostScript = 1 polegada americana ou 25,4 milímetros). Por exemplo, 595 842para A4. Você pode incorporar isso em um script de shell que cospe um PDF em branco de qualquer tamanho de papel desejado; a única parte complicada seria garantir que o startxrefdeslocamento permanecesse preciso, mesmo que o tamanho do objeto 3 fosse alterado.

zwol
fonte
10
Esta pode ser uma atividade divertida para codegolf.stackexchange.com
Nate Eldredge
5
Eu postei a meta.codegolf para ver se algo como isto seria bem recebido: meta.codegolf.stackexchange.com/questions/8990/...
Nate Eldredge
Embora esta seja uma boa solução para criar um documento PDF válido com uma página vazia em um editor de texto, não é exatamente o que eu considero uma solução de linha de comando (como o OP pediu).
Kurt Pfeifle
23

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

touch a.txt && convert a.txt -page Letter a.pdf
mkc
fonte
11
converttambém tem uma -sizeopção que você pode usar para definir o tamanho do pdf de saída.
Mkc #
21
Você também pode escrever convert xc:none -page Letter a.pdfsem criar um arquivo txt vazio.
BarrekChom
3
O método do @ BartekChom parece criar uma página em branco ainda mais fraca. Produz um arquivo menor, com absolutamente nada selecionável, e não dispara nenhum (null)erro de fonte.
chbrown
11
@BartekChom Eu quero isso como uma resposta separada para que eu possa votar novamente.
Anko
11
Eu recebi convert.im6: improper image header a.txt '@ error / txt.c / ReadTXTImage / 429. convert.im6: nenhuma imagem definidaa.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur 20/06
12

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

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

James K. Lowden
fonte
2
Eu recebo groff: can't find `DESC' filee groff:fatal error: invalid device `pdf'com a versão 1.22.2 do Groff no CentOS 7.2.
gla3dr
Mesma mensagem para mim usando bash 4.1.2runninggroff 1.18.1.4
zundarz
2
@ gla3dr Instale o pacote groff completo e não apenas o groff-base.
Capitão girafa
11
.bpsignifica apenas "quebra de página", e é por isso que produz um documento de 2 páginas. Para produzir um documento de 1 página, faça o ainda mais simples echo | groff -T pdf > blank.pdf.
FaHemem Mitha
solução muito boa, mas de echo .bpfato deve ser substituída por echo, exatamente como @FaheemMitha disse
myrdd 02/04
8

Você pode usar o pdfTeX:

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

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

Isso coloca você à mercê do tamanho padrão do papel da instalação do TeX. Para definir o tamanho explicitamente, você pode ir para o 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, embora o ps2pdfscript útil :

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).

Henning Makholm
fonte
11
Eu uso a variante echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Isso é um pouco menor, com 2200 bytes.
Faheem Mitha
echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexcria article.pdf. É possível fazê-lo criar blank.pdfdiretamente?
Faheem Mitha
@FaheemMitha: Hmm, eu esperaria que o ps2pdf com uma entrada vazia produzisse um arquivo PDF contendo zero páginas - mas quando eu tento há realmente uma página lá. De saber onde que vem de ...
Henning Makholm
@ Faaem: Com o Texlive, pelo menos, você pode definir o nome da base do arquivo de saída -jobname <basename>na linha de comando.
Henning Makholm
11
@FaheemMitha: Cada um \shipout\hbox{}ou showpageproduz uma página. O TeX e o Postscript têm construções em loop que você pode usar, mas provavelmente é mais simples usar a linguagem de script de sua escolha para duplicar o comando um número apropriado de vezes.
Henning Makholm
3

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

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

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

Anthon
fonte
2

Na linha de comandos, digite:

ps2pdf blank.pdf

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

ps2pdf file.ps file.pdf
GAD3R
fonte
11
ps2pdf blank.pdfretorna um erro, porque espera um arquivo Postscript como argumento. E o segundo comando requer um pré-existente file.pdf. Estou esquecendo de algo?
Faheem Mitha
11
Tente o seguinte: 1 touch blank.ps.; 2 ps2pdf blank.ps blank.pdf.; 3.pdftk A=1.pdf B=blank.pdf cat A1-end B output 2.pdf
Victoria Stuart
2

Por último, não menos importante, aqui está a maneira Ghostscript de criar um PDF mostrando uma página vazia:

 gs -sDEVICE=pdfwrite -o empty.pdf -c showpage

O tamanho da página provavelmente será Letter. Se você deseja A4, use o seguinte:

 gs -sDEVICE=pdfwrite -o empty.pdf -g5950x8420 -c showpage

Background: o -cparâmetro pode ser seguido por qualquer string PostScript válida, que o Ghostscript tentará interpretar. E uma página vazia no PostScript é representada por este pequeno bloco de código:

%!PS
showpage
Kurt Pfeifle
fonte