¿Generación automática e impresión de archivos PDF desde Markdown?

Estoy buscando una manera de que mi computadora genere e imprima automáticamente archivos PDF desde una carpeta llena de archivos de descuento.

Por lo tanto, todas las mañanas a las 5 a.m. quisiera que mi computadora mirara mi carpeta /markdown-files, creara un montón de archivos PDF para ir a una carpeta /PDF y también ejecutara la impresora para que las páginas me estuvieran esperando.

Hay un par de requisitos que pueden hacer que esto sea un poco complicado:

  1. Los archivos PDF deben tener el título del archivo en la parte superior de cada página.
  2. La página debe ser A4.
  3. Las líneas deben estar a doble espacio por lo menos.

Solía ​​usar WKPDF para generar archivos PDF, pero ya no funciona en Yosemite.

Respuestas (4)

Puede hacer esto con Markdown.pl y htmldoc(1), los cuales se pueden instalar con Homebrew . El flujo básico para hacer un PDF es:

markdown foo.markdown | htmldoc --no-toc --no-title -f foo.pdf -

En cuanto a su nombre de archivo por página, puede incorporar echo para agregarlo como un elemento HTML:

echo $(markdown foo.markdown) "<p>foo</p>" | htmldoc --no-toc --no-title -f foo.pdf -

Y para imprimir, el comando lpr(1) enviará un archivo a su impresora predeterminada.

Atando esto por completo:

for filename in `ls *.markdown`;
do
    echo $(markdown "$filename") "<p>$filename</p>" | 
        htmldoc --no-toc --no-title -f "${filename}.pdf" -
    lpr "${filename}.pdf"
done
Gracias por tu ayuda. He jugado con htmldoc y puedo ver cómo hacer que haga lo que quiero, pero tendrás que perdonarme, porque no estoy seguro de dónde poner ese fragmento de código para que se ejecute en un momento determinado. .
Editar: ¡Hazel al rescate!
¡Excelente! Habría sugerido un cronjob, pero Hazel es mucho más amigable.
Todavía hay un problema: este bucle solo imprime el primer archivo una y otra vez, no todos los archivos una vez. para nombre de archivo en ls *.md; do echo $(markdown $nombre de archivo) "<p>$nombre de archivo</p>" | htmldoc --no-toc --no-title --fontspacing 3 --size a4 -f ${nombre de archivo}.pdf -lpr ${nombre de archivo}.pdf hecho
Creo que me acabo de dar cuenta de que esta es mi propia culpa tonta por tener canalizaciones en los nombres de mis archivos.
Esa evaluación de las opciones de caracteres de su nombre de archivo es correcta.
Puedo ver que todavía hay un problema: en lugar de crear e imprimir 'mi nombre de archivo.pdf', está tratando de hacer 'mi.pdf' y 'nombre de archivo.pdf'
Ponga comillas dobles $filenamedonde sea que se use como argumento para un comando para superar esto. Entonces debería funcionar también con canalizaciones en el nombre.
¿No es esta respuesta un ejemplo de "nunca debes analizar lsla salida" ? Entonces, en lugar de `ls *.markdown`debería ser solo *.markdown(con un globo *). PD Además, es una mejor práctica usar $(command)en lugar de acentos graves `command`.
Intentar instalar html doc en el capitan produce: htmldoc: esta fórmula no se compila ni funciona como se esperaba en las versiones de OS X más nuevas que Yosemite debido a una incompatibilidad ascendente. Error: un requisito insatisfecho falló en esta compilación.
@CGPGrey Sí, la compilación desde la fuente (barra lateral izquierda) falla... pero cambiar una sola línea hace que funcione. En la línea 1385, convierta ese 0 en un valor booleano: cinfo.quantize_colors = (boolean)0;. Luego, con un ./configure && make, compila y ejecuta para mí (el programa de salida es htmldoc/htmldoc)

Aquí hay una solución que usa LaTeX para generar el PDF. Si tiene texto de formato largo en los archivos Markdown y le gustaría optimizar la legibilidad tipográfica (y sospecho que sí), LaTeX tiende a hacer un trabajo mucho mejor en comparación con los motores HTML.

Se utiliza pandoccomo intermediario entre Markdown y LaTeX, y también produce el PDF para usted.

Guión principal

#!/bin/bash

md-dir="MARKDOWN_DIRECTORY_HERE"
pdf-dir="PDF_DIRECTORY_HERE"

cd "${md-dir}"
for filename in *.md; do
    target-pdf="${pdf-dir}/${filename}.pdf"
    pandoc "${filename}" -t latex --latex-engine=xelatex -V geometry=a4paper -V fontsize=11pt -V listings -V header-includes="\usepackage{fancyhdr}\pagestyle{fancyplain}\cfoot{}\rhead{\thepage}\lhead{\texttt{\lstinline/${filename}/}}" -V header-includes="\linespread{2.0}" -o "${target-pdf}"
    echo "produced ${filename}.pdf"
    lpr "${target-pdf}"
done

Configuración requerida

  1. Obtener pandocde Homebrew:brew install pandoc
  2. Instale la versión mínima de LaTeX llamada BasicTeX

Probando si tienes la configuración correcta

Debería poder ejecutar en una nueva ventana de Terminal (con bash)

echo "test" | pandoc -t latex --latex-engine=xelatex -o test.pdf

y obtenga un test.pdfdocumento válido con solo la palabra "prueba"

Personalizaciones

Hay muchas cosas que puede modificar con la configuración de LaTeX desde la línea de comandos

  1. ajustar el espacio entre líneas cambiando el \linespread{2.0}multiplicador
  2. ajuste las marcas reemplazando geometry=a4papercongeometry=a4paper,left=XXmm,right=XXmm,top=XXmm,bottom=XXmm
  3. cambie el tamaño de fuente encadenando 11pta 10 o 12 puntos, y todo debería escalar en consecuencia
  4. cambie la fuente principal agregando otro argumento a pandoc: -V mainfont="NAME OF FONT". También puede configurar monofontde esta manera.
Sería más fácil de mantener solo \input{my-template-file}desde la línea de comando.
Muy interesante. Jugaré con la opción. Gracias.
Ejecutar la prueba produce: "pandoc: xelatex no encontrado. xelatex es necesario para la salida en pdf".
Solo quiero asegurarme: esto es después de instalar el paquete BasicTeX como se describe arriba, ¿verdad? ¿Puede ejecutar "xelatex" o "pdflatex" normalmente desde la terminal?

No he usado WKPDF, pero su autor sugiere un método por el cual se puede hacer que funcione en Yosemite: https://github.com/plessl/wkpdf/wiki/How-to-install-on-MacOS-10.10-Yosemite

RVM: comando no encontrado.

Podrías usar PhantomJS . No es tan sencillo como WKPDF para la generación de PDF, ya que tiene una gama más amplia de funciones, pero funciona bien.