php 使用dompdf将页面转换为PDF

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16262582/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 10:48:20  来源:igfitidea点击:

Convert page to PDF using dompdf

phppdfdompdfmpdf

提问by Alex Ryans

I am trying to convert a PHP page to PDF using dompdf, but I'm not sure of the best way to do it. I have wrote my page how I would like it to be presented in standard HTML/PHP, and would like it to be displayed like so, just as a PDF:

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

Desired output

期望输出

My PHP code is below. I believe I need to put my code into the $htmlvariable to parse that into dompdf, but I'm a bit of a PHP newbie, so would appreciate some help as to what the best way to achieve this is. Obviously, the styling of the page is all being brought in from external CSS files, so I'm not sure if that's an issue or not?

我的 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");?>

Update

更新

Based on BrianS's comment (thank you!), my new code looks like below, however I'm now getting just a plain blank page when trying to view the Watchlist. I've tested it without the dompdf stuff, and the page appears perfectly, showing all the information I want it to show, and presented correctly. I've also replaced the LESS file with CSS and removed all the JS.

根据 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");?>

Also, if it helps, turning on error reporting gets me the following:

此外,如果有帮助,打开错误报告会得到以下信息:

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

回答by BrianS

There are a number of ways of doing what you want. Your current logic should work, though the syntax isn't quite right. If you want to stick with your current structure, though, you might use output buffering instead.

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

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

Linked stylesheets are fine. JavaScript is not, dompdf doesn't support client-side JS. So if your LESS stylesheet is required you'll have to convert it to standard CSS.

链接的样式表很好。JavaScript 不是,dompdf 不支持客户端 JS。因此,如果需要 LESS 样式表,则必须将其转换为标准 CSS。

回答by JoyGuru

Use the following simple code.

使用以下简单代码。

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

You can find the complete guide to using Dompdf for convert web page to PDF in PHP from here - Convert HTML to PDF in PHP with Dompdf

您可以从这里找到使用 Dompdf 在 PHP 中将网页转换为 PDF 的完整指南 - Convert HTML to PDF in PHP with Dompdf

回答by werd

I would suggest using WKHTMLTOPDFwhich provides quite a lot options

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