2013-06-17 4 views
2

Я пытаюсь создать хороший pdf-файл из html-файла с Dompdf, но я не могу нарисовать строку на каждой странице. Вот пример файла php.Dompdf draw line на каждой странице

<?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)); 
?> 

Это приводит к тому, что каждая страница содержит номер страницы, но только последняя страница имеет строку.

Так как я могу нарисовать линию/изображения на каждой странице с помощью Dompdf?

ответ

6

Конечно, мы рекомендуем использовать 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().

Все это означает, что на основе образца в вашем вопросе ваш код, вероятно, не делает то, что вы думаете.

Во-вторых, предупреждение. Вы не должны использовать utf8_decode(), если только вы не намерены, чтобы ваш текст был только закодирован с началом iso-8859-1. utf8_decode() вызывает потерю преобразования utf8 в iso-8859-1. dompdf полностью способен работать с utf8-кодированным текстом (начиная с версии 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)); 
?> 
+0

Он работал для меня только после того, как я заменил '$ dompdf-> page_script()' с '$ холст -> page_script() '. – andreivictor

+0

@ andreivictor, конечно, вы правы – BrianS

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