【问题标题】:Dompdf draw line on every pageDompdf 在每一页上画线
【发布时间】:2017-05-04 23:47:56
【问题描述】:

我正在尝试使用 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 在每个页面上绘制线条/图像?

【问题讨论】:

    标签: header line footer dompdf


    【解决方案1】:

    当然,我们建议尽可能使用 HTML+CSS,而您的上述答案就是这样做的。您缺少一件事,即页码。您可以使用 CSS 计数器获取每个页面上的页码。例如

    <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() 处理文本的方式。

    所有这一切都是说,根据您问题中的示例,您的代码可能没有按照您的想法执行。

    第二,警告。除非您打算仅使用 iso-8859-1 从头到尾对文本进行编码,否则不应使用 utf8_decode()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));
    ?>
    

    【讨论】:

    • 只有在我将 $dompdf-&gt;page_script() 替换为 $canvas-&gt;page_script() 后它才对我有用。
    • $canvas 传入哪里?
    • $canvas 在实例化 Dompdf 时被实例化。要访问它,您只需致电$dompdf-&gt;get_canvas();。画布实例可通过 $pdf 变量从页面脚本中获得。
    【解决方案2】:

    使用 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;}
    

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2017-05-07
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多