1

当用户单击“导出 PDF”按钮时,我正在尝试执行控制台命令。我正在使用 Phantom JS 生成 PDF 输出。

如果我在命令提示符下运行以下命令,一切正常:

phantomjs.exe generate_pdf.js http://hidden_link.com/view_printable_proposal/CPpktzdnbwDB test.pdf

因此,我在控制器中创建了一个函数,当您单击“导出 PDF”按钮时,它会转到该函数:

<a href="<?= base_url().'create_pdf/'.$hash ?>"><button type="button" class="btn" style="width: 100%;">Export as PDF</button></a>

我拥有的整个功能:

public function create_pdf($hash = false)
{

    $output = 'phantomjs.exe generate_pdf.js http://hidden_link.com/view_printable_proposal/CPpktzdnbwDB test.pdf';
    shell_exec($output);
}

如您所知,我以前从未尝试过以任何语言执行控制台命令。我什至接近吗?

谢谢!

PS:如果您不确定该控制台命令在做什么,可以让您深入了解该控制台命令 - 首先,phantomjs.exe 正在调用 .exe 应用程序,然后“generate_pdf”是与 .exe 应用程序位于同一目录中的 javascript 文件. 第三项是我要转换为 PDF 的内容的链接。最后的“test.pdf”就是导出 PDF 后的名称。同样,通过命令提示符到我尝试运行的命令一切正常。

顺便说一句,目前当我单击按钮时,我只是转到一个白页,没有任何反应。

4

4 回答 4

0

昨天得到这个工作,这是答案:

public function create_pdf($hash = false)
{
    $this->load->helper('download');

    $output ="";
    $return_val = 0;
    //echo APPPATH;

    $path_to_js = APPPATH.'/libraries/generate_pdf.js';

    $base_url = $this->config->item("base_url");

    $tmp_location = $this->config->item("tmp_location");

    $output_path = $tmp_location."/".$hash.'.pdf';

    $command = $this->config->item('phantomjs_path').' '.$path_to_js.' '.$base_url.'view_printable_proposal/'.$hash.' '.$output_path;
//  $command = '/usr/bin/ls /';

    exec($command, $output, $return_val);

    if($return_val) {
        echo "Error";
        echo $return_val;
        echo json_encode($output);
    }
    else {
            $data = file_get_contents($output_path);
            force_download($hash.".pdf", $data);
            unlink($output_path);
    }
}
于 2013-05-16T13:35:37.163 回答
0

这可能是一个解决方案: http: //php.net/manual/en/book.pdf.php 不要使用一些外部应用程序,而是使用 PECL 扩展。如果您的主机没有安装扩展,这可能是个问题。但是话又说回来,您正在尝试执行一些 shell 命令,因此您可能对网络服务器具有必要的控制权。

于 2013-05-15T10:24:49.330 回答
0

Phantomjs 不能通过非 root 用户(如服务器用户 www-data)直接访问,因为它给出了 Permission denied 错误。为了通过 php 文件运行它,您需要做一个解决方法。完整的解决方案在这里http://cisight.com/run-latest-phantomjs-with-shell_exec-php-on-ubuntu-11-10-oneiric/

于 2013-05-15T09:53:00.260 回答
0

我不确定这是否涉及远程,但如果您可以验证您正在执行您的函数,并且 shell_exec 正在尝试执行,您可能需要验证 phantomjs.exe 是否可从您的 Web 服务器的用户的 PATH 中获得。查看这是否是一个问题的最简单方法可能是只使用可执行文件的完整路径。

于 2013-05-10T21:21:42.310 回答