6

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

4 回答 4

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

于 2012-07-16T13:00:48.243 回答
1

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

于 2016-01-25T03:05:06.777 回答
0

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

在我自己的主文件夹下是一个隐藏文件夹,LaTeX 用它来存储它需要的字体~/.texmf-var。这个文件夹包含fonts/pk/ljfour/jknappen/ec13 个字体文件(其中一些是 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_data 是一个包含我要创建的 LaTeX 文档的字符串)。

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

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

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

于 2012-06-29T23:45:20.400 回答
0

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

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

查看 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
于 2012-06-28T08:36:55.890 回答