Преобразование страницы в PDF с помощью dompdf

Я пытаюсь преобразовать страницу PHP в PDF с помощью dompdf, но я не уверен, что это лучший способ сделать это. Я написал свою страницу так, как я хотел бы, чтобы она была представлена ​​в стандартном HTML/PHP, и хотел бы, чтобы она отображалась именно так, как в формате PDF:

Желаемый результат

Мой PHP-код ниже. Я считаю, что мне нужно поместить свой код в переменную $html, чтобы проанализировать его в dompdf, но я немного новичок в PHP, поэтому был бы признателен за помощь в том, как лучше всего это сделать. Очевидно, что все стили страницы передаются из внешних файлов CSS, поэтому я не уверен, проблема в этом или нет?

<?php
    include("checklog.php"); 
    require_once("watchlist-controller.php");
    require_once("dompdf/dompdf_config.inc.php");
    $html = 
?>
<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="shortcut icon" href="img/fav.ico">
        <link rel="apple-touch-icon" href="img/apple-touch-icon.png">
        <title>Screening - Your ticket to your movies - <?php echo $watchlist_name; ?></title>
        <meta name="description" content="Screening is a brand new take on the traditional movie database, fusing social networking and multimedia to provide a clear, concise experience allowing you to share your favourite movies, and discover new classics.">
        <meta name="keywords" content="Movies, Films, Screening, Discover, Watch, Share, experience, database, movie database, film database, share film, share films, discover film, discover films, share movie, share movies, discover movie, discover movies">

        <!-- Bootstrap -->
        <link href="css/bootstrap.css" rel="stylesheet" media="screen">
        <link href="css/bootstrap-responsive.css" rel="stylesheet">
        <link href="css/custom-bootstrap.css" rel="stylesheet">
        <link rel="stylesheet" href="fonts.css" type="text/css" />
        <link rel="stylesheet/less" type="text/css" href="css/stylesheet.less" />
        <script src="js/less-1.3.3.min.js" type="text/javascript"></script>
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
    </head>

    <body>
        <div class="container"><?php 
            require_once ("header.php");?>
            <div id="main" class="well main-content">
                <p class="page-title"><?php echo $watchlist_name; ?></p>
                <div class="row-fluid">
                    <section class="span12 watchlist-holder film-list"><?php
                        if (count($films) == 0) {?>
                            <div class="alert alert-info">This Watchlist is empty! Why not visit a movie page to add something to it?</div><?php
                        } else {?>
                            <ul class="unstyled"><?php
                                foreach($films as $key => $film_item) {
                                    include("watchlist-film-controller.php");?>
                                    <li class="well list-item clearfix">
                                        <div class="row-fluid">
                                            <a href="movie.php?id=<?php echo $rt_id; ?>" class="span1 pull-left" title="<?php echo $title; ?>"><img src="<?php echo $poster_thumb; ?>" alt="<?php echo $title; ?> poster" title="<?php echo $title; ?> poster" /></a>

                                            <div class="span11 movie-info">
                                                <p class="search-title"><a href="movie.php?id=<?php echo $film_item['film_id']; ?>" title="<?php echo $title; ?> (<?php echo $year; ?>)"><?php echo $title; ?></a> <small>(<?php echo $year; ?>)</small></p><?php

                                                if ($critics_consensus == "") {?>
                                                    <p class="watchlist-synopsis">No overview available</p><?php
                                                } else {?>
                                                    <p class="watchlist-synopsis"><?php echo $critics_consensus; ?></p><?php
                                                }?>
                                            </div>
                                        </div>
                                    </li><?php
                                }?>
                            </ul><?php
                        }?>
                    </section>
                </div>
            </div><?php
            include 'footer.html'; ?>
        </div>
    </body>
</html><?php
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream("sample.pdf");?>

Обновить

Основываясь на комментарии BrianS (спасибо!), мой новый код выглядит так, как показано ниже, однако теперь я получаю просто пустую страницу при попытке просмотреть список наблюдения. Я протестировал его без материала dompdf, и страница выглядит отлично, показывая всю информацию, которую я хочу, чтобы она отображалась, и представлена ​​​​правильно. Я также заменил файл LESS на CSS и удалил все файлы JS.

