Как я могу программно генерировать PDF-файлы, используя LaTeX? - PullRequest
5 голосов
/ 16 июля 2010

Я пытаюсь сгенерировать некоторый код LaTeX, который должен генерировать документы PDF. В настоящее время я использую систему шаблонов Django для динамического создания кода, но я не знаю, как двигаться дальше. Я понимаю, что могу сохранить код в файле .tex и использовать подпроцесс для запуска pdflatex для создания PDF. Но у меня было так много проблем с выходом из кода LaTeX в «простом» Python, что я решил использовать систему шаблонов Django. Есть ли способ, которым я мог бы каким-то образом направить вывод, созданный Django, в pdflatex? Созданный код работает нормально, просто я не знаю, что с ним делать.

Заранее спасибо

1 Ответ

5 голосов
/ 16 июля 2010

Я занимался той же проблемой в проекте, над которым я ранее работал, и вместо того, чтобы направить вывод, я создал временные файлы во временной папке, так как беспокоился о работе с промежуточными файлами, которые создает 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.

...