【问题标题】:Prevent browser caching of PDF generated with Dompdf防止浏览器缓存使用 Dompdf 生成的 PDF
【发布时间】:2023-01-04 23:25:29
【问题描述】:

我正在使用 DomPDF 生成 PDF 文档。代码看起来像这样:

// reference the Dompdf namespace
use Dompdf\Dompdf;

// instantiate and use the dompdf class
$dompdf = new Dompdf();
$dompdf->loadHtml('This is my HTML');

// Render the HTML as PDF
$dompdf->render();

// Output the generated PDF to Browser
$dompdf->stream('My_file.pdf', ['Attachment' => false]);

换句话说,完全标准。我遇到的问题是,当我将 PDF 内容“流”到客户端时,它带有 HTTP 标头:

Cache-Control: private

这意味着该文档可能会被浏览器缓存。当我更改文档并使用相同的链接再次打开它时,这一点很明显。我会看到旧版本。按 F5(在 Windows 上)可以解决这个问题,但我想将标题更改为:

Cache-Control: no-cache, no-store, must-revalidate

如果我像这样在 PHP 中设置标头:

header('Cache-Control: no-cache, no-store, must-revalidate');

在流式传输 PDF 之前,它会被覆盖,一旦流式传输完成,我显然无法更改它。

我找不到办法做到这一点。

有人知道如何更改 DomPDF 使用的 HTTP 标头吗?

【问题讨论】:

标签: php http-headers dompdf


【解决方案1】:

似乎无法更改在 src/Adapter/CPDF.php 在线 914 中设置的标头

header("Cache-Control: private");

也许可以扩展类并修改 stream 函数。

【讨论】:

  • 这也是我的想法。但是,我不喜欢扩展我不拥有的类,这也不会真正改变问题。现在我向 URL 添加了一个足够随机的额外参数,因此浏览器会将 URL 视为唯一的东西。这行得通,但奇怪的是 DomPDF 坚持使用缓存文档。
【解决方案2】:

您可以手动流式传输 PDF,而不是依赖内置的流式传输方法。借用 Dompdf 的内部逻辑:

$dompdf = new Dompdf();
$dompdf->loadHtml('...');
$dompdf->render();
$pdf = $dompdf->output();
if (headers_sent()) {
    die("Unable to stream pdf: headers already sent");
}
header("Cache-Control: private");
header("Content-Type: application/pdf");
header("Content-Length: " . mb_strlen($pdf, "8bit"));
header(Helpers::buildContentDispositionHeader("inline", "output.pdf"));
echo $tmp;
flush();

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2022-01-03
    • 2013-02-17
    相关资源
    最近更新 更多