Dompdf在每页上画线

时间:2013-06-17 08:19:48

标签: header line footer dompdf

我正在尝试使用Dompdf从html文件生成漂亮的pdf,但我无法绘制一条线 在每一页上。这是一个php文件的例子。

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

$html = file_get_contents("test.txt");
$html = utf8_decode($html);

$dompdf = new DOMPDF();
$dompdf->load_html($html);  

$dompdf->render();

$font = Font_Metrics::get_font("helvetica", "bold");
$canvas = $dompdf->get_canvas();
$footer = $canvas->open_object();

    $canvas->line(10,730,800,730,array(0,0,0),1);
    $canvas->page_text(555, 750, "{PAGE_NUM}/{PAGE_COUNT}",
                   $font, 10, array(0,0,0));

$canvas->close_object();
$canvas->add_object($footer, "all");

$dompdf->stream("dompdf_out.pdf", array("Attachment" => false));
?>

这会产生一个pdf,其中每个页面都包含页码,但只有最后一页有一行。

那么如何用Dompdf在每个页面上绘制线条/图像?

2 个答案:

答案 0 :(得分:7)

当然,我们建议尽可能使用HTML + CSS,您的上述答案就是这样做的。你错过了一件事,那就是页码。您可以使用CSS计数器在每个页面上获取页码。 e.g。

<style>
#header { position: fixed; border-bottom:1px solid gray;}
#footer { position: fixed; border-top:1px solid gray;} .pagenum:before { content: counter(page); } </style>

<div id="header">
  <img src="logo.gif" style="margin-top:10px;"/>
</div>
<div id="footer">
  Page <span class="pagenum"></span>
</div>

您无法通过CSS访问的一个值是总页数。因此,您仍然需要使用脚本生成的文本。

首先,一点解释。大多数直接访问方法仅将内容添加到当前页面(实际上,当前是活动对象...通常是页面)。因此,使用text()方法绘制线条或形状,添加图像或添加文本都会绘制到单个页面。您可以通过渲染到分离的对象来解决该限制,然后将其添加到每个页面(open_object() / close_object() / add_object())。重要的是要注意从当前页面开始生成分离的对象(即所有以前的页面都不会看到对象),这就是您通常希望通过内联脚本处理对象的原因。

page_text()方法不同。它专门用于在呈现PDF后向所有页面添加内容。它在外部工作并与分离的对象容器分开。您在page_script()方法中具有类似的功能,该方法以类似于page_text()处理文本的方式处理脚本。

所有这一切都是基于您的问题中的示例,您的代码可能没有按照您的想法进行。

第二,警告。您不应该使用utf8_decode(),除非您打算仅使用iso-8859-1编码您的文本。 utf8_decode()导致utf8转换为iso-8859-1。 dompdf完全能够使用utf8编码的文本(自v0.6.0起),并将处理任何必要的转换。您应该熟悉Unicode How-To中的信息,因为有一些与PHP / dompdf配置相关的要求。

考虑到所有这些信息,您可以使用原始代码进行一些小修改:

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

$html = file_get_contents("test.txt");

$dompdf = new DOMPDF();
$dompdf->load_html($html);  
$dompdf->render();

$font = Font_Metrics::get_font("helvetica", "bold");
$canvas = $dompdf->get_canvas();
$canvas->page_text(555, 750, "{PAGE_NUM}/{PAGE_COUNT}", $font, 10, array(0,0,0));
$canvas->page_script('
  // $pdf is the variable containing a reference to the canvas object provided by dompdf
  $pdf->line(10,730,800,730,array(0,0,0),1);
');

$dompdf->stream("dompdf_out.pdf", array("Attachment" => false));
?>

答案 1 :(得分:0)

使用html / css解决。不是最佳,但至少它是有效的。

  <div id="header">
    <img src="logo.gif" style="margin-top:10px;"/>
  </div>
  <div id="footer">
    Footer
  </div>

 #header { position: fixed; border-bottom:1px solid gray;}
 #footer { position: fixed; border-top:1px solid gray;}