承接 setasign/setafpdf 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

setasign/setafpdf

Composer 安装命令:

composer require setasign/setafpdf

包简介

SetaFPDF is a clone of FPDF with an almost compatible interface while using SetaPDF-Core internally for the PDF generation.

README 文档

README

SetaFPDF is a clone of FPDF with an almost compatible interface while using SetaPDF-Core internally for the PDF generation.

Motivation

The main motivation for this project was to be able to create PDF/A documents in PHP without changing all existing PDF generation scripts which rely on FPDF.

FPDF is a wide spread and very common PHP library for PDF generation. It is small, well tested and runs on millions of websites. It also comes with several extensions and an active forum.

The SetaPDF-Core component is a PHP component which allows PHP developers to interact with existing PDF documents on a low level. While there is no high-level API for PDF generation it comes with all low-level features which are required to create PDF/A documents:

  • TrueType font sub-setting
  • Access to XMP metadata
  • Color profiles
  • Support for embedded files / attachments

Additionally it comes with other nice features which would be available automatically:

  • Access to document outlines
  • Access to page labels
  • Support for annotations
  • Support for creating and handling destinations (also named destinations)
  • Support for individual actions
  • Support for other colors and color spaces
  • Standard and public key encryption (up to AES256)
  • ...and much more...

Bringing both SetaPDF and FPDF together result in SetaFPDF: An almost identical interface of FPDF backed up by SetaPDF on the lower level.

Future of this project

This project is not a start of a new PDF generation project in PHP but it is a temporary solution to improve existing projects which rely on FPDF.

Requirements

Installation

Add following to your composer.json:

{
    "require": {
        "setasign/setafpdf": "^1.0"
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://www.setasign.com/downloads/"
        }
    ]
}

and execute composer update. You need to define the repository to evaluate the dependency to the SetaPDF-Core component (see here for more details).

Without Composer

Make sure, that the SetaPDF-Core component is installed and its autoloader is registered correctly.

Then simply require the src/autoload.php file or register following namespaces in your own PSR-4 compatible autoload implementation:

$loader = new \Example\Psr4AutoloaderClass;
$loader->register();
$loader->addNamespace('setasign\SetaFpdf', 'path/to/src');

Usage

You can use SetaFPDF the same way as FPDF. Their interfaces are almost identically. So just use another constructor and be aware of following differences:

  • The AddFont() method was changed to allow only TrueType fonts instead of FPDF font definition files.
  • The method AliasNbPages() will throw an \SetaPDF_Exception_NotImplemented exception throughout. It is removed in favor of a more clean solution by re-accessing the pages afterwards through the SetPage() method. By doing this e.g. the alignment is more consistent than with the marker.
  • The $isUTF8 parameter is removed from the Output() method. The HTTP header is always send with an UTF-8 variant by SetaPDF.
  • The $isUTF8 parameter is removed from following methods: SetAuthor(), SetCreator(), SetKeywords(), SetSubject() and SetTitle(). You need to pass the parameters in UTF-8 throughout.
  • The method SetCompression() will throw an SetaPDF_Exception_NotImplemented exception if called with false as its argument (SetaPDF has no option to turn compression off).
  • There's no Error() method anymore. Exceptions are thrown where the errors occur.

Improved and new methods:

  • The SetDrawColor(), SetTextColor() and SetFillColor() accept 1 argument (0-255) for grayscale colors, 3 arguments (each 0-255) for RGB and 4 arguments (each 0-100) for CMYK now by default.
  • A new method SetPage() is introduced to allow you to navigate between pages. With it you can e.g. write page numbers and the final page count into the pages footer or header. This was done before with AliasNbPages().
  • The new getPageCount() method is self-explaining.
  • The getManager() method allows you to get access to the underlaying object structure.

Examples and update information

A simple example will look like:

<?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();

Nothing new here. It's code you already know from FPDF. And that's it. In the normal cases you only need to replace the constructor with \setasign\SetaFpdf\SetaFpdf, update the AddFont(), ensure UTF-8 input and you're done!

Page numbering (previously done by FPDF::AliasNbPages())

If your script relies on page numbering which is implemented by the use of AliasNbPages() in e.g. the Header() or Footer() methods you need to refactor your script. With FPDF it was done e.g. this way:

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();

With SetaFPDF you need to iterate over the created pages and write the footer manually:

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();

Import existing pages from existing PDF documents

There is also a clone for FPDI available. If you need the methods of FPDI just use the class SetaFpdi and you can use methods like setSourceFile(), importPage() and 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();

Generating PDF/A documents

With SetaFPDF you are able to create PDF/A documents. Anyhow it's up to you to not use features which are not allowed in PDF/A. Also it's up to you to add the missing puzzle pieces through the underlaying SetaPDF functionallities. There's a simple example available in demos/pdf-a-3b.php that adds the required pieces to make the PDF PDF/A conform.

If you want to create PDF/A documents while importing other files, you need to make sure, that these documents are PDF/A already.

License

This package is open-source software licensed under the MIT license.

setasign/setafpdf 适用场景与选型建议

setasign/setafpdf 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 106.66k 次下载、GitHub Stars 达 21, 最近一次更新时间为 2018 年 12 月 19 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「pdf」 「fpdf」 「SetaFPDF」 「SetaPDF」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 setasign/setafpdf 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 setasign/setafpdf 我们能提供哪些服务?
定制开发 / 二次开发

基于 setasign/setafpdf 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 106.66k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 22
  • 点击次数: 24
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 21
  • Watchers: 5
  • Forks: 9
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2018-12-19