如果 PHP(www-data)无法访问所需的包,我如何让 PHP 编译 LaTeX 文档


How can I get PHP to compile a LaTeX document if it (www-data) can't get access to the required packages?

我有一个PHP脚本,它使用以下命令编译LaTeX文档:

exec('cd /path/to/doc && /usr/bin/latexmk -pdf filename.tex');

这适用于我的一些 LaTeX 文档,但我的最新文档无法编译,查看日志显示:

!pdfTeX error: pdflatex (file ecrm1000): Font ecrm1000 at 600 not found
==> Fatal error occurred, no output PDF file produced!

我发现这是LaTeX无法看到所需的字体包的结果。当我在我的用户名下运行相同的编译命令时,文档会按预期编译。所以我的问题是,我怎样才能让PHP(作为www-data执行)来访问必要的LaTeX软件包?

我尝试使用以下命令在 www-data 帐户下安装所需的软件包:

sudo -u www-data sudo apt-get install texlive-fonts-recommended

但它要求提供 www-data 的密码,我不相信这是我设置的,也不是我扔给它的任何东西。

如果有任何帮助,我正在运行 Ubuntu 12.04。

sudo mktexpk --destdir /usr/share/texmf-texlive/fonts/pk/ljfour/jknappen/ec/ --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 ecrm1000

。使字体可供所有用户使用(与 MissingFont 中的字体相同.log但带有 --destdir 参数)。

我遇到了类似的问题,通过在调用pdflatex的 shell 脚本中将环境变量设置为/var/www来解决$HOME(或者我相信任何可写到www-data的文件夹在这里都可以)。请参阅有关 TeX.SX 的详细信息。

你的想法是对的,sudo,但要解决密码问题,有一个简单的解决方案。

www-data 必须位于 sudoers 列表中,在 etc/sudoers ,在此列表中,您可以定义如何控制超级命令。可以将 www-data 设置为不需要密码的 sudoer...但就安全性而言,这不是一个非常聪明的想法。因此,在 sudoers 列表中,您可以指定允许用户执行哪些命令。仅允许/usr/bin/latexmk命令将解决安全问题,并允许您的Web服务器在没有密码的情况下运行超级命令。

查看这个 Ubuntu 帮助页面:https://help.ubuntu.com/community/Sudoers - 最值得注意的是 NOPASSWD 部分。

您案例中的示例是:

# This lets "www-data" user run a command without a password
www-data mark-computer= NOPASSWD: /usr/bin/latexmk

以下是最终使编译工作的原因。

在我自己的主文件夹下有一个隐藏文件夹,LaTeX 用它来存储它需要~/.texmf-var的字体。这个文件夹包含fonts/pk/ljfour/jknappen/ec,里面有13个字体文件(其中一些是latexmk抱怨的)。

解决方案是让PHP将我想要编译的LaTeX文件(file.tex)生成到一个临时目录(我复制字体的地方),在那里它们将被编译,然后移动到我想存储输出PDF的位置。我将用一个例子来解释:

file_put_contents('~/website/latexFiles/temp/file.tex', $latex_data);
exec('/usr/bin/latexmk -pdf -cd ~/website/latexFiles/temp/file.tex');
exec('mv ~/website/latexFiles/temp/file.pdf ~/website/pdfs/desiredFilename.pdf');
exec('rm ~/website/latexFiles/temp/file.*');

因此,第一行在我要编译为 PDF 的目录中生成 latex 文件(其中 $latex_data 是包含我要创建的 LaTeX 文档的字符串)。

现在,使这一切正常工作的部分是在~/website/latexFiles/temp中创建一个名为 $HOME .然后复制(或者可能是链接,但我复制)~/.texmf-var ~/website/latexFiles/temp/$HOME.这是latexmk将查找所需字体的路径。使用-cd开关,以便在尝试编译 LaTeX 文件之前将 latexmk 移动到 ~/website/latexFiles/temp 中,然后它可以在其中对字体进行精细化。

第三行将.pdf文件复制到我最终想要输出文件的位置,最后一行从临时目录中删除具有相同文件名的所有剩余文件。我确保对.tex文件使用唯一的文件名,这样我就不会删除其他用户可能正在生成的文件。

希望其他人觉得这有用。