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

时间:2012-06-28 08:24:33

标签: php ubuntu latex pdflatex

我有一个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。

4 个答案:

答案 0 :(得分:2)

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参数)。

答案 1 :(得分:0)

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

www-data必须位于etc/sudoers的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

答案 2 :(得分:0)

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

在我自己的主文件夹下是一个隐藏文件夹,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文件复制到我最终想要输出文件的位置,最后一行从temp目录中删除具有相同文件名的所有剩余文件。我确保为.tex文件使用唯一的文件名,因此我不会删除其他用户可能生成的文件。

希望其他人觉得这很有用。

答案 3 :(得分:0)

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