我使用pdflib
在PHP
中动态创建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获得信息,当您使用linearize
或optimize
时,您需要为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}");