如何向使用 DOMPDF 和 Laravel 5.8 生成的 PDF 添加页眉和页脚

tri*_*ole 1 php dompdf laravel laravel-5

我在 Laravel 5.8 应用程序中使用barryvdh/laravel- dompdf

我的页眉和页脚有问题。
预览 PDF

我有这个功能来生成PDF:

public function getProductPdf(Request $request, int $id)
{
    $product = $this->cmsRepository->getProduct($id);
    $data = [
        'title' => 'First PDF for Medium',
        'heading' => 'Hello from 99Points.info',
        'content' => 'Od kilku dni w szeregach Platformy Obywatelskiej trwa czas powyborczych rozlicze?. Kolejni politycy krytykuj? dzia?ania partii pod kierunkiem Grzegorza Schetyny, którego kadencja na stanowisku przewodnicz?cego ko?czy si? za kilka miesi?cy. Walki o przywództwo nie wyklucza Borys Budka. - Jestem sk?onny startowa? w tych wyborach, bo musi by? jaki? wybór - powiedzia? polityk w rozmowie z "Gazet? Wyborcz?".'
    ];

    $pdf = \PDF::setOptions(['dpi' => 150, 'defaultFont' => 'sans-serif', 'defaultPaperSize' => 'a3'])->loadView('psCMS.prints.product-view', $data);
    return $pdf->download('product-' . $product->id . '-' . now()->toDateString() . '.pdf');
}
Run Code Online (Sandbox Code Playgroud)

这是我要打印的模板:

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>{{ $title }}</title>
    <style type="text/css">
        .page-break {
            page-break-after: always;
        }
        /*@page {*/
        /*    margin: 0px 0px 0px 0px !important;*/
        /*    padding: 0px 0px 0px 0px !important;*/
        /*}*/
        th,
        td,
        p,
        div,
        b {
            margin: 0;
            padding: 0
        }
        html {
            margin: 40px 50px
        }
        body {
            font-family: DejaVu Sans;
            font-style: normal;
            font-weight: 400;
            /*margin: 0px;*/
            font-size: 18px;
        }
        * {
            font-family: DejaVu Sans, Verdana, Arial, sans-serif;
        }
        a {
            color: black;
            text-decoration: none;
        }
        table {
            font-size: x-small;
        }
        tfoot tr td {
            font-weight: bold;
            font-size: 18px;
        }
        .gray {
            background-color: lightgray
        }
        .information {
            color: black;
            font-size: 18px;
        }
        .information .logo {
            margin: 5px;
        }
        .information table {
            padding: 10px;
            font-size: 18px;
        }
        .document {
            padding-bottom: 50px;
        }
    </style>
