Come faccio a creare un PDF vuoto dalla riga di comando?


58

Di recente ho avuto bisogno di un'unica pagina PDF vuota (8,5 "x 11") e ho capito che non sapevo come crearne uno dalla riga di comando.

L'emissione touch blank.pdfproduce un file PDF vuoto . Esiste uno strumento da riga di comando che produce una pagina PDF vuota ?


Perchè ne hai bisogno? Ho un pacchetto di stampa per emulare la stampa fronte / retro (duplex) su stampanti non duplex. Per fare ciò è necessario creare una pagina vuota aggiuntiva quando si stampano le pagine pari per un lavoro che ha un numero di pagine dispari. Per fare questo, invio un formfeed a lp. Questo fa il trucco senza creare un file di pagina vuota, ecc.
Joe

10
@Joe Non è affar nostro perché Brian vuole o ne ha bisogno.
Titolare Iain,

6
@IainHolder: Vorrei che più utenti SE pensassero come te.
Mehrdad,

3
@IainHolder - Non sto cercando di fare affari nel PO! Volevo solo suggerire che se è qualcosa di simile a quello che stavo facendo, allora c'è un altro modo per farlo. Spesso cose come queste sono problemi xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), quindi chiedere quale sia l'obiettivo può essere del tutto appropriato.
Joe,

5
Ho appena letto il link sopra in dettaglio. Non mi rendevo conto che si trattasse di un problema così controverso. TL; DR: se sai cosa stai facendo, vuoi solo la risposta alla domanda che hai posto. Se non sei così esperto, potresti aver fatto la domanda sbagliata e chiarire quale sia il vero problema potrebbe essere d'aiuto.
Joe,

Risposte:


86

convert, l'utilità ImageMagick utilizzata nella risposta di Ketan, ti consente anche di scrivere qualcosa del genere

convert xc:none -page Letter a.pdf

o

convert xc:none -page A4 a.pdf

o (per carta A4 orizzontale)

convert xc:none -page 842x595 a.pdf

ecc. , senza creare un file di testo vuoto. @chbrown ha notato che questo crea un file pdf più piccolo.

"xc:" significa "X immagine costante" ma potrebbe davvero essere pensato come "x tela". È un modo per specificare un singolo blocco di un colore, in questo caso nessuno. Maggiori informazioni su http://imagemagick.org/Usage/canvas/#solid, che è il manuale "di fatto" di ImageMagick. [integrato con le informazioni da tubo] (Cose come pdf:apuò essere utilizzato per esplicitamente dichiarare il formato di un file. label:'some text', gradient:, rose:e logo: sembrano essere altri esempi di formati di file speciali.)

Anko ha suggerito di pubblicare questa modifica come risposta separata, quindi lo sto facendo.


2
ImageMagick non ha davvero un manuale utile. "xc: <foo>" significa "X immagine costante" ma potrebbe davvero essere pensato come "x tela". È un modo per specificare un singolo blocco di un colore, in questo caso nessuno . Maggiori informazioni su imagemagick.org/Usage/canvas/#solid che è il manuale "de facto" di ImageMagick.
pipe

2
Per inciso, questo funziona anche con A4 anziché Letter, se si desidera un formato carta sensibile.
TRiG

@TRiG: certo. Mi dispiace di non averti menzionato nella mia modifica, ma in questo caso lo sapevo.
BartekChom

Ho cambiato questa con la risposta accettata poiché è quella che ho inserito nel mio~/bin
Brian Fitzpatrick,

1
Durante l'esecuzione di questo comando ho ricevuto un errore convert-im6.q16: not authorized 'blank.pdf' @ error/constitute.c/WriteImage/1037, ma ho trovato la soluzione qui: askubuntu.com/questions/1081895/… Pubblicando qui nel caso in cui sia utile a chiunque incontri lo stesso problema.
Brent Yorgey,

34

Come la GIF più piccola possibile , il PDF a pagina vuota più piccolo possibile deve essere elaborato a mano, perché è così piccolo che i bit di metadati non necessari ma innocui diventano una parte significativa della dimensione del file e la compressione rende le cose più grandi . Richiede inoltre un'attenta attenzione alle regole delle specifiche PDF su quali bit della struttura dei file sono e non sono richiesti. (Sapevi che gli oggetti della pagina devono contenere un /Resourcesdizionario, anche se è vuoto, ma non è necessario includere uno /Contentsstream?)

Se non usi gli oggetti PDF 1.5 e i flussi di riferimenti incrociati (il che ha il vantaggio che il file può essere completamente ASCII stampabile) credo che il meglio che puoi fare sia 317 byte. Se copiando e incollando, prendere nota che ci deve essere uno spazio finale su tutte e quattro le voci della tabella di riferimento incrociato (le linee tra 0 4e trailer<<...), e che è non doveva essere una nuova riga finale dopo la %%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

La sostituzione della tabella dei riferimenti incrociati con un flusso di riferimenti incrociati v1.5 creato manualmente rende il file leggermente più piccolo, al prezzo del suo ASCII non più stampabile: 294 byte. (Per motivi di leggibilità, per non parlare della possibilità di digitarlo, il flusso di xrif di seguito è stato scaricato in esadecimale, ma questo non si riflette nel suo dizionario di flusso. Per recuperare un PDF valido è necessario sostituire il hexdump con il corrispondente byte binari prime o cambiamento /Length 15di /Length 30/Filter/ASCIIHexDecodee accettare un file che è di 328 byte.)

%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

Ho anche sperimentato il wrapping di oggetti da 1 a 3 in un flusso di oggetti, ma ciò aggiunge più sovraccarico di quanto risparmi, anche quando il flusso è compresso.

Una possibile formulazione alternativa del flusso xrif è

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

