【发布时间】:2017-05-03 15:55:29
【问题描述】:
我正在使用 JasperPHP 从模板创建 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);
我正在使用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 是如何显示的?在浏览器中渲染?由信鸽打印和交付?使用 Windows 资源管理器通过网络驱动器通过双击 PDF 阅读器加载?在提出请求后的 24 小时内,是否可以通过浏览器下载 PDF?是否根据请求重新生成或缓存 PDF?请更新您的问题并提供更多详细信息。
-
出现问题的原因是,如果在 JasperReports 生成 PDF 后立即将其加载到 Web 浏览器中,则无需先将其保存到本地文件。将其直接流式传输到浏览器(并编写单元测试以查找报告可能为空的所有条件,然后修复这些测试)。
-
这很混乱,你是在异步创建 pdf 吗?这怎么可能发生?为什么不在创建 pdf 之前检查数据以确定其是否为空? pdf 必须写入本地文件(或远程)文件。
标签: php laravel jasper-reports export-to-pdf