¿Cómo creo un PDF en blanco desde la línea de comando?

58

Recientemente necesitaba una sola página PDF en blanco (tamaño 8.5 "x 11") y me di cuenta de que no sabía cómo hacer una desde la línea de comandos.

La emisión touch blank.pdfproduce un archivo PDF vacío . ¿Existe una herramienta de línea de comando que produce una página PDF vacía ?

Brian Fitzpatrick
fuente
¿Por qué lo necesitas? Tengo un paquete de impresión para emular la impresión a doble cara (dúplex) en impresoras no dúplex. Hacer esto requiere sacar una página en blanco adicional al imprimir las páginas pares para un trabajo que tiene un recuento de páginas impares. Para hacer esto, solo envío un formulario a lp. Eso hace el truco sin crear un archivo de página en blanco, etc.
Joe
10
@ Joe No es asunto nuestro por qué Brian quiere o necesita esto.
Iain Holder
66
@IainHolder: Me gustaría que más usuarios de SE pensaran como tú.
Mehrdad
3
@IainHolder - ¡No estoy tratando de entrometerme en el negocio del OP! Solo quería sugerir que si es algo como lo que estaba haciendo, entonces hay otra forma de hacerlo. A menudo, cosas como esta son problemas xy ( meta.stackexchange.com/questions/66377/what-is-the-xy-problem ), por lo que preguntar cuál es el objetivo puede ser bastante apropiado.
Joe
55
Acabo de leer el enlace de arriba en detalle. No me di cuenta de que este era un tema tan controvertido. TL; DR: si sabe lo que está haciendo, entonces solo quiere la respuesta a la pregunta que hizo. Si no está tan versado, es posible que haya hecho una pregunta equivocada y una aclaración de cuál es el problema real podría ayudar.
Joe

Respuestas:

86

convert, la utilidad ImageMagick utilizada en la respuesta de Ketan, también le permite escribir algo como

convert xc:none -page Letter a.pdf

o

convert xc:none -page A4 a.pdf

o (para papel A4 horizontal)

convert xc:none -page 842x595 a.pdf

etc. , sin crear un archivo de texto vacío. @chbrown notó que esto crea un archivo pdf más pequeño.

"xc:" significa "X imagen constante" pero realmente podría considerarse como "x lienzo". Es una forma de especificar un solo bloque de un color, en este caso ninguno. Más información en http://imagemagick.org/Usage/canvas/#solid, que es el manual "de facto" para ImageMagick. [complementado con información de la tubería] (Cosas como pdf:ase puede utilizar para declarar explícitamente el formato de un archivo. label:'some text', gradient:, rose:y logo: parecen ser otros ejemplos de formatos de archivos especiales.)

Anko sugirió publicar esta modificación como una respuesta separada, así que lo estoy haciendo.

BartekChom
fuente
2
ImageMagick realmente no tiene un manual útil. "xc: <foo>" significa "X imagen constante" pero realmente podría considerarse como "x canvas". Es una forma de especificar un solo bloque de un color, en este caso ninguno . Más información en imagemagick.org/Usage/canvas/#solid, que es el manual "de facto" para ImageMagick.
tubería
2
Por cierto, esto también funciona con A4 en lugar de Carta, si desea tamaños de papel razonables.
TRiG
@TRiG: Por supuesto. Lamento no haberte mencionado en mi edición, pero en este caso lo sabía.
BartekChom
Cambié esto a la respuesta aceptada, ya que es la que puse en mi~/bin
Brian Fitzpatrick
1
Al ejecutar este comando, recibí un error convert-im6.q16: not authorized 'blank.pdf' @ error/constitute.c/WriteImage/1037, pero encontré la solución aquí: askubuntu.com/questions/1081895/... Publicar aquí en caso de que ayude a cualquier otra persona que tenga el mismo problema.
Brent Yorgey
34

