5

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 を使用してすべてのページに線/画像を描画するにはどうすればよいですか?

4

2 に答える 2

7

確かに、可能な場合は HTML+CSS を使用することをお勧めします。上記の回答はそれを行います。ページ番号が 1 つ欠けています。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 経由でまだアクセスできない値の 1 つは、総ページ数です。そのためには、スクリプトで生成されたテキストを使用する必要があります。

まず、簡単な説明。直接アクセス方法のほとんどは、現在のページ (実際には、現在アクティブなオブジェクト ... 通常はページです) にのみコンテンツを追加します。したがって、メソッドを使用して線や図形を描画したり、画像を追加したり、テキストを追加したりするtext()と、すべて 1 つのページに描画されます。切り離されたオブジェクトにレンダリングし、それを各ページに追加することで、その制限を回避できます ( 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 以降) を完全に処理でき、必要な変換を処理します。PHP/dompdf 構成に関連する要件がいくつかあるため、Unicode How-Toの情報をよく理解しておく必要があります。

このすべての情報を念頭に置いて、いくつかの小さな変更を加えて元のコードを使用できます。

<?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));
?>
于 2013-06-17T15:18:13.590 に答える