Comment créer un fichier PDF vierge à partir de la ligne de commande?

58

J'ai récemment eu besoin d'une seule page PDF vierge (8,5 "x 11") et me suis rendu compte que je ne savais pas comment en créer une à partir de la ligne de commande.

L'émission touch blank.pdfproduit un fichier PDF vide . Existe-t-il un outil de ligne de commande produisant une page PDF vide ?

Brian Fitzpatrick
la source
Pourquoi en avez-vous besoin? J'ai un package d'impression pour émuler une impression recto verso sur des imprimantes non-duplex. Pour ce faire, vous devez créer une page vierge supplémentaire lors de l'impression des pages paires numérotées pour un travail dont le nombre de pages est impair. Pour ce faire, je viens d'envoyer un formulaire à lp. Cela fait l'affaire sans créer un fichier de page vierge, etc.
Joe
10
@ Joe Ce n'est pas notre affaire pourquoi Brian veut ou a besoin de ça.
Iain Holder
6
@IainHolder: J'aimerais que plus d'utilisateurs SE pensent comme vous.
Mehrdad
3
@IainHolder - Je n'essaie pas de me mêler des affaires du PO! Je voulais simplement suggérer que si c'est quelque chose comme ce que je faisais, alors il y a une autre façon de le faire. Il arrive souvent que des problèmes comme celui-ci posent des problèmes xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), il est donc tout à fait approprié de demander quel est l'objectif.
Joe
5
Je viens de lire le lien ci-dessus en détail. Je n'avais pas réalisé qu'il s'agissait d'une question tellement controversée. TL; DR - si vous savez ce que vous faites, vous souhaitez simplement obtenir la réponse à la question que vous avez posée. Si vous n'êtes pas très au courant, vous avez peut-être posé la mauvaise question et une clarification de la nature du problème pourrait aider.
Joe

Réponses:

86

convert, l'utilitaire ImageMagick utilisé dans la réponse de Ketan, vous permet également d'écrire quelque chose comme

convert xc:none -page Letter a.pdf

ou

convert xc:none -page A4 a.pdf

ou (pour le papier A4 horizontal)

convert xc:none -page 842x595 a.pdf

etc. , sans créer de fichier texte vide. @chbrown a remarqué que cela crée un fichier pdf plus petit.

"xc:" signifie "X Constant Image" mais pourrait être considéré comme "x canvas". C'est un moyen de spécifier un seul bloc d'une couleur, dans ce cas rien. Plus d'informations sur http://imagemagick.org/Usage/canvas/#solid qui est le manuel "de facto" pour ImageMagick. [complétées par des informations de conduite] ( Des choses comme pdf:apeut être utilisé pour déclarer explicitement le format d'un fichier. label:'some text', gradient:, rose:et logo: semblent être d' autres exemples de formats de fichiers spéciaux.)

Anko a suggéré d'afficher cette modification séparément, alors je le fais.

BartekChom
la source
2
ImageMagick n'a pas vraiment de manuel utile. "xc: <foo>" signifie "X Constant Image" mais pourrait être considéré comme "x canvas". C'est un moyen de spécifier un seul bloc d'une couleur, dans ce cas rien . Plus d'infos sur imagemagick.org/Usage/canvas/#solid qui est le manuel "de facto" pour ImageMagick.
pipe
2
En passant, cela fonctionne également avec A4 au lieu de Letter, si vous voulez des formats de papier adaptés.
TRiG
@TRiG: bien sûr. Je suis désolé de ne pas vous avoir mentionné dans mon édition, mais dans ce cas, je le savais.
BartekChom
J'ai changé cela en réponse acceptée car c'est celle que j'ai mise dans mon~/bin
Brian Fitzpatrick
1
Lors de l'exécution de cette commande, une erreur s'est produiteconvert-im6.q16: not authorized 'blank.pdf' @ error/constitute.c/WriteImage/1037 , mais j'ai trouvé la solution ici: askubuntu.com/questions/1081895/… .
Brent Yorgey
34

