如何使用 knp-snappy-bundle 在 HTML 中设置 PDF 的页眉和页脚?

Xav*_*ero 2 pdf rendering wkhtmltopdf knp-snappy

长话短说

随着knp-snappy-bundle我无法生成的PDF头,而我实际上可以产生一个页脚。

这是一个错误,一个功能,还是我做错了什么?

细节

1. 环境

我正在测试knp-snappy-bundle,我还wkhtmltopdfh4cc. 这是我的一部分composer.json

"h4cc/wkhtmltopdf-amd64": "^0.12.3",
"knplabs/knp-snappy-bundle": "^1.5",
Run Code Online (Sandbox Code Playgroud)

生成的二进制文件是这样wkhtmltopdf说的:

$ vendor/bin/wkhtmltopdf-amd64 --version
wkhtmltopdf 0.12.3 (with patched qt)
Run Code Online (Sandbox Code Playgroud)

2.没有页眉或页脚,它的工作原理

我已经设置了一个使用 的控制器knp-snappy-bundle并且它可以工作:

这是我的PdfController

public function downloadPdfAction( string $docName ) : Response
{
    $pdf = $this->getPdf( $docName );

    return new PdfResponse( $pdf, $this->getFilename( $docName ) );
}

private function getPdf( string $docName ) : string
{
    $html = $this->renderView( 'AppBundle:documents:' . $docName . '.pdf.twig' );

    $options = [];

    $generator = $this->getPdfGenerator();
    $pdf = $generator->getOutputFromHtml( $html, $options );

    return $pdf;
}

private function getPdfGenerator() : Pdf
{
    $generator = $this->get( 'knp_snappy.pdf' );

    return $generator;
}
Run Code Online (Sandbox Code Playgroud)

它基本上:

  • 有一个downloadPdf动作
      1. 按名称获取 PDF 文档,作为参数传入。在这个例子中,我们将使用'helloWorld'.
      1. Response使用PdfResponse包中的类返回使用 PDF 内容创建的新文件。
  • 获取 PDF
      1. 它使用twig引擎呈现视图。
      1. 获取服务(拆分为另一个功能getPdfGenerator())。
      1. 使用服务 togetOutputFromHtml()而不传入任何选项。

这是我的helloWorld.pdf.twig

<html>
    <body>
        <div class="pdfPageBody">
            <h1>
                Hello, World!
            </h1>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是生成的 PDF,完全符合预期:

在此处输入图片说明

3.使用页眉和页脚,失败!

所以我现在添加页眉和页脚。为此,我只需添加几根树枝,将 HTML 渲染为几个变量,并将它们传递到 Pdf 渲染器的选项中:

private function getPdf( string $docName ) : string
{
    $html = $this->renderView( 'AppBundle:documents:' . $docName . '.pdf.twig' );

    $header = $this->renderView( 'AppBundle:documents:header.pdf.twig' );
    $footer = $this->renderView( 'AppBundle:documents:footer.pdf.twig' );

    $options = [
        'header-html' => $header,
        'footer-html' => $footer,
    ];

    $generator = $this->getPdfGenerator();
    $pdf = $generator->getOutputFromHtml( $html, $options );

    return $pdf;
}
Run Code Online (Sandbox Code Playgroud)

页眉和页脚彼此相同,除了包含的文本:

这是我的header.pdf.twig

<html>
    <body>
        <div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
            This is a header
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

footer.pdf.twig

<html>
    <body>
        <div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
            This is a footer
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

哇!!!页脚被渲染,但页眉没有!!

这就是我得到的:

在此处输入图片说明

图中要注意:

  1. 标题中有“东西”。我可以看到页面内容的文本,如“剪辑”。
  2. 页脚未完全呈现,因为它隐藏了所有底部边框线,并且文本基线与页面底部边缘对齐。

Soooo,因此我的问题!

  • 我应该怎么做才能渲染标题?
  • 难道不是我可以通过这个简单的设置看到 PDF 中呈现的标题吗?为什么不出现?

Xav*_*ero 6

解决了!

好吧,似乎wkhtmltopdf考虑 doctype 真的很严格,如果不是,它会做一些奇怪的事情。

灵感来源:https : //stackoverflow.com/a/28343079/1315009

所以,我改变了所有的树枝,包括<!DOCTYPE html>

你好世界.pdf.twig

<!DOCTYPE html>
<html>
    <body>
        <div class="pdfPageBody">
            <h1>
                Hello, World!
            </h1>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

标题.pdf.twig

<!DOCTYPE html>
<html>
    <body>
        <div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
            This is a header
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

页脚.pdf.twig

<!DOCTYPE html>
<html>
    <body>
        <div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
            This is a footer
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

最后结果

我终于得到了这个:

在此处输入图片说明

它恰好有:

  1. 标题,身体上没有奇怪的剪裁
  2. 页脚。

希望有所帮助!