2017-05-03 81 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,它看起來像在繼續之前等待編譯完成。

米克

相關問題