DOMPDF - 流PDF后重定向

时间:2015-04-06 18:56:18

标签: php forms redirect submit dompdf

我正在使用DOMPDF生成动态表。提交表单后,$ _POST变量将发送到 test.php

<?php
session_start();

$theTemplate = 'test.php';

function renderToPDF($templateFile)
{
  require_once("./dompdf/dompdf_config.inc.php");
  ob_start();
  include $templateFile;
  $contents = ob_get_clean(); 

  if ($contents !== false)
  {
    $dompdf = new DOMPDF();
    $dompdf->load_html($contents);
    $dompdf->render();
    $dompdf->stream("Custom_Data.pdf");

 }
}

renderToPDF($theTemplate);
?>

tabletest.php 有一个包含动态值的表,包括表单中的一些$ _POST和来自MYSQL表的一些变量。提交表单后,PDF会成功生成,但在下载PDF后有没有办法重定向到另一个页面?我没有找到类似问题的确凿答案(Create PDF with DOMPDF and RedirectHow to generate pdf file using dompdf and redirect to another page)......

2 个答案:

答案 0 :(得分:1)

简短回答:你不能。

当您致电$dompdf->stream()时,PDF的内容会立即发送到浏览器并且脚本执行结束。此时,您无法再将浏览器重定向到另一个页面。

您可能会尝试将用户首先发送到目标网页,然后将用户从那里重定向到PDF呈现。您可以使用HTML元标头或JavaScript来实现。如果您指定PDF应作为附件发送,则用户将在登录中间页面后收到下载对话框。

这是网站用于下载的技术,当他们显示一个页面时会显示“您的下载将以...开始”。

答案 1 :(得分:0)

发布以希望将来对某人有所帮助。

我解决这个问题的方法是在流事件之后设置一个cookie。就我而言,单击按钮后我将下载标签,下载完成后将删除事件监听器。

这是一个非常特殊的用例,在链接标记上使用target属性时,这里给出的答案是一个更简单的方法:https://stackoverflow.com/a/11315861/4484799不幸的是,我无法将其用于特定用途-案例。

我的解决方法是:

<?php

$dompdf->stream($filename);
// Set cookie after stream. From what I noticed the cookie doesn't
// get set until the stream is done 
setcookie('my_cookie', 'download complete', time() + 86400, "/");

?>

在Javascript中,我正在检查此cookie是否存在(using this tried and tested library for js cookie handling),如果存在,则刷新页面:

(jQuery)

    $( window ).load(function() {
        
        function checkLabelDownloadCookie(){
            const cookie =  Cookies.get('my_cookie');
            if( cookie  ){
                Cookies.remove('my_cookie'); //remove cookie
                location.reload(); //reload page
            }else{
                console.log("PDF download cookie not found yet");
            }
        }
        
        function monitorLabelDownloadCookie(){
          // check if the cookie exists every 500ms
            setInterval( checkLabelDownloadCookie, 500 );
        }

        monitorLabelDownloadCookie();

    });

这是我的解决方案,您当然可以在用例代码中添加更多条件