我有以下代码
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 runing whereis pdftk
给了我'/usr/local/bin/pdftk'
实际检查了位置,pdftk在所述位置..
使用终端,如果我运行pdftk --version
或任何其他命令,则运行
如果我使用像passthru('/usr/local/bin/pdftk --version')
这样的PHP,则不会显示任何内容
如果我使用像system("PATH=/usr/local/bin && pdftk --version");
这样的PHP,它会说'/usr/local/bin /pdftk :there is no directory of file '
当我运行此函数脚本时,提示文件下载弹出,但是当我保存它时,nothng被保存,
我已经检查了此文件夹的权限并更改了它0755, 0766, 0777, 0666
我已经尝试了所有,但没有工作
连续3天,我正在努力克服它,我也对此提出了问题,但无法弄清楚到底是怎么回事。
在我撞墙之前,有人可以帮助我吗?
答案 0 :(得分:6)
pasthru函数不会通过shell执行程序。
将准确的路径传递给passthru命令。
E.g。
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"); ?>
其中/ path / to / pdftk是您返回路径的路径,以确保路径正确。
如果路径正确,那么问题可能与您告诉pdftk使用的临时目录上的权限或者与apache用户有关的pdftk二进制文件的权限有关。
如果这些权限没有问题,你可以验证pdftk是从php启动但是从运行命令中解脱,然后可以尝试列出here列出的解决方法。
关于passthru的进一步文档是可用的passthru PHP Manual。
作为旁注,putenv php函数用于设置环境变量。
E.g。 putenv('PATH='.getenv('PATH').':.');
所有3个PHP函数:exec(),system()和passthru()执行外部命令,但区别在于:
另见PHP exec vs-system vs passthru SO Question。
这些功能的实现位于exec.c并使用popen。
答案 1 :(得分: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);
}
希望这可能会给你一些见解。 (根据您的需要改变)
答案 2 :(得分:0)
完成Appleman的回答,这3个函数可以被认为是危险的,因为它们允许你使用php执行程序,因此如果你不小心使用,攻击者利用你的一个脚本。因此,在许多想要安全的php配置中,它们被禁用。
因此,您应该检查php.ini中的disable_functions
指令(以及任何php配置文件),看看您使用的功能是否被禁用。
答案 3 :(得分:0)
也许你应该将fclose保留在if语句之外,确保你将它指向正确的文件! :)
答案 4 :(得分:0)
您的网络服务器是否被chrooted?尝试将可执行文件放入服务器可以查看的目录中。
答案 5 :(得分:0)
使用安全模式四处游走并明确检查您的Web服务器日志文件,通常在:
/var/log/apache2/error.log