silverstripe-australia / pdfrendition
此包已被弃用且不再维护。作者建议使用symbiote/silverstripe-pdfrendition包。
一个模块,利用Flying Saucer XHTML渲染器项目将XHTML页面转换为PDF。
2.1.1
2021-02-24 01:00 UTC
Requires
- silverstripe/framework: ~4.1
Replaces
README
维护者联系方式
- Marcus Nyeholt marcus@symbiote.com.au
- Nathan Glasl nathan@symbiote.com.au
要求
- SilverStripe 4.12+ || 5+
- Tidy(最好是内置的PHP tidy模块,否则为命令行二进制文件)
- Java 1.8(经过测试的最新版本)
- 重要:早期1.7版本会导致PDF无法加载Cloudflare特定的资源,如图片和CSS。
- 重要:无论最终使用哪个版本,在生产环境中上线之前,请确保PDF输出正确(请参阅以下已知问题部分)。
文档
此模块允许用户通过利用HTML和CSS3来定义打印页面布局,轻松创建复杂的内容PDF渲染。它提供了一个简单的扩展,用于自动生成页面PDF渲染,并提供了API以供开发者生成更具体的PDF渲染。
安装说明
composer require symbiote/silverstripe-pdfrendition
概述
- 将
Symbiote\PdfRendition\Extension\PdfControllerExtension
作为扩展添加到PageController中 - 在模板中添加$PdfLink以插入指向页面PDF版本的链接
- 要自定义PDF布局,在主题目录中创建一个'pdfrendition.css'文件,使用您首选的方法(@import、requirements等)将其链接起来,并使用@print媒体查询添加针对您的PDF的特定样式。有关如何进行一些常见PDF相关操作的示例,请参阅github wiki。
已知问题/故障排除
- 在没有有效证书的情况下使用HTTPS可能导致PDF无法正确渲染。
- Cloudflare可能导致PDF无法正确渲染。
- 这可能是由于Java尝试引用资源(图像和CSS),并被列为“不良浏览器”。
- 为了解决这个问题,需要为这些特定的资源(或通用的
/*
通配规则)添加Cloudflare的Page Rules
,并将Browser Integrity Check
设置为Off
。
- 为了解决这个问题,需要为这些特定的资源(或通用的
- 这也可能是由于Java版本(请参阅上述内容)。
- 可以通过在本地截获渲染过程并保留在渲染之前生成的
文件来测试PDF输出。 - 使用此方法,将资产URL替换为您要测试和确认的URL(例如生产环境)。
- Java Flying Saucer实用程序将通过
源中包含的链接检索资产和外部资源。请确保这些链接已完全形成,并且能够在生产服务器中检索到(例如,出站防火墙限制或本地化的DNS/主机定义可能会引起问题)。
- Java Flying Saucer实用程序将通过
- 使用此
/tmp/xhtml
,在生产服务器上运行以下内容应该会生成正确渲染的PDF。 - 如果不正确,则可能是Cloudflare和/或Java的问题。
- 这可能是由于Java尝试引用资源(图像和CSS),并被列为“不良浏览器”。
java -classpath '{project}/pdfrendition/thirdparty/xhtmlrenderer/flying-saucer-core-9.0.7.jar:{project}/pdfrendition/thirdparty/xhtmlrenderer/flying-saucer-pdf-9.0.7.jar:{project}/pdfrendition/thirdparty/xhtmlrenderer/itext-4.2.1.jar' org.xhtmlrenderer.simple.PDFRenderer '/tmp/xhtml' '/tmp/output.pdf'
- 请确保不要在@media print中定义@font-face。
偶尔页面无法正确渲染,PDF渲染过程失败时,会向浏览器返回一些垃圾信息。通常,这是由于发送给渲染器的XML格式不正确造成的;因此,所有内容首先通过HTML Tidy进行过滤,然而在某些罕见情况下,这仍然无法正确转换原始内容。
在这种情况下,错误将通过发送到您的错误日志文件;它将指示创建的临时文件,因此您应首先检查这些文件中的XML错误。如果不起作用,您还可以尝试使用命令行tidy和PDF渲染的命令行手动进行转换,以查看是否可以获得更多用于调试问题的错误信息。