设置 pdf 服务,基于 TeX 的服务器。

设置 pdf 服务,基于 TeX 的服务器。

我希望构建一个能够实现以下目标的解决方案:

  1. 客户端从服务器发送文件规范
  2. TeX 文件是根据这些规范从“TeX 片段池”组装而成的
  3. 组装好的 TeX 文件被编译为 pdf
  4. PDF 已提供给客户端

需要注意的是,客户端不允许在 TeX 级别编辑文件。就用户体验而言,用户只需下载 pdf 即可。

但是,由于我希望为由上述“TeX 片段池”的不同选择组成的文件“系列”提供服务,因此无法预编译 pdf。

有哪些可用的解决方案可以实现这一目标?

那这个呢?有人试过部署它吗?https://manuels.github.io/texlive.js/

答案1

思考我知道你在问什么

这将是 stack overflow 风格的答案,但你可以设置一个调用 pdflatex 的服务器。有许多服务器提供商,例如https://www.digitalocean.com/亚马逊网络服务。您需要设置一个 Linux 服务器并按照以下指南操作如何在 Ubuntu 上安装 LaTeX。然后,您可以编写一个小脚本,例如使用 Python、PHP、Ruby 或任何您想要的服务器语言。

为了让您了解如何在 python 中实现这一点,脚本可以是这样的(注意!未经测试。主要是针对 Slack-bot 的修改脚本)。

    from string import Template
    import os
    import subprocess
    import tempfile
    from fpdf import FPDF

    from flask import Flask, Response, request
    import requests as py3reqs
    app = Flask(__name__)
    @app.route("/toTex/<theTex>", methods=['GET'])
    def render_latex(theTex):
        with tempfile.TemporaryDirectory() as work_dir:
            try:
                str2pdf(theTex, work_dir)
                return send_from_directory(directory=work_dir,
                               filename="out.pdf",
                               mimetype='application/pdf')
            except Exception as e:
                print(e)
                return "Invalid LaTeX?\n{}".format(request.form['text'])


    def str2pdf(input_string, work_dir):
        with open('template.tex','r') as f:
            s = Template(f.read())
        out_txt = s.substitute(my_text=input_string)

        with open(os.path.join(work_dir, 'out.tex'),'w') as f:
            f.write(out_txt)
            subprocess.check_call(['pdflatex', '-pdf', '-halt-on-error', 'out.tex'], cwd=work_dir, stdout=None, stderr=None)

    if __name__=="__main__":
        port=80
        app.run("0.0.0.0", port=int(port))

现在您可以连接到服务器并下载 TeX 文件。由于最终用户不应该更改 TeX,因此显然必须进行更改。

相关内容