使用dompdf将页面转换为PDF

时间:2013-04-28 11:55:12

标签: php pdf dompdf mpdf

我正在尝试使用dompdf将PHP页面转换为PDF,但我不确定最佳方法。我已经在页面上写了我希望它如何以标准HTML / PHP呈现,并希望它像这样显示,就像PDF一样:

Desired output

我的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的情况下对它进行了测试,页面看起来很完美,显示了我想要显示的所有信息,并且显示正确。我还用CSS替换了LESS文件并删除了所有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

3 个答案:

答案 0 :(得分:5)

有很多方法可以做你想做的事。您当前的逻辑应该可行,但语法不太正确。但是,如果您想坚持使用当前结构,则可以使用输出缓冲。

<?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。

答案 1 :(得分:3)

使用以下简单代码。

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格式的完整指南 - Convert HTML to PDF in PHP with Dompdf

答案 2 :(得分:0)

我建议使用提供了很多选项的WKHTMLTOPDF