如何使用 dompdf 创建多个页面

Posted

技术标签:

【中文标题】如何使用 dompdf 创建多个页面【英文标题】:How to create several pages with dompdf 【发布时间】:2012-12-14 22:06:51 【问题描述】:

我在使用多维数组及其值时遇到了一些问题。

我正在寻找的是,从我的查询中,我在数组中搜索教师姓名。之后我想使用 dompdf 创建一个 pdf。问题在于循环。我无法创建一个正确的循环,它可以按照我希望的方式工作。我的示例查询是

    $q11 = "select id from teachers order by teacher ";
    $r11 = mysql_query($q11) or die(mysql_error());
    while($rows11 = mysql_fetch_array($r11))
        $teacher = $rows11['id'];
        $dompdf->"It will start working";
    

现在我知道,这段代码令人困惑,但我想要的是,它应该在一个 pdf 文件中为每位教师创建 dompdf。就像从查询中一样,它应该获取教师,并且应该为每个教师创建一个 dompdf 页面。目前它根据我的查询搜索的最后一个值只制作一页。

请帮忙。有点急。

【问题讨论】:

我建议不要使用 mysql_* 函数进行数据库访问。它们很旧,支持很差,除了名称以外都被弃用(从 php 5.5 起将被弃用)。我建议改用更现代的系统,例如 mysqli 或 PDO。 听起来这不是多维数组或循环的问题,而是正确使用$dompdf 【参考方案1】:

您的循环运行良好。您向 PDF 添加页面的方式可能是错误的。显然,您一次又一次地覆盖一页,而不是附加新页。

编辑

我从未使用过 dompdf。快速浏览一下文档让我觉得您创建了类似 html 标记的内容,然后将其转换为 PDF,我猜对了吗?

示例代码

$html = <<<HTML
  <html>
      <head>
            <style type="text/css">
                /* Your document styling goes here */
            </style>
      </head>
      <body>
HTML;

while ( $row = $dbResult->fetch_assoc() ) 
    $html .= '<div class="teacherPage">'
                 . $row['name'] // your teacher document goes here
             '</div>';


$html .= '</body></html>';

$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream("sample.pdf");

如果您想知道 $var = &lt;&lt;&lt;HTML \r\nHTML 的不寻常语法,那就是 heredoc。当你有很多外来的内联代码时,使用 heredocs 会更舒服,这可以有变量$varname,你不需要担心引号。您需要确保的是,heredoc 更接近 HTML 是在一个新行中并且没有缩进。

EDIT2

仍然不太确定,您使用的是哪个库。我发现 this extension 看起来不错,它被称为 dompdf,就像您在问题中所说的那样。

您的最新评论表明您到目前为止还没有解决您的问题,因此我决定添加更多信息以使您达到目标。

免责声明:我不会编写函数式代码,也不会对此进行测试,但以下提示将推动您朝着正确的方向完成工作。

dompdf 能够读取您输入文档的 CSS2 和 CSS3 属性。

上面while 循环中的每个循环都代表一位老师,他们每个人在输出文档中都有自己的页面。

我将页面放入一个类为teacherPage 的div 容器中。您可以在此容器中填充您希望为教师显示的所有信息。

现在我们需要做的就是告诉 dompdf 每个teacherPage 是一个新页面。这可以使用@page 标记shipped with CSS3 来完成

我在上面的示例文档中添加了一个空的 css 容器 &lt;style type="text/css"&gt;&lt;/style&gt;,这就是页面样式应该去的地方。

示例 CSS

@page teacher 
  size: A4 portrait;
  margin: 2cm;


.teacherPage 
   page: teacher;
   page-break-after: always;

使用@page,您可以定义一个命名页面teacher,它可以具有对整个页面容器有效的属性。

page-break-after: always 将在每个容器之后开始一个新页面

希望这会有所帮助,尝试愉快:)

【讨论】:

我想是的,但我怎样才能阻止它覆盖并转到下一页? 无论您使用什么 pdf 库,都应该在手册中进行解释。 为您添加了一个 css 示例,希望对您有所帮助 优秀的方法..我还想在一个 Pdf 下创建多个不同的表单以将它们一起打印...这个解决方案在 Dompdf 中帮助了我。非常感谢。【参考方案2】:

显然,没有溢出问题,并且结果超出了工作表的允许边距。您可以做的是将数据与另一个表中的父级分开并放在它们之间:

<div style="page-break-before: always;"></div>

【讨论】:

以上是关于如何使用 dompdf 创建多个页面的主要内容,如果未能解决你的问题,请参考以下文章

DOMPDF为整个页面设置字体?

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

php   dompdf包如何将HTML页面导出中文无乱码的PDF文档

如何在Drupal 8中使用Dompdf? [关闭]

如何在 dompdf 中应用引导样式

如何在dompdf中使用CSS并排显示2个表