</head>
<body>
    <div class="information">
        <table width="100%">
            <tr>
                <td align="left" style="width: 40%;">
                    <h3>John Doe</h3>
                    <pre>
    Street 15
    123456 City
    United Kingdom
    <br/><br/>
    Date: 2018-01-01
    Identifier: #uniquehash
    Status: Paid
    </pre>
                </td>
                <td align="center">
                    <img src="/path/to/logo.png" alt="Logo" width="64" class="logo" />
                </td>
                <td align="right" style="width: 40%;">
                    <h3>CompanyName</h3>
                    <pre>
                        https://company.com
                        Street 26
                        123456 City
                        United Kingdom
                    </pre>
                </td>
            </tr>
        </table>
    </div>
    <br />
    <h1>{{ $heading}}</h1>
    <div class="document">
        <p>{{$content}}</p>
        <table width="100%">
            <tr>
                <td valign="top"><img src="{{asset('images/meteor-logo.png')}}" alt="" width="150" /></td>
                <td align="right">
                    <h3>Shinra Electric power company</h3>
                    <pre>
                    Company representative name
                    Company address
                    Tax ID
                    phone
                    fax
                </pre>
                </td>
            </tr>
        </table>
        <table width="100%">
            <tr>
                <td><strong>From:</strong> Linblum - Barrio teatral</td>
                <td><strong>To:</strong> Linblum - Barrio Comercial</td>
            </tr>
        </table>
        <br />
        <table width="100%">
            <thead style="background-color: lightgray;">
                <tr>
                    <th>#</th>
                    <th>Description</th>
                    <th>Quantity</th>
                    <th>Unit Price $</th>
                    <th>Total $</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <th scope="row">1</th>
                    <td>Playstation IV - Black</td>
                    <td align="right">1</td>
                    <td align="right">1400.00</td>
                    <td align="right">1400.00</td>
                </tr>
                <tr>
                    <th scope="row">1</th>
                    <td>Metal Gear Solid - Phantom</td>
                    <td align="right">1</td>
                    <td align="right">105.00</td>
                    <td align="right">105.00</td>
                </tr>
                <tr>
                    <th scope="row">1</th>
                    <td>Final Fantasy XV - Game</td>
                    <td align="right">1</td>
                    <td align="right">130.00</td>
                    <td align="right">130.00</td>
                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="3"></td>
                    <td align="right">Subtotal $</td>
                    <td align="right">1635.00</td>
                </tr>
                <tr>
                    <td colspan="3"></td>
                    <td align="right">Tax $</td>
                    <td align="right">294.3</td>
                </tr>
                <tr>
                    <td colspan="3"></td>
                    <td align="right">Total $</td>
                    <td align="right" class="gray">$ 1929.3</td>
                </tr>
            </tfoot>
        </table>

        Pence poinformowa? po trwaj?cych ponad cztery godziny negocjacjach, ?e Turcja na 120 godzin zawiesi wszystkie
        operacje militarne, by pozwoli? kurdyjskim bojownikom na opuszczenie przygranicznego pasa w pó?nocno-wschodniej
        Syrii, a gdy Kurdowie wycofaj? si?, nast?pi rozejm.
        Turcja nie b?dzie jednak zobligowana do wycofania swoich wojsk z Syrii. Jak pisze AP, cytuj?c przedstawiciela
        ameryka?skich w?adz, oznacza to de facto, ?e Ankara otrzyma?a pozwolenie USA na okupowanie bezpiecznej strefy.
        Negocjatorzy obu stron wydali komunikat, w którym napisano, ?e stworzenie bezpiecznej strefy "b?dzie egzekwowane
        przede wszystkim przez si?y zbrojne Turcji".
        Wiceprezydent podkre?li? te?, ?e prezydent Donald Trump zagrozi?, ?e je?li Ankara nie zawiesi operacji
        wojskowych, to on nie wycofa obecnych sankcji na?o?onych na Turcj? i pozwoli na wdro?enie nast?pnych.
        Doda?, ?e Ankara i Waszyngton "zobowi?za?y si? do wypracowania pokojowego rozwi?zania i przysz?o?ci dla
        bezpiecznej strefy" na pó?nocnym wschodzie Syrii. Oznajmi?, ?e ameryka?skie si?y w Syrii zacz??y ju? u?atwia?
        Kurdom bezpieczne wycofanie si? z przygranicznych terenów.
        Pence powiedzia? równie? dziennikarzom, ?e Ankara obieca?a, ?e jej wojska nie zajm? miasta Kobane (Ajn al-Arab),
        nazywanego ogniskiem zapalnym tego konfliktu. Minister spraw zagranicznych Turcji Mevlut Cavusoglu oznajmi?
        jednak, ?e Ankara nie udzieli?a gwarancji dotycz?cych Kobane, a jej armia jedynie "przerwa?a operacje". Doda?,
        ?e status miasta Manbid? "i innych regionów" na pó?nocnym wschodzie Syrii, zostanie przedyskutowany z Rosj?.
        Kurdyjski polityk Aldar Chalil, komentuj?c warunki rozejmu, powiedzia? telewizji Al-Arabija, ?e Erdogan chce
        wedrze? si? na terytorium Syrii na g??boko?? 32 km, a Kurdowie ju? wcze?niej odrzucili takie rozwi?zanie. Doda?,
        ?e aprobuj? zawieszenie broni, ale b?d? si? broni?, je?li zostan? zaatakowani.
        Ameryka?scy senatorowie, w tym wp?ywy sojusznik prezydenta Lindsey Graham, poinformowali, ?e niezale?nie od
        zapowiedzi rozejmu, b?d? "pe?n? par?" pracowali nad ustaw? w sprawie nowych sankcji na Ankar?.
        "Wspania?e wiadomo?ci z Turcji"
        Trump podzi?kowa? na Twitterze Erodganowi i napisa?, ?e otrzyma? "wspania?e wiadomo?ci z Turcji". "Miliony
        istnie? ludzkich b?d? uratowane!" - doda?. Oznajmi?, ?e w tej sytuacji mo?liwa jest wizyta Erdogana w USA w
        przysz?ym miesi?cu.
        Nazwa? te? prezydenta Turcji "twardym facetem", który "zrobi? to, co trzeba". Doda?: "Teraz Kurdowie b?d?
        bardziej sk?onni robi? to, co trzeba".
        Przedstawiciel strony tureckiej po negocjacjach powiedzia? agencji Reutera, ?e Turcja "dosta?a dok?adnie to,
        czego chcia?a". Porozumienie pozwala Turcji uwolni? si? od na?o?onych ju? sankcji i unikn?? kolejnych, a to
        oznacza, ?e w ?aden sposób nie zostanie ukarana za inwazj? w pó?nocno-wschodniej Syrii - komentuje AP.
        Reuters przypomina, ?e ekspedycja si? tureckich zmusi?a do ucieczki 200 tys. cywilów. Wzbudzi?a te? niepokój
        wspólnoty mi?dzynarodowej o odrodzenie si? Pa?stwa Islamskiego (IS), którego bojownicy s? zamkni?ci w
        kurdyjskich wi?zieniach.
        Turecka ofensywa wywo?a?a te? polityczn? burz? w Waszyngtonie, gdzie politycy ró?nych afiliacji krytykowali
        prezydenta za decyzj? o wycofaniu ameryka?skich ?o?nierzy z Syrii, co Ankara uzna?a za przyzwolenie na podj?cie
        operacji wojennych - komentuje Reuters.
        W ?rod? Trump broni? swojej decyzji, nazywaj?c j? "strategicznie b?yskotliw?", ale Izba Reprezentantów tego
        samego dnia przyj??a rezolucj? pot?piaj?c? decyzj? prezydenta o wycofaniu ameryka?skich ?o?nierzy z Syrii.
        Za rezolucj?, w licz?cej 435 miejsc ni?szej izbie Kongresu, g?osowa?o 354 kongresmenów, czyli wszyscy Demokraci
        i du?a grupa Republikanów. W czwartek g?osowanie nad analogiczn? rezolucj? zapowiedzia? Senat.
    </div>
    <footer>
        <div class="footer" style="position: absolute; bottom: 0;">
            <table width="100%">
                <tr>
                    <td align="left" style="width: 50%;">
                        &copy; {{ date('Y') }} {{ config('app.url') }} - All rights reserved.
                    </td>
                    <td align="right" style="width: 50%;">
                        Company Slogan
                    </td>
                </tr>
            </table>
        </div>
    </footer>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我需要在 PDF 的每个页面上都可以看到页眉和页脚。

