我有以下代码
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
它有什么问题吗?
问题是,我已经安装了pdftk
跑步whereis pdftk
给了我'/usr/local/bin/pdftk'
实际检查了位置,pdftk在那个位置..
使用终端,如果我运行pdftk --version
或任何其他命令,它运行
如果我使用PHP就像passthru('/usr/local/bin/pdftk --version')
没有显示
如果我使用PHP就像system("PATH=/usr/local/bin && pdftk --version");
它说的那样'/usr/local/bin /pdftk :there is no directory of file '
当我运行这个函数脚本时,提示文件下载弹出,但是当我保存它时,nothng被保存,
我已经检查了这个文件夹的权限并更改了0755, 0766, 0777, 0666
我已经尝试了所有,nothng的工作
3天,我正在努力克服它,我也问过这个问题,但无法弄清楚到底是怎么回事.
在我撞墙之前,有人可以帮助我吗?
pasthru函数不通过shell执行程序.
将准确的路径传递给passthru命令.
例如
passthru( '/usr/local/bin/pdftk HUD3.pdf fill_form '. $fdf_fn.' output - flatten');
Run Code Online (Sandbox Code Playgroud)
或者passthru('/ usr/local/bin/pdftk'.$ hud_pdf.'fill_form'.$ fdf_fn.'output - flatten');
如果这仍然不起作用测试使用
<?php passthru("/path/to/pdftk --help"); ?>
where/path/to/pdftk是您返回的路径由哪个或哪个位置,以确保路径正确.
如果路径正确,那么问题可能与您告诉pdftk使用的临时目录上的权限或者关于apache用户的pdftk二进制文件的权限有关.
如果这些权限很好,你可以验证pdftk是从php启动但是从运行命令挂起,然后可能会尝试这里列出的解决方法.
关于passthru的进一步文档是可用的passthru PHP手册.
作为旁注,putenv php函数用于设置环境变量.
例如 putenv('PATH='.getenv('PATH').':.');
所有3个PHP函数:exec(),system()和passthru()执行外部命令,但不同之处是:
另请参阅PHP exec vs-system vs passthru SO Question.
这些函数的实现位于exec.c并使用popen.