Я создаю PDF, из шаблона, используя JasperPHP.
Я тогда сразу пытаюсь это отобразить.
Как я могу убедиться, что он полностью создан перед отображением?
Я проверяю, что файл существует, но PDF поврежден, поэтому я предполагаю, что он все еще создается.
Я также пытался использовать flock, чтобы открыть его с эксклюзивной блокировкой, но, похоже, это работает, даже если PDF не полностью отрисован.
Это то, что я делаю (дд только для тестирования, он никогда не попадает сюда):
/**
* 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 и дважды щелкните.
JasperPHP имеет флаг $background = true
,
Если я установлю это в false, похоже, что он ожидает завершения компиляции, прежде чем продолжить.
Мик
Других решений пока нет …