gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:14:04 25 4
gpt4 key购买 nike

长话短说

使用 knp-snappy-bundle 我无法在 PDF 中生成页眉,但实际上我可以生成页脚。

这是错误、功能还是我做错了什么?

详情

1。环境

我正在测试 knp-snappy-bundle,我还安装了来自 h4ccwkhtmltopdf 二进制文件。这是我的 composer.json 的一部分:

"h4cc/wkhtmltopdf-amd64": "^0.12.3",
"knplabs/knp-snappy-bundle": "^1.5",

wkhtmltopdf 的二进制结果是这样的:

$ vendor/bin/wkhtmltopdf-amd64 --version
wkhtmltopdf 0.12.3 (with patched qt)

2。 没有页眉或页脚,它可以工作

我设置了一个使用 knp-snappy-bundle 的 Controller 并且它可以工作:

这是我的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;
}

基本上:

  • 有一个 downloadPdf Action
      1. 通过名称获取 PDF 文档,作为参数传入。在此示例中,我们将使用 'helloWorld'
      1. 使用包中的 PdfResponse 类返回使用 PDF 内容创建的新 Response
  • 获取 PDF
      1. 它使用 twig 引擎呈现 View 。
      1. 获取服务(拆分为另一个函数 getPdfGenerator())。
      1. 使用 getOutputFromHtml() 服务,不传入任何选项。

这是我的helloWorld.pdf.twig:

<html>
<body>
<div class="pdfPageBody">
<h1>
Hello, World!
</h1>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
</body>
</html>

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

enter image description here

3。 有了页眉和页脚,它失败了!

所以我现在添加页眉和页脚。为此,我只需添加几根 Twig ,将 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;
}

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

这是我的header.pdf.twig:

<html>
<body>
<div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
This is a header
</div>
</body>
</html>

还有 footer.pdf.twig:

<html>
<body>
<div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
This is a footer
</div>
</body>
</html>

哇!!!页脚得到渲染,但页眉没有呈现!!

这是我得到的:

enter image description here

图片中需要注意的地方:

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

太棒了,所以我的问题!!

  • 我应该怎么做才能同时呈现标题?
  • 难道我不应该通过这个简单的设置看到 PDF 中呈现的页眉吗?为什么没有出现?

最佳答案

解决了!

嗯,好像wkhtmltopdf考虑文档类型真的很严格,如果没有,它会做一些奇怪的事情。

灵感来自于此:https://stackoverflow.com/a/28343079/1315009

因此,我更改了所有 Twig 以包含 <!DOCTYPE html> :

helloWorld.pdf.twig

<!DOCTYPE html>
<html>
<body>
<div class="pdfPageBody">
<h1>
Hello, World!
</h1>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</div>
</body>
</html>

header.pdf.twig

<!DOCTYPE html>
<html>
<body>
<div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
This is a header
</div>
</body>
</html>

页脚.pdf.twig

<!DOCTYPE html>
<html>
<body>
<div style="border: 5px dashed crimson; color: maroon; background-color: darksalmon">
This is a footer
</div>
</body>
</html>

最终结果

我终于明白了:

enter image description here

恰好有:

  1. 标题,正文中没有奇怪的剪裁
  2. 页脚。

希望有所帮助!

关于pdf - 如何使用 knp-snappy-bundle 从 HTML 在 PDF 中设置页眉和页脚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47583622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com