【问题标题】:How can I programmatically generate PDFs using LaTeX?如何使用 LaTeX 以编程方式生成 PDF?
【发布时间】:2010-07-15 22:12:34
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: django text pdf-generation pdflatex


    【解决方案1】:

    我在之前从事的一个项目中解决了同样的问题,我没有通过管道输出,而是在一个临时文件夹中创建了临时文件,因为我担心处理 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 中的代码存储在一个文件中。
    • 我不确定我是否完全遵循您的问题,但在上面的示例中,“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。处理一个奇怪的 bug atm,不知道它是否相关。
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多