Django 如何使用LaTeX以编程方式生成PDF?

Django 如何使用LaTeX以编程方式生成PDF?,django,text,pdf-generation,pdflatex,Django,Text,Pdf Generation,Pdflatex,我正在尝试生成一些LaTeX代码,从中可以生成PDF文档。 目前,我正在使用Django模板系统动态创建代码,但我不知道如何从这里开始。我知道我可以将代码保存在.tex文件中,并使用子流程运行pdflatex来生成PDF。但是我在用“普通”Python逃离LaTeX代码时遇到了很多麻烦,所以我决定使用Django模板系统。有没有一种方法可以让我将Django生成的输出通过管道传输到pdflatex?生成的代码工作正常,只是我不知道如何处理它 提前感谢我在之前参与的一个项目中解决了相同的问题,我没

我正在尝试生成一些LaTeX代码,从中可以生成PDF文档。 目前,我正在使用Django模板系统动态创建代码,但我不知道如何从这里开始。我知道我可以将代码保存在.tex文件中,并使用子流程运行pdflatex来生成PDF。但是我在用“普通”Python逃离LaTeX代码时遇到了很多麻烦,所以我决定使用Django模板系统。有没有一种方法可以让我将Django生成的输出通过管道传输到pdflatex?生成的代码工作正常,只是我不知道如何处理它


提前感谢

我在之前参与的一个项目中解决了相同的问题,我没有管道化输出,而是在临时文件夹中创建了临时文件,因为我担心处理中间文件。这是我使用的代码(请注意,这是几年前的事了,从我还是Python/Django新手的时候开始;我相信如果我今天写这篇文章,我可以想出更好的东西,但这对我来说确实有效):


dest_folder
变量通常设置为媒体目录中的某个位置,以便可以静态地提供PDF。返回的值是磁盘上文件的路径。其URL的逻辑由设置
dest\u文件夹的任何函数处理

谢谢!但我仍然有一个问题。是否可以在现有文件上使用模板引擎?那么,它会正确地改变变量吗?我可以写一个合适的tex文件。Atm我将模板系统sytanx中的代码存储在一个文件中。我不确定我是否完全理解您的问题,但在上面的示例中,“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(…)
。好吧,有那么一会儿我误解了你的代码,现在没事了:D.处理一个奇怪的错误,不知道它是否相关。
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')