<?php
    include("checklog.php");
    require_once("watchlist-controller.php");
    require_once("dompdf/dompdf_config.inc.php");
    ob_start();
?>
<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link rel="shortcut icon" href="img/fav.ico">
        <link rel="apple-touch-icon" href="img/apple-touch-icon.png">
        <title>Screening - Your ticket to your movies - <?php echo $watchlist_name; ?></title>
        <meta name="description" content="Screening is a brand new take on the traditional movie database, fusing social networking and multimedia to provide a clear, concise experience allowing you to share your favourite movies, and discover new classics.">
        <meta name="keywords" content="Movies, Films, Screening, Discover, Watch, Share, experience, database, movie database, film database, share film, share films, discover film, discover films, share movie, share movies, discover movie, discover movies">

        <!-- Bootstrap -->
        <link href="css/bootstrap.css" rel="stylesheet" media="screen">
        <link href="css/bootstrap-responsive.css" rel="stylesheet">
        <link href="css/custom-bootstrap.css" rel="stylesheet">
        <link rel="stylesheet" href="fonts.css" type="text/css" />
        <link href="css/stylesheet.css" rel="stylesheet">
    </head>

    <body>
        <div class="container">
            <header>
                <div class="navbar navbar-inverse">
                    <div class="navbar-inner">
                        <div class="container">
                            <a href="index.php" title="Screening"><img src="img/blue_logo.png" class="pull-left" title="Screening - Your ticket to your movies" alt="Screening - Your ticket to your movies" /></a>
                            <a class="brand" href="index.php">Screening</a>
                        </div>
                    </div>
                </div>
            </header>
            <div id="main" class="well main-content">
                <p class="page-title">"<?php echo $watchlist_name; ?>" Watchlist by <?php echo $first_name; ?> <?php echo $last_name; ?></p>
                <div class="row-fluid">
                    <section class="span12 watchlist-holder film-list">
                        <ul class="unstyled"><?php
                            foreach($films as $key => $film_item) {
                                include("watchlist-film-controller.php");?>
                                <li class="well list-item clearfix">
                                    <div class="row-fluid">
                                        <a href="movie.php?id=<?php echo $rt_id; ?>" class="span1 pull-left" title="<?php echo $title; ?>"><img src="<?php echo $poster_thumb; ?>" alt="<?php echo $title; ?> poster" title="<?php echo $title; ?> poster" /></a>

                                        <div class="span11 movie-info">
                                            <p class="search-title"><a href="movie.php?id=<?php echo $film_item['film_id']; ?>" title="<?php echo $title; ?> (<?php echo $year; ?>)"><?php echo $title; ?></a> <small>(<?php echo $year; ?>)</small></p><?php
                                            if ($critics_consensus == "") {?>
                                                <p class="watchlist-synopsis">No overview available</p><?php
                                            } else {?>
                                                <p class="watchlist-synopsis"><?php echo $critics_consensus; ?></p><?php
                                            }?>
                                        </div>
                                    </div>
                                </li><?php
                            }?>
                        </ul>
                    </section>
                </div>
                <p>This Watchlist was generated by <span class="bold">Screening</span>.</p>
            </div>
        </div>
    </body>
</html><?php
$html = ob_get_clean();
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream("watchlist.pdf");?>

Кроме того, если это поможет, включение отчетов об ошибках дает мне следующее:

