2010-07-15 243 views
5

我想要生成一些LaTeX代码,从那里应该生成PDF文档。 目前,我使用Django模板系统来动态创建代码,但我不知道如何从这里继续。我知道我可以将代码保存在.tex文件中,并使用子进程运行pdflatex来生成PDF。但是我在使用“普通”Python时逃避了LaTeX代码的麻烦,所以我决定使用Django模板系统。有没有一种方法可以将Django生成的输出传递给pdflatex?生成的代码工作正常,只是我不知道如何处理它。如何以编程方式使用LaTeX生成PDF?

在此先感谢

回答

5

我解决同样的问题在一个项目中,我曾经工作且,而不是管道输出,我在一个临时文件夹中创建的临时文件,因为我很担心处理中间上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的任何函数来处理。

+0

谢谢!但我仍然有一个问题。它会以某种方式在现有文件上使用模板引擎吗?那么,它会正确地改变变量?我可以写一个适当的tex文件。 Atm我有存储在文件中的模板系统sytanx中的代码。 – 2010-07-16 15:12:04

+1

我不确定我是否完全遵循了你的问题,但在上面的例子中,“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

+0

好吧,我错误地理解了你的代码,现在没关系:D。处理一个奇怪的bug atm,不知道它是否相关。 – 2010-07-16 15:59:12