2010-07-15 6 views
5

Sto provando a generare del codice LaTeX che da lì dovrebbe generare documenti PDF. Attualmente, sto usando il sistema di template di Django per creare dinamicamente il codice, ma non ho idea su come andare avanti da qui. Capisco che potrei salvare il codice in un file .tex e utilizzare il sottoprocesso per eseguire pdflatex per generare il PDF. Ma ho avuto così tanti problemi a sfuggire al codice LaTeX in "plain" Python che ho deciso di utilizzare il sistema di template di Django. C'è un modo in cui potrei in qualche modo canalizzare l'output prodotto da Django in pdflatex? Il codice prodotto funziona correttamente, è solo che non so cosa farmene.Come posso generare PDF in modo programmatico con LaTeX?

Grazie in anticipo

risposta

5

stavo affrontando lo stesso problema in un progetto che avevo in precedenza lavorato su, e, invece di piping dell'output, ho creato i file temporanei in una cartella temporanea, dal momento che ero preoccupato per gestire l'intermedio file prodotti da LaTeX. Questo è il codice che ho usato (nota che ha pochi anni, da quando ero ancora nuovo in Python/Django, sono sicuro che avrei potuto inventare qualcosa di meglio se stavo scrivendo questo oggi, ma questo ha funzionato decisamente per me):

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 variabile dest_folder è di solito impostato da qualche parte nella directory di mezzi di comunicazione, in modo che il PDF può essere servita in modo statico. Il valore restituito è il percorso del file sul disco. La logica di ciò che sarebbe il suo URL è gestita da qualunque funzione imposta lo dest_folder.

+0

Grazie! Ma ho ancora un problema. Sarebbe in qualche modo possibile utilizzare il motore di template su un file esistente? Quindi, cambierebbe le variabili correttamente? E potrei scrivere su un vero file tex. Atm Ho il codice nel sistema di template sytanx memorizzato in un file. –

+1

Non sono sicuro di seguire completamente la tua domanda, ma nell'esempio sopra, "tex/base.tex" è un file TeX nella directory templates che ha anche Django che modifica i tag/filtri all'interno di esso, che vengono sostituiti dalle variabili quando passa attraverso 'render_to_string()'. Se si desidera caricare solo un file vecchio (al di fuori delle directory dei template), si può fare: 't = Template (aperto ('/ percorso/a/tuo/file.tex'). Read()); os.write (texfile, t.render (Context ({'var': 'whatever'})) '. Se vuoi scrivere in un posto particolare, fai:' os.write (open ('/ percorso/a/nuovo /file.tex ',' w '). fileno(), t.render (...)) '. –

+0

Ok, per un po ho frainteso il tuo codice, ora va bene: D. Gestire un bug strano, atm, non so se è collegato –