from subprocess import call, PIPE from os import remove, rename from os.path import dirname from tempfile import NamedTemporaryFile from django.template import loader, Context def process_latex(template, context={}, type='pdf', outfile=None): """ Processes a template as a LaTeX source file. Output is either being returned or stored in outfile. At the moment only pdf output is supported. """ t = loader.get_template(template) c = Context(context) r = t.render(c) tex = NamedTemporaryFile() tex.write(r) tex.flush() base = tex.name items = "log aux pdf dvi png".split() names = dict((x, '%s.%s' % (base, x)) for x in items) output = names[type] if type == 'pdf' or type == 'dvi': pdflatex(base, type) elif type == 'png': pdflatex(base, 'dvi') call(['dvipng', '-bg', '-transparent', names['dvi'], '-o', names['png']], cwd=dirname(base), stdout=PIPE, stderr=PIPE) remove(names['log']) remove(names['aux']) if not outfile: o = file(output).read() remove(output) return o else: rename(output, outfile) def pdflatex(file, type='pdf'): call(['pdflatex', '-interaction=nonstopmode', '-output-format', type, file], cwd=dirname(file), stdout=PIPE, stderr=PIPE)