在显示之前检查PDF是否已创建?

时间:2017-05-03 15:55:29

标签: php laravel jasper-reports export-to-pdf

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

1 个答案:

答案 0 :(得分:0)

JasperPHP有一个标记$background = true

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

米克