我正在使用JasperPHP从模板创建PDF。在显示之前检查是否已经创建了PDF?
然后我立即尝试显示它。
如何在显示之前确保它完全创建?
我正在检查文件是否存在,但PDF已损坏,因此我假设它仍在创建中。
我也尝试过使用flock来打开它的排他锁,但这似乎工作,即使PDF未完全呈现。
这是我在做什么(dd的是只是为了测试,它从来没有在这里得到):
/**
* Check that we can lock a file
* this ensures that it has been completely created.
*
* @param $filename
* @return bool
*/
function stillWriting($filename)
{
$stillWriting = true;
if($fp = fopen($filename, "r+"))
{
if (flock($fp, LOCK_EX)) // Try to get an exclusive lock on the file
{
flock($fp, LOCK_UN); // Unlock - we're just checking
$stillWriting = false;
}else{
dd('failed');
}
fclose($fp);
}
return $stillWriting;
}
米克
编辑 - 添加了更多的细节
这是PDF被创建:
exec($this->the_command, $output, $return_var);
我是usi NG https://github.com/cossou/JasperPHP
它执行JasperStart [https://sourceforge.net/projects/
这是显示的PDF:
return Response::make(file_get_contents($this->outputFilename .'.pdf'), 200, [ 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'inline; filename="' . $this->outputFilename .'.pdf' .'"' ]);
,我得到实际的问题是,Chrome的说“无法加载PDF文档“,我从中猜测,这是一个计时问题。该文件正确打开如果我然后转到Windows并双击。
如何显示PDF?在浏览器中呈现?由鸽子鸽打印和交付?通过双击进入PDF阅读器,使用Windows资源管理器加载网络驱动器? PDF是否可以在请求发出后24小时内通过浏览器下载?每个请求是否重新生成或缓存PDF?请更新您的问题与更多细节。 –
问题的原因在于,如果PDF在JasperReports生成后立即被加载到Web浏览器 中,则无需先将其保存到本地文件中。将其直接流到浏览器(并编写单元测试以查找报告可能为空的所有条件,然后修复这些测试)。 –
这是令人困惑的,你是不是在异步创建pdf?这怎么会发生?为什么不在创建PDF之前检查数据以确定其是否为空? PDF必须写入本地文件(或远程)文件。 – Kisaragi