Comme le plus petit possible GIF , le plus petit a besoin de la page blanche PDF peut être travaillé à la main, car il est si petit que les bits inutiles mais Inoffensif de métadonnées deviennent une partie importante de la taille du fichier et la compression fait réellement des choses plus . Cela nécessite également une attention particulière aux règles de la spécification PDF concernant les éléments de la structure de fichier qui sont ou non requis. (Saviez-vous que les objets de page doivent contenir un /Resourcesdictionnaire, même s'il est vide, mais ne sont pas obligés d'inclure un /Contentsflux?)

Si vous n'utilisez pas d'objet PDF 1.5 ni de flux de références croisées (ce qui présente l'avantage que le fichier peut être complètement imprimable en ASCII), je pense que le mieux que vous puissiez faire est de 317 octets. Si vous copiez et collez, notez qu'il doit y avoir un espace de fin sur les quatre entrées du tableau de références croisées (les lignes entre 0 4et trailer<<...), et qu’il n’est pas supposé être un retour à la ligne final après le %%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

Le remplacement de la table de références croisées par un flux de références croisées v1.5 conçu manuellement rend le fichier légèrement plus petit, au prix où il n'est plus imprimable ASCII: 294 octets. (Par souci de lisibilité, sans oublier de pouvoir le saisir du tout, le flux de xréf ci-dessous a été hexdumpé, mais cela ne figure pas dans son dictionnaire de flux. Pour récupérer un fichier PDF valide, vous devez remplacer le fichier hexadécimal par le correspondant octets binaires brutes, ou le changement /Length 15à /Length 30/Filter/ASCIIHexDecodeet accepter un fichier qui est de 328 octets.)

%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

J'ai également essayé d'encapsuler les objets 1 à 3 dans un flux d'objet, mais cela ajoute plus de temps système qu'il n'enregistre, même lorsque le flux est compressé.

Une formulation alternative possible du flux de xréf est

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

Malheureusement, malgré les économies substantielles réalisées sur la longueur des données de flux réelles, l’addition supplémentaire /Index[1 4]absorbe la totalité des économies réalisées sauf un octet. En outre, il m'est difficile de savoir si vous êtes autorisé à laisser l'objet 0 complètement en dehors du fichier. (Il m'est également difficile de savoir si l'objet 0 doit avoir le numéro de génération -1. Si cela n'est pas nécessaire, vous enregistrez davantage d'octets avec

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

.)

Pour modifier le format du papier, remplacez-le 612 792par la largeur et la hauteur appropriées, exprimées en points PostScript (72 points PostScript = 1 pouce américain ou 25,4 millimètres). Par exemple, 595 842pour A4. Vous pouvez l'intégrer dans un script shell qui crée un fichier PDF vierge, quel que soit le format de papier souhaité. la seule difficulté consiste à s'assurer que le startxrefdécalage reste précis même si la taille de l'objet 3 change.

zwol
la source
10
Cela pourrait être une activité amusante pour codegolf.stackexchange.com
Nate Eldredge le
5
J'ai posté sur meta.codegolf pour voir si quelque chose comme cela serait bien reçu: meta.codegolf.stackexchange.com/questions/8990/…
Nate Eldredge le
Bien que ce soit une bonne solution pour créer un document PDF valide avec une page vide dans un éditeur de texte, ce n'est pas exactement ce que je considère comme une solution en ligne de commande (comme l'OP l'a demandé).
Kurt Pfeifle
23

Si vous avez convert(un utilitaire ImageMagick) installé, vous pouvez faire ceci:

touch a.txt && convert a.txt -page Letter a.pdf
mkc
la source
1
converta également une -sizeoption que vous pouvez utiliser pour définir la taille du fichier PDF en sortie.
mkc
21
Vous pouvez également écrire convert xc:none -page Letter a.pdfsans créer de fichier txt vide.
BartekChom
3
La méthode de @ BartekChom semble créer une page vierge encore plus vierge. Il produit un fichier plus petit, avec absolument rien sélectionnable, et il ne déclenche aucune (null)erreur de police.
chbrown
1
@BartekChom Je veux que cela soit une réponse distincte afin que je puisse le revigorer.
Anko
1
J'ai convert.im6: improper image header eu.txt '@ error / txt.c / ReadTXTImage / 429. convert.im6: aucune image définiea.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur
12

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

Présenté par groff, le logiciel le plus sous-estimé du monde.

James K. Lowden
la source
2
Je reçois groff: can't find `DESC' fileet groff:fatal error: invalid device `pdf'avec groff version 1.22.2 sur CentOS 7.2.
gla3dr
Même message pour moi avec bash 4.1.2runninggroff 1.18.1.4
zundarz le
2
@ gla3dr Installez le paquet complet groff et pas seulement groff-base.
Capitaine Giraffe, le
1
.bpsignifie simplement "casser la page", raison pour laquelle cela produit un document de 2 pages. Pour produire un document d'une page, il suffit de faire encore plus simple echo | groff -T pdf > blank.pdf.
Faheem Mitha
solution très agréable, mais echo .bpdevrait en effet être remplacé par echo, tout comme @FaheemMitha dit
myrdd
8

Vous pouvez utiliser pdfTeX:

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

qui produit une seule page vierge texput.pdfd'environ 900 octets, soit la moitié de ce qu'utilise ImageMagick.

Cela vous met cependant à la merci du format de papier par défaut de votre installation TeX. Pour définir explicitement la taille, vous pouvez plutôt vous rendre à LaTeX:

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

Une autre option consisterait à utiliser le pilote PDF de Ghostscript, bien que le ps2pdfscript pratique :

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

ce qui est beaucoup plus silencieux que TeX mais produit une sortie moins compacte (environ 2300 octets).

Henning Makholm
la source
1
J'utilise la variante echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. C'est légèrement plus petit, à 2200 octets.
Faheem Mitha
echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexcrée article.pdf. Est-il possible de le créer blank.pdfdirectement?
Faheem Mitha
@FaheemMitha: Hmm, je m'attendrais à ce que ps2pdf avec une entrée vide produise un fichier PDF ne contenant aucune page - mais lorsque j'essaie, il y a bien une page. Je me demande d'où ça vient ...
Henning Makholm
@Faheem: Avec Texlive au moins, vous pouvez définir le nom de base du fichier de sortie avec -jobname <basename>sur la ligne de commande.
Henning Makholm
1
@FaheemMitha: Chacun \shipout\hbox{}ou showpageproduit une page. TeX et Postscript ont des constructions en boucle que vous pouvez utiliser, mais il est probablement plus simple d'utiliser le langage de script de votre choix pour dupliquer la commande un nombre de fois approprié.
Henning Makholm
3

Un moyen simple de créer un PDF avec une page vierge consiste à rst2pdf:

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

écho dans un seul espace ne fera pas, vous vous retrouverez avec un fichier PDF sans pages (qui n'est pas la même chose qu'un fichier vide).

Anthon
la source
2

Sur la ligne de commande, tapez:

ps2pdf blank.pdf

la commande ps2pdfest utilisée pour convertir un fichier PostScript en pdf

ps2pdf file.ps file.pdf
GAD3R
la source
1
ps2pdf blank.pdfrenvoie une erreur, car il attend un fichier Postscript en tant qu'argument. Et la deuxième commande nécessite un pré-existant file.pdf. Est-ce que je manque quelque chose?
Faheem Mitha
1
Essayez ceci: 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

Enfin, voici la méthode Ghostscript pour créer un PDF affichant une page vide:

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

La taille de la page sera probablement Lettre. Si vous voulez A4, utilisez ceci:

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

Arrière-plan: le -cparamètre peut être suivi de n’importe quelle chaîne PostScript valide, que Ghostscript essaiera d’interpréter. Et une page vide en PostScript est représentée par ce bloc de code court:

%!PS
showpage
Kurt Pfeifle
la source