dompdf:模板和 $_SESSION 变量

Posted

技术标签:

【中文标题】dompdf:模板和 $_SESSION 变量【英文标题】:dompdf: templates & $_SESSION variables 【发布时间】:2011-10-27 17:59:04 【问题描述】:

我想知道这个设置是否可行。我必须从我通过表单推送到 $_SESSION 的一堆变量中生成一批 PDF(duh ...)。想法是将模板文件传递给 dompdf 引擎,然后将模板从 $_SESSION 填充到 PDF。在我看来,当 $template 被加载时,它应该这样做,是吗?

这是基本代码:

<?php
function renderToPDF($theTemplate = "template.php") // this is just to show the value

  require_once("dompdf/dompdf_config.inc.php");

  $content = file_get_contents($theTemplate); 

  if ($content !== false)
  
    $dompdf = new DOMPDF();
    $dompdf->load_html($content);
    $dompdf->render();
    $dompdf->stream("kapow_ItWorks.pdf");
  

?>

这是template.php 文件(基本上...你不想要所有 16 页...)

<html>
<meta>
<head>
  <link href="thisPage.css" type="text/css" rel="stylesheet">
</head>
  <body>
    <h1><?php echo $_SESSION['someTitle'] ?></h1>
    <h2>wouldn't it be nice, <?php echo $_SESSION['someName'] ?></h2>
  </body>
</html>

所以我的想法是 template.php 将直接从 $_SESSION 数组中提取变量而无需任何干预,如下所示:

大标题

这不是很好吗,HandsomeLulu?

我想问题的关键是:当 PHP 文件加载但不渲染时,是否会评估 $_SESSION 变量?

写!

【问题讨论】:

我在this post(Wrikken 的回答)中发现了一些可以回答我部分问题的内容。我现在在飞机上,或者我有一个可以测试的系统......:P 【参考方案1】:

file_get_contents 不评估 PHP 文件,它只是获取其内容(文件在硬盘驱动器中)。

要做你想做的,你需要使用输出buffering和include

ob_start(); // Start Output beffering
include $theTemplate; // include the file and evaluate it : all the code outside of <?php ?> is like doing an `echo`
$content = ob_get_clean(); // retrieve what was outputted and close the OB

【讨论】:

好的。我们现在用煤气做饭!完全有道理!我正在研究输出缓冲;很高兴我走在正确的轨道上! :D 当 PDF 文件试图打开时我得到一个错误,但我想我已经在我的研究中看到了答案:“......无法打开,因为它不是受支持的文件类型,或者因为文件有被损坏了。”我想我们几乎都在那里!非常感谢你! :D 我错了。这是一个不同的错误。除非你们以前见过这种错误,否则我会继续寻找...... 这类问题的常见嫌疑是输出缓冲导致 PHP 警告/通知被放置在 PDF 文件的顶部。您可以通过在文本编辑器中打开 PDF 来检查这一点。 我愿意! ...我怎么做? :D 我在文本编辑器中查看了 PDF,没有发现任何错误。请注意,我不确定我在寻找什么。你可以DL输出的PDF here 废话:链接错误。改用to this link。对于那个很抱歉。 :P【参考方案2】:

由于某种原因,页面上调用函数的代码也被转储到文件中。这被放置在标题之前。我现在明白为什么了:我没有引用一个外部页面,我是导入和外部页面。不知道为什么没有点击。

无论如何。一旦我摆脱了页面的额外内容,它就工作得很好。回想起来,dompdf 需要说明的只是在调用该函数的页面上不能有任何类型的 HTML(回显、打印等)。至少在我目前的知识水平看来是这样的。

对于那些像我一样在“除了答案之外的一切”中挣扎的人来说,这是完成这项工作的基本代码:

buildPDF.php:

<?php
session_start();
$_SESSION['someTitle'] = "BIG FAT TITLE";
$_SESSION['someName'] = "HandomeLu";

$theTemplate = 'template.php';

function renderToPDF($templateFile)

  require_once("_dox/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("kapow_ItWorks.pdf");
 


renderToPDF($theTemplate);
?>

这是template.php:

    <!DOCTYPE HTML>
    <html>
    <meta>
    <head>
      <meta charset="utf-8">
      <link href="thisPage.css" type="text/css" rel="stylesheet">
    </head>
    <body>
      <h1><?php echo $_SESSION['someTitle'] ?></h1>
      <p>wouldn't it be nice, <?php echo $_SESSION['someName'] ?></p>
    </body>
   </html>

还请注意,外部 CSS 文件可以正常读取。所以你仍然可以保持结构和风格分开。此外,$_SESSION 变量可以在任何地方设置,显然,我只是将它们设置在这里以保持测试容易。

希望这对那些开始学习这门 GREAT 课程的人有用。如果您想启动并运行生成 PDF 文件,这会很麻烦,它应该有一个触发器并抓住它。 :)

感谢所有评论的人。你让我在我需要的地方。 :)

这个网站摇滚。

写!

【讨论】:

以上是关于dompdf:模板和 $_SESSION 变量的主要内容,如果未能解决你的问题,请参考以下文章

PHPWord基于ThinkPHP6的Word模板处理和导出PDF文件的带源码 | 答读者问

PHP:$_SESSION - 在 $_SESSION 变量中存储临时使用的数据的优缺点是啥

Smarty模板中使用getpostrequestcookiessession变量的方法

Dompdf 包在 laravel 中支持其他语言

如何在 Laravel 中将多个数组/变量传递给 DOMPDF?

DOMPDF为整个页面设置字体?