错误:无法';t打开PDF文件';mjvqkfgfepbi.TMP';用于写入(拒绝许可)


Error: Couldn't open PDF file 'MJVQKFFGFEPBI.TMP' for writing (permission denied)

我使用pdflibPHP中动态创建pdf文档,但由于某种原因,我收到的错误消息是这个

Error: Couldn't open PDF file 'MJVQKFFGFEPBI.TMP' for writing (permission denied)

触发线路的错误是这个

if (!pdf_begin_document($this->p, $this->output_file, ($linearize ? 'linearize' : ''))) die('Error: ' . pdf_get_errmsg($this->p));

我的问题是,如何才能获得被拒绝权限的目录的位置,或者这个错误是由任何其他原因引发的?

相同的代码在我的服务器ubuntu 12.04中有效,但在12.10 中无效

我刚刚从PDFlib的Rainer Plöckl获得信息,当您使用linearizeoptimize时,您需要为begin_document指定inmemory和/或tempdirname-选项。默认情况下,pdflib会尝试在当前目录中打开一个临时文件,Web服务器用户可能无权在该目录中创建新文件。

我对optimize也有同样的问题,并通过使用以下代码规避了这个问题:

pdf_begin_document($this->p, '', 'optimize=true tempdirname=' . sys_get_temp_dir());

之后一切都很好。

您可以在上找到文档的相关部分http://www.pdflib.com/fileadmin/pdflib/pdf/manuals/PDFlib-9.0.4-API-reference.pdf#page=48

sys_get_temp_dir()告诉您临时文件的目录名称。您可以使用它来创建一个临时文件:

$filename = tempnam(sys_get_temp_dir());

然后将$filename传递给pdf_begin_document作为第二参数。

我也面临同样的问题。虽然我使用的是windows,但权限没有这样的问题。这就是我解决问题的方法。

下面是我在阅读PDFlib项目中的日志时遇到的问题的一个例子。我没有使用绝对路径。

    $p->set_option("errorpolicy=exception");
    $p->set_option("SearchPath={{" . $searchpath . "}}");
    $p->set_option("logging={filename=logs/debug.log remove}");

然后我添加了日志目录的路径,这就解决了这个问题。

$defaultPath =  dirname(__FILE__);
$p->set_option("logging={filename={$defaultPath}/logs/debug.log remove}");