我解决同样的问题在一个项目中,我曾经工作且,而不是管道输出,我在一个临时文件夹中创建的临时文件,因为我很担心处理中间上LaTeX生成的文件。这是我使用的代码(请注意,从我刚刚成为Python/Django时起,这已经过了几年了;如果我今天编写这个代码,我相信我能想出更好的东西,但这对我来说确实有效):
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')
的dest_folder
变量通常被设置在媒体目录里,这样PDF随后可以静态地提供。返回的值是磁盘上文件的路径。它的URL的逻辑将由dest_folder
的任何函数来处理。
谢谢!但我仍然有一个问题。它会以某种方式在现有文件上使用模板引擎吗?那么,它会正确地改变变量?我可以写一个适当的tex文件。 Atm我有存储在文件中的模板系统sytanx中的代码。 – 2010-07-16 15:12:04
我不确定我是否完全遵循了你的问题,但在上面的例子中,“tex/base.tex”是模板目录中的一个TeX文件,其中也包含Django模板标签/过滤器,当它通过'render_to_string()'时。如果你想加载任何旧文件(来自模板目录之外),你可以这样做:'t = Template(open('/ path/to/your/file.tex')。read()); os.write(texfile,t.render(Context({'var':'whatever'}))'如果你想写入特定的地方,请执行:'os.write(open('/ path/to/new/file.tex','w')。fileno(),t.render(...))'。 – 2010-07-16 15:34:44
好吧,我错误地理解了你的代码,现在没关系:D。处理一个奇怪的bug atm,不知道它是否相关。 – 2010-07-16 15:59:12