Могу ли я запустить pdflatex для файла в памяти?

Я должен создать серию файлов PDF, содержимое которых должно быть создано в Python (2.7). Обычное решение состоит в том, чтобы сохранить содержимое .tex в каком-либо каталоге, вызвать pdflatex для файла, затем прочитать в pdf-файле, чтобы, наконец, поместить файл в нужное место. Это показано ниже:

import os

texFile = \
"""\\documentclass[11pt,a4paper,final]{article}
\\begin{document}
Hello, world!
\\end{document}
""" # Clearly will a more awesome file be generated here!

with open('hello.tex', 'w') as f:
    f.write(texFile)
os.system('pdflatex hello.tex')
pdfFile = open('hello.pdf', 'rb').read()
# Now place the file somewhere relevant ...

Мне нужны те же процедуры, но в памяти, для увеличения скорости и предотвращения утечки файлов в какую-либо папку. Итак, мой вопрос: как запустить pdflatex в памяти и извлечь полученный pdf обратно в Python?


person Mr. Jaeger    schedule 12.09.2016    source источник


Ответы (1)


Взгляните на tex. Он предоставляет API в памяти для инструментов командной строки TeX. Например:

>>> from tex import latex2pdf
>>> document = ur"""
... \documentclass{article}
... \begin{document}
... Hello, World!
... \end{document}
... """
>>> pdf = latex2pdf(document)

>>> type(pdf)
<type 'str'>
>>> print "PDF size: %.1f KB" % (len(pdf) / 1024.0)
PDF size: 5.6 KB
>>> pdf[:5]
'%PDF-'
>>> pdf[-6:]
'%%EOF\n'

Вы можете установить его, просто запустив pip install tex. Также обратите внимание, что для строковых блоков вы можете просто добавить r, чтобы сделать строку необработанной. Таким образом, вам не нужно избегать всех обратных косых черт.

person dmuhs    schedule 12.09.2016
comment
Спасибо за ответ. Я пробовал, но получил следующее сообщение об ошибке: ValueError: close_fds не поддерживается на платформах Windows, если вы перенаправляете stdin/stdout/stderr. Я использую Windows 7. Мне пока не удалось найти решение, и я не смог успешно установить его преемника texcaller, что, я думаю, связано с тем, что он не был упакован для Windows. Но я еще не уверен. - person Mr. Jaeger; 13.09.2016
comment
Это больше похоже на проблему совместимости с Windows. Я использую Linux, поэтому я не могу воспроизвести проблему. Быстрый поиск показывает, как это исправили другие проекты: gevent, py4j, ipython. Также убедитесь, что вы используете самую последнюю версию пакета из PyPI. ValueError указывает на то, что произошла ошибка с перенаправлениями, поэтому каналы в системах UNIX. Вы используете Cygwin? - person dmuhs; 13.09.2016
comment
Имейте в виду, что texcaller по-прежнему вызывает pdflatex под капотом, записывая файлы на диск, так что технически это не в памяти. Запуск pdflatex через subprocess.run во временном каталоге имеет такое же (или даже лучшее) время выполнения и позволяет избежать всей путаницы при компиляции. - person hoefling; 27.03.2019