Notice: Undefined variable: submit in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 20
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 107
Notice: Undefined index: name in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 111
Notice: Undefined index: category in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 112
Notice: Undefined index: description in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 113
Notice: Undefined index: hash in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 114
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\watchlist-controller.php on line 119
Warning: require_once(//ICS-FILESHARE/WWW/newmedia.leeds.ac.uk/ug10/cs10aer/screening/dompdf/lib/php-font-lib/classes/font.cls.php): failed to open stream: No such file or directory in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\dompdf\dompdf_config.inc.php on line 335
Fatal error: require_once(): Failed opening required '//ICS-FILESHARE/WWW/newmedia.leeds.ac.uk/ug10/cs10aer/screening/dompdf/lib/php-font-lib/classes/font.cls.php' (include_path='.;C:\php\pear') in \\ICS-FILESHARE\WWW\newmedia.leeds.ac.uk\ug10\cs10aer\screening\dompdf\dompdf_config.inc.php on line 335

person Alex Ryans    schedule 28.04.2013    source источник
comment
Попробуйте это: github.com/mreiferson/php-wkhtmltox   -  person GBD    schedule 28.04.2013
comment
Несколько общих советов: если вы просто отправляете вывод в браузер, не помешает запустить код и посмотреть, что произойдет. В этом случае вы получили бы ошибку, которую вы можете использовать, чтобы попытаться выяснить, чего вам не хватает в вашем коде. Ошибки не всегда точно сообщают об источнике проблемы, но в большинстве случаев они дают вам информацию, необходимую для исправления любых синтаксических проблем.   -  person BrianS    schedule 29.04.2013


Ответы (3)


Есть несколько способов сделать то, что вы хотите. Ваша текущая логика должна работать, хотя синтаксис не совсем правильный. Однако, если вы хотите придерживаться своей текущей структуры, вы можете вместо этого использовать буферизацию вывода.

<?php
include("checklog.php"); 
require_once("watchlist-controller.php");
require_once("dompdf/dompdf_config.inc.php");
ob_start();
?>

<html>...</html>

<?php
$html = ob_get_clean();
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream("sample.pdf");
?>

Связанные таблицы стилей — это хорошо. JavaScript нет, dompdf не поддерживает JS на стороне клиента. Поэтому, если требуется ваша таблица стилей LESS, вам придется преобразовать ее в стандартный CSS.

person BrianS    schedule 29.04.2013
comment
Привет, спасибо за вашу помощь! Я ценю помощь. Я внес изменения, которые вы предлагаете, однако теперь я получаю пустую страницу при попытке загрузить PDF. Я обновил свой исходный пост с новым кодом на основе вашего комментария. - person Alex Ryans; 29.04.2013
comment
Изменить: также добавлены сообщения об ошибках в обновленный пост для большей ясности. - person Alex Ryans; 29.04.2013
comment
Большинство этих предупреждений/уведомлений не имеют ничего общего с dompdf. То, что вы видите, похоже на отсутствующую переменную, вызывающую сбой вашего запроса MySQL. Всегда проверяйте статус вашего запроса. Например, $query = mysql_query(...); if ($query) {...} else {...}. - person BrianS; 30.04.2013
comment
К вашему сведению, вы можете прекратить использовать расширение MySQL, так как оно устарело . Конечно, его легче изучать (хотя бы по той причине, что имеется огромное количество примеров), и он будет существовать какое-то время, но лучше учиться с помощью библиотеки, которая никуда не исчезнет. Если вы хотите придерживаться библиотеки MySQL, рекомендуется MySQLi. Или попробуйте PDO, который упрощает работу с различными базами данных за счет стандартизации API. - person BrianS; 30.04.2013
comment
Обычно выполнение продолжается через уведомления/предупреждения, но есть фатальная ошибка, связанная с dompdf. Последнее сообщение — ошибка, указывающая на отсутствие php-font-lib. Если вы скачали dompdf с github, вам придется загрузить библиотеку php-font-lib отдельно. - person BrianS; 30.04.2013
comment
Спасибо. Я загрузил php-font-lib и загрузил его в соответствующий пустой каталог, и теперь PDF-файл успешно создается, однако его невозможно открыть. Если я передаю его в браузер, а не загружаю, я получаю сообщение «Не удается загрузить PDF», и попытка открыть загруженную копию также приводит к ошибке. - person Alex Ryans; 30.04.2013
comment
давайте продолжим это обсуждение в чате - person BrianS; 30.04.2013

Используйте следующий простой код.

require_once 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();

$html = 'Insert full HTML content';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream("codexworld",array("Attachment"=>0));

Вы можете найти полное руководство по использованию Dompdf для преобразования веб-страницы в PDF на PHP здесь — Преобразование HTML в PDF на PHP с помощью Dompdf

person JoyGuru    schedule 17.05.2016

Я бы предложил использовать WKHTMLTOPDF, который предоставляет довольно много вариантов.

person werd    schedule 28.04.2013