2010-07-15 22 views
5

Estoy intentando generar algún código LaTeX que a partir de allí debería generar documentos PDF. Actualmente, estoy usando el sistema de plantillas Django para crear dinámicamente el código, pero no tengo idea de cómo seguir adelante desde aquí. Entiendo que podría guardar el código en un archivo .tex y usar un subproceso para ejecutar pdflatex para generar el PDF. Pero tuve tantos problemas para escapar del código LaTeX en Python "simple" que decidí usar el sistema de plantillas Django. ¿Hay alguna manera de que de alguna manera pueda canalizar la salida producida por Django a pdflatex? El código producido funciona correctamente, es solo que no sé qué hacer con él.¿Cómo puedo generar PDF mediante programación utilizando LaTeX?

Gracias de antemano

Respuesta

5

que estaba abordando el mismo problema en un proyecto en el que había trabajado previamente en, y en lugar de tubería de la salida, he creado los archivos temporales en una carpeta temporal, ya que estaba preocupado por la manipulación del producto intermedio archivos que produce LaTeX. Este es el código que utilicé (nótese que tienen algunos años, desde que era nuevo en Python/Django; estoy seguro de que podría encontrar algo mejor si escribiera esto hoy, pero esto definitivamente funcionó para mí):

import os 
from subprocess import call 
from tempfile import mkdtemp, mkstemp 
from django.template.loader import render_to_string 
# In a temporary folder, make a temporary file 
tmp_folder = mkdtemp() 
os.chdir(tmp_folder)   
texfile, texfilename = mkstemp(dir=tmp_folder) 
# Pass the TeX template through Django templating engine and into the temp file 
os.write(texfile, render_to_string('tex/base.tex', {'var': 'whatever'})) 
os.close(texfile) 
# Compile the TeX file with PDFLaTeX 
call(['pdflatex', texfilename]) 
# Move resulting PDF to a more permanent location 
os.rename(texfilename + '.pdf', dest_folder) 
# Remove intermediate files 
os.remove(texfilename) 
os.remove(texfilename + '.aux') 
os.remove(texfilename + '.log') 
os.rmdir(tmp_folder) 
return os.path.join(dest_folder, texfilename + '.pdf') 

la variable dest_folder se suele fijar a algún lugar en el directorio de los medios de comunicación, por lo que el PDF a continuación, se puede servir estáticamente. El valor devuelto es la ruta al archivo en el disco. La lógica de cuál sería su URL se maneja con cualquier función que establezca el dest_folder.

+0

¡Gracias! Pero todavía tengo un problema. ¿Sería de alguna manera posible utilizar el motor de plantillas en un archivo existente? Entonces, ¿eso cambiaría las variables apropiadamente? Y podría escribir en un archivo tex correcto. Cajero automático Tengo el código en el sistema de plantillas sytanx almacenado en un archivo. –

+1

No estoy seguro de seguir completamente su pregunta, pero en el ejemplo anterior, "tex/base.tex" es un archivo TeX en el directorio de plantillas que también tiene etiquetas/filtros de plantillas Django, que se reemplazan por variables cuando pasa por 'render_to_string()'. Si desea cargar cualquier archivo anterior (desde fuera de los directorios de plantillas), puede hacer: 't = Template (open ('/ path/to/your/file.tex'). Read()); os.write (texfile, t.render (Context ({'var': 'whatever'})) '. Si quiere escribir en un lugar particular, haga:' os.write (open ('/ path/to/new) /file.tex ',' w '). fileno(), t.render (...)) '. –

+0

Ok, por un momento no entiendo bien tu código, ahora está bien: D. Tratar con un error extraño atm, no sé si está relacionado. –

Cuestiones relacionadas