2017-05-03 136 views
-1

我正在使用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并双击。

+0

如何显示PDF?在浏览器中呈现?由鸽子鸽打印和交付?通过双击进入PDF阅读器,使用Windows资源管理器加载网络驱动器? PDF是否可以在请求发出后24小时内通过浏览器下载?每个请求是否重新生成或缓存PDF?请更新您的问题与更多细节。 –

+0

问题的原因在于,如果PDF在JasperReports生成后立即被加载到Web浏览器 中,则无需先将其保存到本地文件中。将其直接流到浏览器(并编写单元测试以查找报告可能为空的所有条件,然后修复这些测试)。 –

+0

这是令人困惑的,你是不是在异步创建pdf?这怎么会发生?为什么不在创建PDF之前检查数据以确定其是否为空? PDF必须写入本地文件(或远程)文件。 – Kisaragi

回答

0

JasperPHP有一个标记$background = true

如果我将它设置为false,它看起来像在继续之前等待编译完成。

米克

相关问题