setasign / setafpdf
SetaFPDF 是 FPDF 的一个克隆版本,它具有几乎兼容的接口,同时在内部使用 SetaPDF-Core 来生成 PDF。
Requires
- php: >=5.6
- ext-ctype: *
- setasign/setapdf-core: ^2.29
Requires (Dev)
- phpunit/phpunit: ~5.7
- setasign/fpdf: 1.8.1
- setasign/fpdi-fpdf: ^2.1
This package is auto-updated.
Last update: 2024-09-06 09:29:30 UTC
README
SetaFPDF 是 FPDF 的一个克隆版本,它具有几乎兼容的接口,同时在内部使用 SetaPDF-Core 来生成 PDF。
动机
这个项目的动机主要是为了能够在不更改所有依赖 FPDF 的现有 PDF 生成脚本的情况下,使用 PHP 创建 PDF/A 文档。
FPDF 是一个广泛使用的 PHP PDF 生成库。它体积小、经过良好测试,并在数百万个网站上运行。它还包含多个扩展和一个活跃的 论坛。
SetaPDF-Core 组件是一个 PHP 组件,允许 PHP 开发人员以低级别与现有的 PDF 文档进行交互。虽然它没有用于 PDF 生成的顶级 API,但它包含了创建 PDF/A 文档所需的全部低级别功能。
- TrueType 字体子集
- 访问 XMP 元数据
- 颜色配置文件
- 支持嵌入式文件/附件
此外,它还包含其他一些自动可用的优秀功能
- 访问文档大纲
- 访问页面标签
- 支持注释
- 支持创建和处理目标(也称为目标)
- 支持单独的操作
- 支持其他颜色和颜色空间
- 标准加密和公钥加密(最高 AES256)
- ...等等...
结合 SetaPDF 和 FPDF 的优势,产生了 SetaFPDF:一个几乎相同的 FPDF 接口,在底层由 SetaPDF 支撑。
本项目的未来
本项目不是 PHP 中新的 PDF 生成项目的起点,而是一个临时的解决方案,用于改进依赖 FPDF 的现有项目。
需求
- PHP >= 5.6
- SetaPDF-Core (所有 SetaPDF 产品 都包含 SetaPDF-Core)
安装
将以下内容添加到您的 composer.json 中
{ "require": { "setasign/setafpdf": "^1.0" }, "repositories": [ { "type": "composer", "url": "https://www.setasign.com/downloads/" } ] }
然后执行 composer update
。您需要定义 repository
以评估对 SetaPDF-Core 组件的依赖(有关更多详细信息,请参阅 此处)。
评估版本
默认情况下,此包依赖于 SetaPDF-Core 组件的授权版本。如果您想使用评估版本,请在 composer.json 中使用以下内容
{ "require": { "setasign/setafpdf": "dev-evaluation" }, "repositories": [ { "type": "composer", "url": "https://www.setasign.com/downloads/" } ] }
请注意,评估分支依赖于 PHP 7.1 及以上版本。
没有 Composer
请确保已正确安装SetaPDF-Core组件,并且其自动加载器注册正确。
然后只需简单地引入src/autoload.php
文件或在您的PSR-4兼容自动加载实现中注册以下命名空间:
$loader = new \Example\Psr4AutoloaderClass; $loader->register(); $loader->addNamespace('setasign\SetaFpdf', 'path/to/src');
用法
您可以使用SetaFPDF与FPDF相同的方式。它们的接口几乎相同。所以只需使用另一个构造函数,并注意以下差异:
AddFont()
方法已被更改为仅允许TrueType字体,而不是FPDF字体定义文件。AliasNbPages()
方法将始终抛出\SetaPDF_Exception_NotImplemented
异常。它已被移除,转而通过在之后重新访问页面通过SetPage()
方法来实现更干净的做法。通过这种方式,例如,对齐更加一致,比使用标记更佳。$isUTF8
参数已从Output()
方法中移除。SetaPDF始终以UTF-8变体发送HTTP头。$isUTF8
参数已从以下方法中移除:SetAuthor()
、SetCreator()
、SetKeywords()
、SetSubject()
和SetTitle()
。您需要始终以UTF-8传递参数。- 当以
false
作为参数调用时,SetCompression()
方法将抛出SetaPDF_Exception_NotImplemented
异常(SetaPDF没有关闭压缩的选项)。 - 现在不再有
Error()
方法。异常将在错误发生的位置抛出。
改进和新方法
- 默认情况下,
SetDrawColor()
、SetTextColor()
和SetFillColor()
现在接受1个参数(0-255)用于灰度颜色,3个参数(每个0-255)用于RGB,以及4个参数(每个0-100)用于CMYK。 - 引入了新的
SetPage()
方法,允许您在页面之间导航。通过它,您可以例如在页脚或页眉中写入页码和最终页数。之前是通过AliasNbPages()
实现的。 - 新的
getPageCount()
方法不言自明。 getManager()
方法允许您访问底层对象结构。
示例和更新信息
一个简单的示例看起来像这样:
<?php use \setasign\SetaFpdf\SetaFpdf; require_once 'vendor/autoload.php'; $pdf = new SetaFpdf(); $pdf->AddPage(); $pdf->AddFont('DejaVuSans', '', '/path/to/DejaVuSans.ttf'); $pdf->SetFont('DejaVuSans', '', 20); $pdf->Write(20, 'Love & Ζω!'); // Write in UTF-8 $pdf->Output();
这里没有新内容。这是您已经从FPDF中知道的内容。就是这样。在正常情况下,您只需将构造函数替换为\setasign\SetaFpdf\SetaFpdf
,更新AddFont()
,确保UTF-8输入,就完成了!
页码编号(以前通过FPDF::AliasNbPages()
实现)
如果您的脚本依赖于通过在例如Header()
或Footer()
方法中使用AliasNbPages()
实现的页码编号,您需要重构您的脚本。在FPDF中,它是这样实现的:
class Pdf extends FPDF { public function Footer() { $this->SetY(-15); $this->Cell(0, 10, 'Page ' . $this->PageNo() . '/{nb}', 0, 0, 'R'); } } $pdf = new Pdf(); $pdf->AddPage(); // ... $pdf->AddPage(); // ... $pdf->AddPage(); // ... $pdf->AddPage(); // ... $pdf->Output();
在SetaFPDF中,您需要遍历创建的页面并手动编写页脚。
class Pdf extends SetaFpdf { public function writeFooters() { $this->SetAutoPageBreak(false); $pageCount = $this->getPageCount(); // iterate through the pages and draw the footer for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) { $this->SetPage($pageNo); $this->SetY(-15); $this->Cell(0, 10, 'Page ' . $this->PageNo() . '/' . $pageCount, 0, 0, 'R'); } $this->SetAutoPageBreak(true); } } $pdf = new Pdf(); $pdf->AddPage(); // ... $pdf->AddPage(); // ... $pdf->AddPage(); // ... $pdf->AddPage(); // ... // write the footers $pdf->writeFooters(); // ... $pdf->Output();
从现有PDF文档导入现有页面
还有FPDI的克隆。如果您需要FPDI的方法,只需使用类SetaFpdi
,您就可以使用如setSourceFile()
、importPage()
和useTemplate()
之类的功能。
<?php use \setasign\SetaFpdf\SetaFpdi; require_once 'vendor/autoload.php'; $pdf = new SetaFpdi(); $pageCount = $pdf->setSourceFile('/path/to/template.pdf'); for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) { $tpl = $pdf->importPage($pageNo); $pdf->AddPage(); $pdf->useTemplate($tpl, ['adjustPageSize' => true]); } $pdf->Output();
生成PDF/A文档
使用SetaFPDF,您可以创建PDF/A文档。但是,是否使用PDF/A不允许的功能取决于您。同样,是否通过底层SetaPDF功能添加缺失的拼图取决于您。在demos/pdf-a-3b.php
中有一个简单的示例,该示例添加了所需的拼图,使PDF符合PDF/A。
如果您想在导入其他文件的同时创建PDF/A文档,您需要确保这些文档已经是PDF/A格式。
许可协议
本软件包是开源软件,遵循MIT许可协议。