Purtroppo, nonostante i sostanziali risparmi nella lunghezza dei dati di flusso effettivi, l'aggiunta /Index[1 4]consuma tutti i risparmi tranne uno. Inoltre, non mi è chiaro se ti è permesso lasciare l'oggetto 0 completamente fuori dal file. (Non mi è nemmeno chiaro se l'oggetto 0 debba avere il numero di generazione -1. Se ciò non è necessario, in realtà si salvano più byte con

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

.)

Per modificare il formato della carta, sostituire 612 792con la larghezza e l'altezza appropriate, espresse in punti PostScript (72 punti PostScript = 1 pollice USA o 25,4 millimetri). Ad esempio, 595 842per A4. Potresti incorporarlo in uno script di shell che sputa un PDF vuoto di qualsiasi dimensione del foglio sia desiderato; l'unica parte difficile sarebbe assicurarsi che l' startxrefoffset rimanesse accurato anche se le dimensioni dell'oggetto 3 fossero cambiate.


10
Questa potrebbe essere un'attività divertente per codegolf.stackexchange.com
Nate Eldredge

5
Ho pubblicato su meta.codegolf per vedere se qualcosa del genere sarebbe stato ben accolto: meta.codegolf.stackexchange.com/questions/8990/…
Nate Eldredge

Mentre questa è una buona soluzione per creare un documento PDF valido con una pagina vuota in un editor di testo non è esattamente ciò che considero una soluzione a riga di comando (come richiesto dall'OP).
Kurt Pfeifle,

23

Se hai convert(un'utilità ImageMagick) installata, puoi farlo:

touch a.txt && convert a.txt -page Letter a.pdf

1
convertha anche -sizeun'opzione che è possibile utilizzare per impostare la dimensione del pdf di output.
mkc,

21
Puoi anche scrivere convert xc:none -page Letter a.pdfsenza creare file txt vuoto.
BartekChom,

3
Il metodo di @ BartekChom sembra creare una pagina vuota ancora più vuota. Produce un file più piccolo, con assolutamente nulla selezionabile su di esso, e non provoca (null)errori di font.
chbrown

1
@BartekChom Lo voglio come una risposta separata in modo da poterlo votare.
Anko,

1
Ho ottenuto convert.im6: improper image header a.txt '@ error / txt.c / ReadTXTImage / 429. convert.im6: nessuna immagine definitaa.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur

12

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

Offerto da groff, il software più sottovalutato del mondo.


2
Ottengo groff: can't find `DESC' filee groff:fatal error: invalid device `pdf'con groff versione 1.22.2 su CentOS 7.2.
gla3dr,

Lo stesso messaggio per me usando bash 4.1.2runninggroff 1.18.1.4
zundarz,

2
@ gla3dr Installa il pacchetto groff completo non solo groff-base.
Capitan Giraffe,

1
.bpsta per "break page", motivo per cui questo produce un documento di 2 pagine. Per produrre un documento di 1 pagina, fai semplicemente il più semplice echo | groff -T pdf > blank.pdf.
Faheem Mitha,

soluzione molto bella, ma in echo .bpeffetti dovrebbe essere sostituita da echo, proprio come ha detto
@FaheemMitha

8

Puoi usare pdfTeX:

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

che produce una pagina singola vuota texput.pdfdi circa 900 byte, metà di quella utilizzata da ImageMagick.

Questo ti mette però in balia delle impostazioni predefinite del formato carta della tua installazione TeX. Per impostare esplicitamente le dimensioni, puoi andare su LaTeX:

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

Un'altra opzione sarebbe quella di utilizzare il driver PDF di Ghostscript, sebbene lo ps2pdfscript utile :

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

che è molto più silenzioso di TeX ma produce un output meno compatto (circa 2300 byte).


1
Uso la variante echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Questo è leggermente più piccolo, a 2200 byte.
Faheem Mitha,

echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexcrea article.pdf. È possibile crearlo blank.pdfdirettamente?
Faheem Mitha,

@FaheemMitha: Hmm, mi aspetto che ps2pdf con un input vuoto produca un file PDF contenente zero pagine, ma quando provo c'è davvero una pagina lì. Mi chiedo da dove provenga ...
Henning Makholm,

@Faheem: almeno con Texlive, puoi impostare il nome di base del file di output con -jobname <basename>sulla riga di comando.
Henning Makholm,

1
@FaheemMitha: ognuno \shipout\hbox{}o showpageproduce una pagina. Sia TeX che Postscript hanno costrutti di loop che potresti usare, ma è probabilmente più semplice usare il linguaggio di script che preferisci per duplicare il comando un numero appropriato di volte.
Henning Makholm,

3

Un modo semplice per creare un PDF con una pagina vuota è usare rst2pdf:

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

solo l'eco in un singolo spazio non farà, finirai con un file PDF senza pagine (che non è lo stesso di un file vuoto).


2

Sulla riga di comando, digitare:

ps2pdf blank.pdf

il comando ps2pdfviene utilizzato per convertire il file PostScript in pdf

ps2pdf file.ps file.pdf

1
ps2pdf blank.pdfrestituisce un errore, poiché prevede un file Postscript come argomento. E il secondo comando richiede un preesistente file.pdf. Mi sto perdendo qualcosa?
Faheem Mitha,

1
Prova questo: 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

Ultimo, non ultimo, ecco il modo Ghostscript per creare un PDF che mostra una pagina vuota:

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

Molto probabilmente la dimensione della pagina sarà Letter. Se vuoi A4, usa questo:

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

Sfondo: il -cparametro può essere seguito da qualsiasi stringa PostScript valida, che Ghostscript cercherà di interpretare. E una pagina vuota in PostScript è rappresentata da questo blocco di codici brevi:

%!PS
showpage
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.