Как я могу программно генерировать PDFs, использующий ЛАТЕКС?

Я пытаюсь сгенерировать некоторый ЛАТЕКСНЫЙ код, который от вслед за тем должен генерировать документы в формате PDF. В настоящее время я использую Django, обрабатывающего систему по шаблону для того, чтобы динамично создать код, но я понятия не имею о как, как идти дальше отсюда. Я понимаю, что мог сохранить код в .tex файле, и использовать подпроцесс для выполнения pdflatex для генерации PDF. Но я испытал такие затруднения при выходе из ЛАТЕКСНОГО кода в "плоскости" Python, что я решил использовать Django, обрабатывающего систему по шаблону. Существует ли способ, которым я мог так или иначе, возможно, передать по каналу вывод, произведенный Django для pdflatex? Произведенный код работает правильно, это просто, что я не знаю, что сделать с ним.

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

5
задан Uku Loskit 15 July 2010 в 22:12
поделиться

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.

5
ответ дан 14 December 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: