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
.
fonte
2010-07-16 00:28:08
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. –
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 (...)) '. –
Ok, per un po ho frainteso il tuo codice, ora va bene: D. Gestire un bug strano, atm, non so se è collegato –