Al igual que el GIF más pequeño posible , el PDF de página en blanco más pequeño posible debe elaborarse a mano, porque es tan pequeño que fragmentos de metadatos innecesarios pero inofensivos se convierten en una parte significativa del tamaño del archivo, y la compresión en realidad hace que las cosas sean más grandes . También requiere una atención cuidadosa a las reglas en la especificación de PDF sobre qué partes de la estructura del archivo son y no son necesarias. (¿Sabía que los objetos de página deben contener un /Resourcesdiccionario, incluso si está vacío, pero no están obligados a incluir una /Contentssecuencia?)

Si no utiliza el objeto PDF 1.5 y las secuencias de referencia cruzada (que tiene la ventaja de que el archivo puede ser ASCII completamente imprimible), creo que lo mejor que puede hacer es 317 bytes. Si copiar y pegar, tomar nota de que es necesario que haya un espacio al final de las cuatro entradas de la tabla de referencias cruzadas (entre las líneas 0 4y trailer<<...), y que no hay , no supone que hay un salto de línea final después de 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

Reemplazar la tabla de referencia cruzada con una secuencia de referencia cruzada v1.5 diseñada manualmente hace que el archivo sea un poco más pequeño, al precio de que ya no se puede imprimir ASCII: 294 bytes. (En aras de la legibilidad, sin mencionar la posibilidad de escribirlo en absoluto, la secuencia xref a continuación se ha duplicado, pero esto no se refleja en su diccionario de secuencias. Para recuperar un PDF válido, debe reemplazar el hexdump con el correspondiente bytes binarios sin formato, o el cambio /Length 15de /Length 30/Filter/ASCIIHexDecodey aceptar un archivo que es de 328 bytes de longitud.)

%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

También experimenté envolviendo objetos del 1 al 3 en una secuencia de objetos, pero esto agrega más sobrecarga de la que ahorra, incluso cuando la secuencia está comprimida.

Una posible formulación alternativa de la corriente xref es

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

Lamentablemente, a pesar de los ahorros sustanciales en la longitud de los datos de transmisión reales, el adicional /Index[1 4]consume todos menos un byte de los ahorros. Además, no me queda claro si puede dejar el objeto 0 completamente fuera del archivo. (Tampoco me queda claro si el objeto 0 debe tener el número de generación -1. Si eso no es necesario, en realidad guarda más bytes con

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

.)

Para cambiar el tamaño del papel, reemplácelo 612 792con el ancho y la altura apropiados, expresados ​​en puntos PostScript (72 puntos PostScript = 1 pulgada de EE. UU. O 25,4 milímetros). Por ejemplo, 595 842para A4. Puede incrustar esto en un script de shell que escupe un PDF en blanco del tamaño de papel deseado; La única parte difícil sería asegurarse de que el startxrefdesplazamiento permaneciera exacto incluso si el tamaño del objeto 3 cambiara.

zwol
fuente
10
Esta podría ser una actividad divertida para codegolf.stackexchange.com
Nate Eldredge
55
Publiqué en meta.codegolf para ver si algo como esto sería bien recibido: meta.codegolf.stackexchange.com/questions/8990/…
Nate Eldredge
Si bien esta es una buena solución para crear un documento PDF válido con una página vacía en un editor de texto, no es exactamente lo que considero una solución de línea de comandos (como solicitó el OP).
Kurt Pfeifle
23

Si tiene convertinstalado (una utilidad ImageMagick), puede hacer esto:

touch a.txt && convert a.txt -page Letter a.pdf
mkc
fuente
1
convertTambién tiene una -sizeopción que puede usar para establecer el tamaño del PDF de salida.
mkc
21
También puede escribir convert xc:none -page Letter a.pdfsin crear un archivo txt vacío.
BartekChom
3
El método de @ BartekChom parece crear una página en blanco aún más vacía. Produce un archivo más pequeño, sin absolutamente nada seleccionable, y no desencadena ningún (null)error de fuente.
chbrown
1
@BartekChom Quiero eso como una respuesta separada para poder votarlo.
Anko
1
Tengo convert.im6: improper image header a.txt' @ error / txt.c / ReadTXTImage / 429. convert.im6: no hay imágenes definidasa.pdf' @ error/convert.c/ConvertImageCommand/3044.
Sigur
12

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

