Как создать оглавление, используя dompdf? - PullRequest
5 голосов
/ 28 марта 2009

Я использую библиотеку php dompdf для создания отчета в формате PDF из шаблона HTML. В этом HTML-шаблоне есть оглавление раздела. При создании PDF мне нужно обновить номер страницы оглавления. Кто-нибудь знает, как я могу добиться этого в библиотеке dompdf php?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 30 июня 2016

Я добился этого в Drupal и думаю, что он работает и на других open-source php и фреймворках Я сохранил этот код внутри тега script

$GLOBALS['entity_page'][] =  $pdf->get_page_number();        

в шаблоне, в котором хранится номер страницы. Шаблон с расширением tpl.php Сейчас в модуле после других кодов для экспорта я добавил ......

$canvas = $dompdf->get_canvas();
    $font = Font_Metrics::get_font("helvetica", "normal");
    $canvas->page_text(520, 805, "Page {PAGE_NUM}", $font, 9, array(0.4, 0.4, 0.4));

    foreach ($GLOBALS['entity_page'] as $key => $val) {
        $GLOBALS["entity_val"] = 0;
        $GLOBALS["entity_y"] = 110;
        $canvas->page_script('if($PAGE_NUM == 3 && $PAGE_NUM < 4){
                 $font = Font_Metrics::get_font("helvetica", "normal");
                 $x = 380;
                 $y = $GLOBALS["entity_y"];

                 $pdf->text($x, $y, "-------------------------".$GLOBALS["entity_page"][$GLOBALS["entity_val"]]."", $font, 12, array(0, 0, 0, 0.8));
                 $GLOBALS["entity_y"] = $GLOBALS["entity_y"] + 33;
                 $GLOBALS["entity_val"] = $GLOBALS["entity_val"] + 1;

                }');
    }

$ pdf-> text эта часть добавляет номера страниц с постоянным приращением по оси Y. Другие глобальные переменные entity_y и entity_val используются для хранения значений.

1 голос
/ 15 октября 2009

Генерируя оглавление из HTML (с h1, h2, h3), я сделал следующее:

  • Сначала дайте каждому заголовку уникальный идентификатор (потому что мы используем PrinceXML), и это хорошая практика.
  • Затем создайте его структуру OL / LI, хотя этот фрагмент кода может содержать ошибки.

См .: http://pastie.org/655728

0 голосов
/ 12 декабря 2018

В качестве дополнения к ответу Вики Шреши, вот что я имею для оглавления, которое расширяет более чем одну страницу.

36 - это произвольное количество элементов, которые вписываются в дизайн.

foreach ($GLOBALS['entity_page'] as $key => $val) {
    $GLOBALS["entity_y"] = 88;
    $GLOBALS["entity_val"]  = 0;
    $GLOBALS["entity_per_page"] = 36;
    if($val) {
        $canvas->page_script('
        if(isset($GLOBALS["entity_page"][$GLOBALS["entity_val"]])) {
            if($PAGE_NUM == $GLOBALS["entity_page_number"]){
                $x = 505;
                $y = $GLOBALS["entity_y"];
                $font = $fontMetrics->get_font("Open Sans", "Helvetica Neue", "Helvetica, Arial, sans-serif");

                $pdf->text($x, $y, $GLOBALS["entity_page"][$GLOBALS["entity_val"]]."", $font, 7, array(0, 0, 0, 1));
                $GLOBALS["entity_y"] = $GLOBALS["entity_y"] + 19;
                $GLOBALS["entity_val"] = $GLOBALS["entity_val"] + 1;
                if (($GLOBALS["entity_val"] + 1) % $GLOBALS["entity_per_page"] == 0 ) {
                    $GLOBALS["entity_page_number"] = $GLOBALS["entity_page_number"] + 1;
                    $GLOBALS["entity_y"] = 31;
                }
            }
        }');
    }
}

isset важен, так как по какой-то причине foreach будет зацикливаться дополнительное время, и в конце вы получите исключение вне границ.

0 голосов
/ 23 августа 2009

Возможно, вы уже решили это? Я не использовал dompdf, но я сделал то же самое в Zend_Pdf: я создал пустую страницу для оглавления, а затем продолжил создавать все другие последующие страницы, сохраняя массив title_number => title В конце я вернулся и обновил страницу содержания, используя ссылку, сохраненную ранее ...

...