用PHP检查PDF编号页(Linux中)


Check PDF number pages with PHP (in Linux)

我有一个网页,我让用户上传文件到帐户文件夹。确切地说,只有PDF和JPG文件。我想计算每个上传的PDF文件的页数,以便向用户显示。

为此,我使用了XPDF项目的一部分PDFINFO linux库。这是二进制文件的手册页:http://linuxcommand.org/man_pages/pdfinfo1.html

您可以在这里下载带有二进制文件的.zip文件:http://www.foolabs.com/xpdf/download.html

我的代码(这工作完美,但昨天它失败了):

function getNumPagesInPDF($document){
    if(!file_exists($document))return null;
    $cmd = "pdfinfo";
    // Open the document
    exec($cmd." '".$document."'", $output);
    // Browse the data
    $pagecount = 0;
    foreach($output as $op){
        // Extrac number of pages
        if(preg_match("/Pages:'s*('d+)/i", $op, $matches) === 1){
            $pagecount = intval($matches[1]);
            break;
        }
    }
    return $pagecount;
}

我可以在SSH中运行该命令,并且它在服务器中工作。现在,这段代码不能在PHP中工作,但是没有改变代码。

啊!一点补充:我检查了exec工作在我的PHP使用:

 function exec_enabled() {
   $disabled = explode(',', ini_get('disable_functions'));
   return !in_array('exec', $disabled);
 }
 if (exec_enabled()){
    echo "exec funciona";
 }

另一个补充:PHP没有显示任何与此相关的错误,我已经将错误日志记录启用到日志文件(包括警告)。我的主机最近激活了mod_security.

TASK1:尝试$document变量:路径是ok的,相对于php代码文件放置的地方。路径存在,文件也存在

TASK2:检查$output变量是否有任何内容:NO, $output数组为空!为什么?无法理解。

TASK3: Check the $cmd."’"。美元文档。"'": ok,复制"result"到SSH works。我迷路了。

根据评论讨论,我们已经看到使用裸文件名运行二进制文件并不总是有效的。在控制台上和在系统命令(如exec())中都是如此。

当您在任何一个环境中运行pdfinfo时,系统将搜索环境变量PATH以发现在哪个目录中可以找到它。这个变量在您的用户帐户和Apache环境之间几乎总是不同的,这就是为什么在以编程方式运行二进制文件时,总是指定完全限定的文件名是很重要的。

据我所知,exec()不把当前PHP脚本所在的文件夹作为当前工作目录。即使这样,当前目录.也需要在Apache用户的PATH中才能找到它。因此,我不确定为什么这曾经适用于你,但它强调了上述教训的重要性:始终使用完整路径。

您还应该从设置文件中读取路径,而不是在代码中硬连接它。这将有助于你从本地、测试、暂存和实时应用环境中迁移,这些环境可能会将二进制文件存储在不同的位置。