Traído a usted por Groff, el software más subestimado del mundo.

James K. Lowden
fuente
2
Obtengo groff: can't find `DESC' filey groff:fatal error: invalid device `pdf'con groff versión 1.22.2 en CentOS 7.2.
gla3dr
El mismo mensaje para mí usando bash 4.1.2runninggroff 1.18.1.4
zundarz
2
@ gla3dr Instale el paquete groff completo, no solo groff-base.
Capitán Jirafa
1
.bpsimplemente significa "página de salto", por lo que esto produce un documento de 2 páginas. Para producir un documento de 1 página, simplemente haga lo más simple echo | groff -T pdf > blank.pdf.
Faheem Mitha
muy buena solución, pero de echo .bphecho debería ser reemplazado por echo, como dijo
@FaheemMitha
8

Puedes usar pdfTeX:

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

que produce una página en blanco texput.pdfde aproximadamente 900 bytes, la mitad de lo que utiliza ImageMagick.

Sin embargo, esto lo pone a merced del tamaño de papel predeterminado de su instalación de TeX. Para establecer el tamaño explícitamente, puede ir a LaTeX en su lugar:

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

Otra opción más sería utilizar el controlador PDF de Ghostscript, aunque el útil ps2pdfscript:

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

que es mucho más silencioso que TeX pero produce una salida menos compacta (aproximadamente 2300 bytes).

Henning Makholm
fuente
1
Yo uso la variante echo "" | ps2pdf -sPAPERSIZE=a4 - blank.pdf. Esto es un poco más pequeño, a 2200 bytes.
Faheem Mitha
echo '\documentclass[letterpaper]{article}\usepackage[pass]{geometry} \begin{document}\shipout\hbox{}\end{document}' | pdflatexcrea article.pdf. ¿Es posible que se cree blank.pdfdirectamente?
Faheem Mitha
@FaheemMitha: Hmm, esperaría que ps2pdf con una entrada vacía produzca un archivo PDF que contenga cero páginas, pero cuando lo intento, de hecho hay una página allí.
Me
@Faheem: con Texlive al menos, puede establecer el nombre base del archivo de salida -jobname <basename>en la línea de comando.
Henning Makholm
1
@FaheemMitha: cada \shipout\hbox{}o showpageproduce una página. Tanto TeX como Postscript tienen construcciones en bucle que podría usar, pero probablemente sea más simple usar el lenguaje de scripting de su elección para duplicar el comando un número apropiado de veces.
Henning Makholm
3

Una manera fácil de hacer un PDF con una página en blanco, es usar rst2pdf:

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

simplemente hacer eco en un solo espacio no funcionará, terminarás con un archivo PDF sin páginas (que no es lo mismo que un archivo vacío).

Anthon
fuente
2

En la línea de comando, escriba:

ps2pdf blank.pdf

el comando ps2pdfse usa para convertir archivos PostScript a pdf

ps2pdf file.ps file.pdf
GAD3R
fuente
1
ps2pdf blank.pdfdevuelve un error, porque espera un archivo Postscript como argumento. Y el segundo comando requiere un preexistente file.pdf. ¿Me estoy perdiendo de algo?
Faheem Mitha
1
Intenta esto: 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, no menos importante, aquí está la forma de Ghostscript de crear un PDF que muestra una página vacía:

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

El tamaño de la página probablemente será Carta. Si quieres A4, usa esto:

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

Antecedentes: el -cparámetro puede ser seguido por cualquier cadena PostScript válida, que Ghostscript intentará interpretar. Y una página vacía en PostScript está representada por este bloque de código corto:

%!PS
showpage
Kurt Pfeifle
fuente