簡體   English   中英

如何使用wkhtmltopdf獲取html生成的pdf中的頁碼

[英]How to get page numbers in pdf generated by html with wkhtmltopdf

這是我們的答案:

我們目前正在使用wkhtmltopdf從給定的 html 模板生成 PDF。

一些背景資料:

我們正在使用Sulu CMF來構建我們的后端,它基於Symfony2 KnpSnappy Bundle 用作wkhtmltopdf的 Symfony 包裝器。

我們如何生成 PDF:

由於許多 PDF 共享相同的頁眉和頁腳,我們創建了一個 BasePDFBundle,它提供了一個 PDFManager 來通過給定的 TWIG 模板即時構建 PDF。 默認情況下,包含通用頁眉和頁腳(通常帶有客戶的姓名和徽標)。

頁腳問題/頁腳(或頁眉)中的頁碼:

將頁碼添加到 PDF 中非常有用,例如。 對於訂單,但是我們的大部分內容都是動態添加的(例如產品列表)。 由於 PDF 的樣式可以更改並且內容本身是動態添加的,因此必須有一種快速簡便的方法將當前頁面和總頁面添加到生成的 PDF 中。 這是我們所做的:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
    <base href="{{ app.request.schemeAndHttpHost }}" />
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <link rel="stylesheet" href="{{ asset('bundles/pdfbase/css/pdfstyles.css') }}"/>
</head>
<body class="footer">
    <div class="footer-container">
        <div class="footer-widget">
            <b>FooBar Company Name</b>
        </div>
        <div class="text-align-right">
            <span class="page"></span>/<span class="topage"></span>
        </div>
    </div>

    <script type="text/javascript">
     (function() {
       // get all url parameters and transform it to a list
       // pdf generator adds a param for current and the total page sum
       // add the value to the html elements
       var urlParams = document.location.search.substring(1).split('&');
       var urlParamsList = {};
       var pagingElements = ['topage', 'page'];

       for (var i in urlParams) {
         var param = urlParams[i].split('=', 2);
         urlParamsList[param[0]] = unescape(param[1]);
       }

       for (var i in pagingElements) {
         var elem = document.getElementsByClassName(pagingElements[i]);
         for (var j = 0; j < elem.length; ++j) {
           elem[j].textContent = urlParamsList[pagingElements[i]];
         }
       }
     })();
    </script>
 </body>

是的, pagetopage的變量名稱可能會更好,但是它們與將樹枝模板合並到最終 PDF 模板時使用的 KnpSnappy 包裝器相同。 這是獲取當前頁碼和總頁碼的最簡單方法,因為您可以讓包裝器完成所有計算。

最后你只需要替換 html 標簽的文本就可以了!

您的本地機器和服務器之間的差異:

當 wkh​​tmltopdf 打開一個虛擬瀏覽器來“渲染”樹枝模板時,這可能會導致您在服務器上生成 pdf 文件時出錯。 我們發現使用像<body onload="doSomething()">這樣的事件標簽不是一個好主意,你應該像我們在上面的例子中那樣觸發你的 javascript 代碼。

如果您使用 KnpSnappy 作為 wkhtmltopdf 的包裝器,那么您可以為您的 pdf 設置各種選項。

請參閱 wkhtmltopdf 文檔中的“頁腳和頁眉:”部分,此處為http://wkhtmltopdf.org/usage/wkhtmltopdf.txt

[page] 替換為當前正在打印的頁數

[topage] 替換為要打印的最后一頁的編號

以下是 Symfony2 控制器的示例,檢查 $pdfOptions 數組中的footer-html選項,其中我使用了兩個占位符在 pdf 文件的每一頁的頁腳中打印頁碼。

<?php

namespace Rm\PdfBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

/**
 * Pdf controller
 */
class PdfController extends Controller
{
    /**
     * Serve pdf
     *
     * @Route("/article/{slug}", name="rm_pdf_view")
     * @Method({"GET"})
     */
    public function viewAction(Request $request, $slug)
    {

        // build html
        $html = $this->renderView('RmPdfBundle:Pdf:view.html.twig', array(
            'data'  => $yourDataToTemplate,
        ));


        // prepare pdf options
        $pdfOptions = array(

            'footer-html'      => '<p>Page : [page] of [pageTo]</p>',

            'footer-font-size' => '10',
            'page-size'        => 'A4',
            'orientation'      => 'Portrait',
            'margin-top'       => 10,
            'margin-bottom'    => 20,
            'margin-left'      => 15,
            'margin-right'     => 15,
            );

        // file name of pdf
        $pdfFileName = "nameOfYourPdfFile.pdf";

        // server pdf file to user using knp_snappy.pdf service
        return new Response(
            $this->get('knp_snappy.pdf')->getOutputFromHtml($html, $pdfOptions),
            200,
            array(
                'Content-Type'          => 'application/pdf',
                'Content-Disposition'   => 'attachment; filename="'.$pdfFileName.'"',
            )
        );

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM