fyrts/chrome-devtools-pdf

使用Chrome DevTools Protocol生成PDF文件的简单PHP库

1.2.0 2022-12-19 15:01 UTC

This package is auto-updated.

Last update: 2024-09-19 18:56:36 UTC


README

ChromeDevToolsPdf通过fyrts/chrome-devtools-protocol提供了一个包装器,用于快速且可预测地使用Chrome DevTools Protocol生成PDF文件。

设置

首先安装最新版本的Chrome/Chromium,然后通过composer安装此包

composer require fyrts/chrome-devtools-pdf

您可以选择自己管理Chrome进程(最好使用进程管理器如Supervisord),或者让库在请求时启动一个进程。

要共享一个进程,请使用remote-debugging-port标志启动Chrome,并使用connect()方法

$instance = ChromeDevToolsPdf\Instance::connect(9222);

要按需启动Chrome,请使用launch()方法,如果需要,提供可执行文件路径

$instance = ChromeDevToolsPdf\Instance::launch('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome');

用法

可以从公开可访问的URL或原始HTML源代码生成PDF文件。

$instance = ChromeDevToolsPdf\Instance::launch();
$pdf = $instance->loadUrl('https://www.google.com');
$pdf->saveFile(__DIR__ . '/filename.pdf');
$instance->close();
$instance = ChromeDevToolsPdf\Instance::launch();
$pdf = $instance->loadHtml('<h1>Example</h1>');
$pdf->saveFile(__DIR__ . '/filename.pdf');
$instance->close();

要接收原始数据而不是直接保存文件,请使用generate()方法代替

$instance = ChromeDevToolsPdf\Instance::launch();
$pdf = $instance->loadUrl('https://www.google.com');
Storage::put($__DIR__ . '/filename.pdf', $pdf->generate());
$instance->close();

通过在PDF对象上调用设置器来更改页面布局设置

$instance = ChromeDevToolsPdf\Instance::launch();
$pdf = $instance->loadUrl('https://www.google.com');
$pdf->setLandscape(true)->setMarginLeft(3);
$pdf->setDisplayHeaderFooter(true)->setHeaderTemplate('Title: <span class="title"></span>');
$pdf->saveFile(__DIR__ . '/filename.pdf');
$instance->close();

以下是可以使用的选项

  • setLandscape(true|false) – 纸张方向。默认为false。
  • setDisplayHeaderFooter(true|false) – 显示页眉和页脚。默认为false。
  • setPrintBackground(true|false) – 打印背景图形。默认为false。
  • setScale(int|float) – 页面渲染的缩放比例。默认为1。
  • setPaperWidth(int|float)setPaperHeight(int|float) – 英寸中的纸张宽度和高度。默认分别为8.5英寸和11英寸。
  • setMarginTop(int|float)setMarginBottom(int|float)setMarginLeft(int|float)setMarginRight(int|float) – 英寸中的上、下、左或右页边距。默认为1厘米(约0.4英寸)。
  • setPageRanges(string) – 要打印的纸张范围,例如,'1-5, 8, 11-13'。默认为空字符串,表示打印所有页面。
  • setIgnoreInvalidPageRanges(true|false) – 是否静默忽略无效但成功解析的页面范围,例如 '3-2'。默认为false。
  • setHeaderTemplate(string) – 打印页眉的HTML模板。应该是有效的HTML标记,并使用以下类来将打印值注入其中(例如,将生成包含标题的span)
    • date: 格式化的打印日期
    • title: 文档标题
    • url: 文档位置
    • pageNumber: 当前页码
    • totalPages: 文档中的总页数
  • setFooterTemplate(string) – 打印页脚的HTML模板。应使用与headerTemplate相同的格式。
  • setPreferCSSPageSize(true|false) – 是否优先使用CSS定义的页面大小。默认为false,在这种情况下,内容将缩放以适应纸张大小。
  • setPaperSize(array) – 包含英寸中纸张宽度和高度的数组。默认分别为8.5英寸和11英寸。以下常量可用作预设
    • PaperSize::A0, PaperSize::A1, PaperSize::A2, PaperSize::A3, PaperSize::A4, PaperSize::A5, PaperSize::A6, PaperSize::A7和PaperSize::A8
    • PaperSize::JUNIOR_LEGAL
    • PaperSize::GOVERNMENT_LETTER
    • PaperSize::LETTER
    • PaperSize::LEGAL
    • PaperSize::TABLOID
    • PaperSize::LEDGER

该库可以异步实现。当打印多页时,这很有用。这样做时,请使用await()方法来防止脚本提前终止。

$instance = ChromeDevToolsPdf\Instance::launch();

$pdf1 = $instance->loadUrl('https://www.google.com');
$pdf1->saveFileAsync(__DIR__ . '/filename-1.pdf');

$pdf2 = $instance->loadUrl('https://www.github.com');
$pdf2->saveFileAsync(__DIR__ . '/filename-2.pdf');

$pdf1->await();
$pdf2->await();

$instance->close();