koolreport/cloudexport

使用chromeheadless.io的云导出服务导出为PDF或图片

4.2.1 2024-09-04 09:12 UTC

README

CloudExport 帮助您通过导出服务提供商将报告导出到PDF或其他格式。 ChromeHeadless.io 是我们为CloudExport实现的第一款云服务。ChromeHeadless.io由我们开发,因此您可以确保兼容性以及结果的品质。

安装

通过下载.zip文件

  1. 下载
  2. 解压zip文件
  3. cloudexport文件夹复制到koolreport文件夹,使其看起来如下
koolreport
├── core
├── cloudexport

通过composer

composer require koolreport/cloudexport

ChromeHeadless.io

概述

ChomeHeadless.io 是一个在线服务,帮助将HTML转换为PDF和其他图像格式。在高度优化的硬件和软件上运行,ChromeHeadless.io将节省您安装无头浏览器(如Phantomjs或Google Chrome)的时间。它还可以节省您的服务器资源,您可以将其保留用于其他关键任务。Chromeheadless.io处于测试版,因此所有服务均为免费。

获取令牌密钥

  1. ChromeHeadless.io 上注册一个账户。注册后几分钟内,您将收到一封标题为“欢迎来到ChromeHeadless.io”的电子邮件。
  2. 使用欢迎邮件中的账户凭证登录我们的系统。
  3. 转到 令牌管理 页面
  4. 点击生成按钮以生成令牌密钥。

示例

MyReport.php

class MyReport extends \koolreport\KoolReport
{
    //Register cloud export service in your report
    use \koolreport\cloudexport\Exportable;
}

MyReportPDF.view.php

<html>
    <body>
        <h1>This is my first export using Chromeheadless.io</h1>
        <p>Chromeheadless.io save your time and resources in exporting html, report to PDF.</p>
    </body>
</html>

index.php

require_once "../koolreport/core/autoload.php";
require_once "MyReport.php";

$report = new MyReport;
$report->run()
->cloudExport("MyReportPDF")
->chromeHeadlessio("token-key")
->pdf()
->toBrowser("myreport.pdf");

导出引擎

ChromeHeadless.io拥有三个PDF导出引擎:无头Chrome、wkhtmltopdf和Phantomjs。以下是使用它们的示例

$report->run()
->cloudExport("MyReportPDF")
->chromeHeadlessio("token-key")
->pdf($chromePDFOptions)
->toBrowser("myreport.pdf");

$report->run()
->cloudExport("MyReportPDF")
->khtml("token-key")
->pdf($khtmlPDFOption)
->toBrowser("myreport.pdf");

$report->run()
->cloudExport("MyReportPDF")
->phantomjs("token-key")
->pdf($phantomjsPDFOption)
->toBrowser("myreport.pdf");

无头Chrome具有更多功能,但wkhtmltopdf在处理大文件时更快。Phantomjs的优势在于头部和页脚回调,这允许为每一页自定义头部和页脚。

额外设置

您可以添加一些额外设置来指导ChromeHeadless.io加载您的页面。

$report->run()
->cloudExport("MyReportPDF")
->chromeHeadlessio("token-key")
->settings([
    "pageWaiting"=>"load", // load, domcontentloaded, networkidle0, networkidle2
    "useLocalTempFolder" => true,
    "autoDeleteLocalTempFile" => true,
    "serviceHost" => "https://:8000", // default value: https://service.chromeheadless.io
    "serviceUrl" => "https://:8000/api/export",
])
->pdf($chromePDFOptions)
->toBrowser("myreport.pdf");

导出选项

无头Chrome引擎的PDF

pdf()方法可以帮助生成PDF文件。它接受一个数组作为参数,定义PDF的选项。以下是一些可用的选项。

所有选项都可以在以下链接中找到 Headless Chrome pdf options

示例

...
->pdf([
    "scale"=>1,
    "format"=>"A4",
    "landscape"=>true
])
...

wkhtmltopdf引擎的PDF

所有选项都可以在此链接中找到,部分为全局选项 Wkhtmltopdf Docs

示例

...
->pdf([
    "--collate"=>true,
    "--page-size"=>"A4",
    "--orientation"=>"Landscape",
    "--margin-top"=>"100px"
])
...

对于无头Chrome和wkhtmltopdf引擎的PDF选项

某些PDF选项可以直接在PDF视图文件中设置,而不是在pdf()方法中。

头部和页脚

在视图文件中,使用header和footer标签设置PDF的头部和页脚模板

示例

<!-- Headless chrome pdf template -->
<header>
    <div id="header-template" 
        style="font-size:10px !important; color:#808080; padding-left:10px">
        <span>Header: </span>
        {date}
        {title}
        {url}
        {pageNumber}
        {totalPages}
        <span id='pageNum' class="pageNumber"></span>
        <img src='http://www.chromium.org/_/rsrc/1438879449147/config/customLogo.gif?revision=3' />
    </div>
</header>
<footer>
...
</footer>

无头Chrome:如果存在header或footer标签,pdf选项的displayHeaderFooter将为true。PDF选项的headerTemplate和footerTemplate选项将优先于视图文件的header和footer标签。使用header和footer标签时,如果没有font-size样式,则使用默认样式"font-size:10x"。头部和页脚标签支持占位符如{date}、{title}等,以及具有link-type src的img标签。对于img标签,pdf选项的headerTemplate和footerTemplate仅支持base64类型的src。

<!-- Wkhtmltopdf pdf template -->
<header>
    <div>
        {page}{frompage}{topage}{webpage}{section}{subsection}{date}{isodate}{time}{title}{doctitle}{sitepage}{sitepages}
    </div>
</header>
<footer>
...
</footer>

Wkhtmltopdf:使用标题和页脚标签的确切HTML内容(包括img标签)作为PDF的页眉和页脚,其中一些变量将被替换。

边距

在视图文件中,使用body标签的边距样式设置PDF边距。

示例

//MyReportPDF.view.php
<body style='margin: 1in 0.5in 1in 0.5in'>
...
</body>

如果存在标题或页脚标签,但没有body的顶部或底部边距,则将使用默认的1英寸顶部或底部边距。

无模板选项

如果您在模板文件中没有标题/页脚/边距,可以使用noTemplateOption属性来加快PDF生成速度。

...
->pdf([
    "noTemplateOption"=>true,
    ...
])
...

无头Chrome的JPG

jpg()帮助生成JPG文件。它接受一个数组作为参数,定义了JPG的选项。以下是属性列表:

示例

...
->jpg([
    "quality"=>80
    "clip"=>[
        "x"=>100,
        "y"=>100,
        "width"=>500,
        "height"=>1000,
    ]
])
...

无头Chrome的PNG

png()帮助生成PNG文件。它接受一个数组作为参数,定义了PNG的选项。以下是属性列表:

示例

...
->png([
    "clip"=>[
        "x"=>100,
        "y"=>100,
        "width"=>500,
        "height"=>1000,
    ]
])
...

获取结果

在上面的所有示例中,我们使用toBrowser()方法将文件发送到浏览器以供用户下载。以下是所有选项:

示例

$report->run()
->cloudExport("MyReportPDF")
->chromeHeadlessio("token-key")
->pdf()
->saveAs("../stores/myreport.pdf");