setasign/setafpdf

SetaFPDF 是 FPDF 的一个克隆版本,它具有几乎兼容的接口,同时在内部使用 SetaPDF-Core 来生成 PDF。

v1.0.0 2021-06-28 12:41 UTC

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 的现有项目。

需求

安装

将以下内容添加到您的 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许可协议