2

我有以下代码

function generate_pdf() {

        $fdf_data_strings = $this->get_hash_for_pdf();
        #$fdf_data_names   = array('49a' => "yes");
        $fdf_data_names = array();
        $fields_hidden    = array();
        $fields_readonly  = array();
        $hud_pdf = ABSPATH.'../pdf/HUD3.pdf';

        $fdf= forge_fdf( '',
                 $fdf_data_strings,
                 $fdf_data_names,
                 $fields_hidden,
                 $fields_readonly );

        /*  echo "<pre>";
            print_r($fdf);
            echo "</pre>";
            die('');
        */

        $fdf_fn= tempnam( '.', 'fdf' );
        $fp= fopen( $fdf_fn, 'w' );
        if( $fp ) {
          fwrite( $fp, $fdf );
            //$data=fread( $fp, $fdf );
         // echo $data;
          fclose( $fp );


          header( 'Content-type: application/pdf' );
          header( 'Content-disposition: attachment; filename=settlement.pdf' ); // prompt to save to disk

          passthru( 'pdftk HUD3.pdf fill_form '. $fdf_fn.' output - flatten');

          unlink( $fdf_fn ); // delete temp file

        }
        else { // error
          echo 'Error: unable to open temp file for writing fdf data: '. $fdf_fn;
        }
    }
}

有什么问题吗?

问题是,我已经安装了pdftk

跑步whereis pdftk给了我'/usr/local/bin/pdftk'

物理检查位置,pdftk在所述位置..

使用终端,如果我运行pdftk --version或任何其他命令,它运行

如果我使用 php 好像passthru('/usr/local/bin/pdftk --version')什么都没有显示

system("PATH=/usr/local/bin && pdftk --version");如果我像上面所说的那样使用 php'/usr/local/bin /pdftk :there is no directory of file '

当我运行这个函数脚本时,弹出文件下载提示,但是当我保存它时,没有保存,

我已经检查了这个文件夹的权限并更改了它0755, 0766, 0777, 0666我已经尝试了所有,没有任何工作

3天来,我一直在努力克服它,我也问过这个问题,但不知道我到底发生了什么。

在我用墙撞头之前有人可以帮我吗?

4

6 回答 6

6

Pasthru 函数不通过 shell 执行程序。

将确切的路径传递给 passthru 命令。

例如

passthru( '/usr/local/bin/pdftk HUD3.pdf fill_form '. $fdf_fn.' output - flatten');

或 passthru( '/usr/local/bin/pdftk' . $hud_pdf . 'fill_form '. $fdf_fn.' output - flatten');

如果这仍然不起作用,请使用 <?php passthru("/path/to/pdftk --help"); ?>where /path/to/pdftk is your path 返回的路径 which 或 where is 进行测试,以确保路径正确。

如果路径正确,则问题可能与您告诉 pdftk 使用的临时目录上的权限或 pdftk 二进制文件上关于 apache 用户的权限有关。

如果这些权限没问题,您可以验证 pdftk 从 php 启动但在运行您的命令时挂起,那么也许可以尝试此处列出的解决方法。

有关 passthru 的更多文档是可用的passthru PHP Manual

附带说明一下,putenv php 函数用于设置环境变量。

例如putenv('PATH='.getenv('PATH').':.');

所有 3 个 PHP 函数:exec()、system() 和 passthru() 都执行外部命令,但不同之处在于:

  • exec():返回命令的最后一行输出并且不刷新任何内容。
  • shell_exec():从命令返回整个输出并且不刷新任何内容。
  • system():返回命令的最后一行输出,并尝试在输出的每一行之后刷新输出缓冲区。
  • passthru():不返回任何内容并将结果输出传递给浏览器而不干扰浏览器,当输出为二进制格式时尤其有用。

另请参阅PHP exec vs-system vs passthru SO Question

这些函数的实现位于exec.c并使用 popen。

于 2012-03-26T23:52:54.610 回答
2

我遇到了同样的问题,经过大量实验后这是可行的:

function InvokePDFtk($pdf_tpl, $xfdf,$output){

        $params=" $pdf_tpl fill_form $xfdf output $output flatten 2>&1";

        $pdftk_path=exec('/usr/bin/which /usr/local/bin/pdftk');

        $have_pdftk= $pdftk_path=='/usr/local/bin/pdftk' ;

        $pdftk_path=$have_pdftk  ? $pdftk_path  : 'pdftk ';

        exec($pdftk_path.$params,$return_var);

        return  array('status'=> $have_pdftk,
                     'command' =>$pdftk_path.$params, 'output'=>$return_var);
    }

希望这可能会给您一些见解。(根据您的需要更改)

于 2012-03-30T13:05:09.583 回答
0

Completing Appleman answer, those 3 functions can be considered as dangerous, because they allow you execute program using php, thus an attacker that exploited one of your script if you are not careful enougth. So in many php configuration that want to be safe they are disabled.

So you should check for the disable_functions directive in you php.ini(and any php configuration file) and see if the function you use is disabled.

于 2012-03-29T17:45:54.850 回答
0

Play around around with safe mode and definitely check your web server log file, normally in:

/var/log/apache2/error.log
于 2012-04-02T20:43:46.983 回答
0

也许您应该将 fclose 排除在 if 语句之外,确保将其定向到正确的文件!:)

于 2012-04-02T07:56:20.453 回答
0

您的 Web 服务器是否已 chroot?尝试将可执行文件放入服务器可以查看的目录中。

于 2012-04-02T18:04:25.190 回答