web-dev-qa-db-fra.com

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

J'ai récemment eu besoin d'un seul blanc PDF (taille 8.5 "x 11") et j'ai réalisé que je ne savais pas comment en faire un à partir de la ligne de commande.

Émission touch blank.pdf produit un PDF fichier. Existe-t-il un outil en ligne de commande qui produit un PDF page?

61
Brian Fitzpatrick

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 vraiment être considéré comme "x canvas". C'est un moyen de spécifier un seul bloc d'une couleur, dans ce cas aucun. Plus d'informations sur http://imagemagick.org/Usage/canvas/#solid qui est le manuel "de facto" pour ImageMagick. [complété par des informations provenant de la pipe] (Des choses comme pdf:a peut ê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é de publier cette modification comme une réponse distincte, donc je le fais.

89
BartekChom

Comme le GIF le plus petit possible , la plus petite page blanche possible PDF doit être élaborée à la main, car elle est si petite que des bits de métadonnées inutiles mais inoffensifs devenir une partie importante de la taille du fichier, et la compression rend les choses plus grandes. Cela nécessite également une attention particulière aux règles de la spécification PDF sur les bits de la structure de fichier qui sont et ne sont pas requis. (Saviez-vous que les objets de page doivent contenir un /Resources dictionnaire, même s'il est vide, mais est pas requis pour inclure un /Contents stream?)

Si vous n'utilisez pas PDF 1.5 objet et flux de références croisées (ce qui a l'avantage que le fichier peut être complètement imprimable en ASCII), je crois que le mieux que vous puissiez faire est de 317 octets. Si vous copiez et coller, notez qu'il doit y avoir un espace de fin sur les quatre entrées du tableau de référence croisée (les lignes entre 0 4 et trailer<<...), et qu'il n'y a pas censé être une nouvelle ligne finale 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 de ne plus être imprimable ASCII: 294 octets. (Par souci de lisibilité, sans parler de pouvoir le taper du tout, le flux de xréfs ci-dessous a été hexdumpé, mais ceci n'est pas reflété dans son dictionnaire de flux. Pour récupérer un PDF PDF valide, vous devez soit remplacer le vidage hexadécimal par les octets binaires bruts correspondants, soit modifier /Length 15 à /Length 30/Filter/ASCIIHexDecode et acceptez un fichier 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 expérimenté l'encapsulation d'objets 1 à 3 dans un flux d'objets, mais cela ajoute plus de surcharge qu'elle n'en enregistre, même lorsque le flux est compressé.

Une autre formulation possible du flux de xréfs 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 dans la longueur des données de flux réelles, les /Index[1 4] consomme tout sauf un octet d'économies. De plus, il n'est pas clair pour moi si vous êtes autorisé à laisser l'objet 0 complètement hors du fichier. (Il m'est également difficile de savoir si l'objet 0 doit avoir le numéro de génération -1. Si c'est non requis, vous économisez en fait plus 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 612 792 avec 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 842 pour A4. Vous pouvez intégrer cela dans un script Shell qui crache un blanc PDF quel que soit le format de papier souhaité; la seule partie délicate serait de s'assurer que l'offset startxref reste précis même si la taille de l'objet 3 a changé.

33
zwol

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

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

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

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

13
James K. Lowden

Vous pouvez utiliser pdfTeX:

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

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

Cela vous met cependant à la merci du format de papier par défaut de votre installation TeX. Pour définir la taille de manière explicite, vous pouvez aller à LaTeX à la place:

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

Encore une autre option serait d'utiliser le pilote PDF PDF de Ghostscript, bien que le ps2pdf script:

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

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

Un moyen simple de créer un PDF avec une page vierge, utilise rst2pdf:

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

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

3
Anthon

Sur la ligne de commande, tapez:

ps2pdf blank.pdf

la commande ps2pdf est utilisé pour convertir un fichier PostScript en pdf

ps2pdf file.ps file.pdf
2
GAD3R

Enfin, voici la manière Ghostscript de créer un PDF montrant 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

Contexte: le (-c Le paramètre peut être suivi par n'importe quelle chaîne PostScript valide, que Ghostscript essaiera d'interpréter. Et une page vide dans PostScript est représentée par ce bloc de code court:

%!PS
showpage
2
Kurt Pfeifle

Cela produira un PDF de 1 page vierge:

gs -sDEVICE=pdfwrite -o emptyOnePage.pdf -dDEVICEWIDTHPOINTS=612 -dDEVICEHEIGHTPOINTS=792 -c 1 {showpage} repeat

Remplacez 1 Par un nombre plus grand pour produire plus de pages.

Cela produira un PDF de 64 numéroté pages:

gs -sDEVICE=pdfwrite -o NumberPages64.pdf -dDEVICEWIDTHPOINTS=612 -dDEVICEHEIGHTPOINTS=792 -c "/Times-Roman findfont 32 scalefont setfont /pagenum 0 def 64 {newpath 250 50 moveto (page ) /pagenum pagenum 1 add def show pagenum ( ) cvs show showpage} repeat"

Remplacez 64 Par le nombre de pages souhaité (1 Fonctionne aussi). 1000000 A fonctionné quand je l'ai essayé - mais j'ai fait pas ouvert que sorti dans une visionneuse de documents!

0
Rob Tow