模板看起来没问题,但是页眉和页脚有问题。

Header = John Doe、公司名称等。Footer = 公司口号,@2019-10-17

如何添加页脚:[页码] 来自 [页数]?

Ami*_*iya 5

为页眉和页脚页面添加样式。

<style>
    @page { margin: 180px 50px; }
    #header { position: fixed; left: 0px; top: -180px; right: 0px; height: 150px; background-color: orange; text-align: center; }
    #footer { position: fixed; left: 0px; bottom: -180px; right: 0px; height: 150px; background-color: lightblue; }
    #footer .page:after { content: counter(page, upper-roman); }
</style>
Run Code Online (Sandbox Code Playgroud)

添加header此 div 内的部分。

<div id="header">

</div>
Run Code Online (Sandbox Code Playgroud)

Footer在以下 div 中添加部分。

 <div id="header">

 </div>
Run Code Online (Sandbox Code Playgroud)
  • 启用DOMPDF_ENABLE_PHP/config/dompdf.php
  • 通过php artisan vendor:publish命令发布供应商文件
  • $pdf从控制器传递对象:
  • 项目清单

您应该在view文件中添加以下脚本。

<script type="text/php">
    if ( isset($pdf) ) {
        // OLD 
        // $font = Font_Metrics::get_font("helvetica", "bold");
        // $pdf->page_text(72, 18, "{PAGE_NUM} of {PAGE_COUNT}", $font, 6, array(255,0,0));
        // v.0.7.0 and greater
        $x = 72;
        $y = 18;
        $text = "{PAGE_NUM} of {PAGE_COUNT}";
        $font = $fontMetrics->get_font("helvetica", "bold");
        $size = 6;
        $color = array(255,0,0);
        $word_space = 0.0;  //  default
        $char_space = 0.0;  //  default
        $angle = 0.0;   //  default
        $pdf->page_text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle);
    }
</script>
Run Code Online (Sandbox Code Playgroud)