Как я могу программно создавать PDF-файлы с помощью LaTeX?

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

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


person Uku Loskit    schedule 15.07.2010    source источник


Ответы (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.

person Aram Dulyan    schedule 16.07.2010
comment
Благодарю вас! Но у меня все еще есть проблема. Можно ли как-то использовать механизм шаблонов в существующем файле? Итак, чтобы он правильно менял переменные? И я мог бы написать в правильный файл tex. Atm У меня есть код в системе шаблонов sytanx, хранящийся в файле. - person Uku Loskit; 16.07.2010
comment
Я не уверен, что полностью следую вашему вопросу, но в приведенном выше примере 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(...)). - person Aram Dulyan; 16.07.2010
comment
Хорошо, на секунду я неправильно понял ваш код, теперь все в порядке: D. Имею дело со странной ошибкой банкомата, не знаю, связано ли это. - person Uku Loskit; 16.07.2010