【问题标题】:Check that PDF has been created before displaying?在显示之前检查是否已创建 PDF?
【发布时间】: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


【解决方案1】:

JasperPHP 有一个标志 $background = true

如果我将此设置为 false,它看起来会等待编译完成后再继续。

米克

【讨论】:

    猜你喜欢
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2020-09-05
    • 2020-07-29
    相关资源
    最近更新 更多