我的问题
我在 Linux Ubuntu 14.04 LTS 上使用 cairosvg,带有 PHP 和 apache。我正在使用 php 函数 system()
运行它。这是我正在运行的命令。
cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg
当我在终端中运行它时,我得到了预期的结果,它按预期生成 pdf 文件。但是当我使用 system()
在 php 中运行它时,它仍然生成 pdf 文件,但没有使用正确的字体。
我尝试过什么
字体已安装。文件夹和字体的文件权限均已设置为 777。Apache已被设置为字体文件夹和字体的共同所有者。文件路径是绝对路径。 echo
system()
不会出错。我也尝试使用等效的替代方案来替代system()
。
第一次重大更新:我尝试运行此 ImageMagick 命令来检查可用字体的差异。 convert -list font
在终端上,我看到已安装的字体,但在system()
通话中看不到。
第二次更新 我在终端和system()
中都运行了printenv
命令,并看到它们具有不同的值。我使用 proc_open()
设置了 HOME 和 USER 环境变量,但我得到的结果相同。代码如下。
$command = "cairosvg -f pdf -o /var/www/dev/output.pdf /var/www/dev/input.svg";
$descriptorspec = array();
$pipes = array();
$env = array(
'HOME' => '/home/ntwdev',
'USER' => 'ntwdev',
);
$resource = proc_open(
$command,
$descriptorspec,
$pipes,
$cwd = null,
$env
);
为什么字体仅在我在终端中运行命令而不是在system()
中运行时才会通过
您可以尝试在创建PDF命令之前执行一些命令来重新构建字体缓存吗?
我能想到:
$ xset fb rehash
从手册页:
rehash 参数将字体路径重置为其当前值,导致服务器重新读取 当前字体路径中的字体数据库。 这通常仅在向 字体目录(运行 mkfontdir 重新创建字体数据库后)。
如果您在特殊目录中有字体,您可以:
$ xset +fp /usr/share/fonts/misc
问题是cairosvg和/或www-data
的apache用户只能在/usr/share/fonts
文件夹中访问字体,无论文件或用户权限如何。