跳转到内容

NextPDF Symfony 集成概览

nextpdf/symfony 是 NextPDF 引擎的官方 Symfony 7 bundle。它将引擎接入 Symfony container(容器),并提供一个可注入到你自己的服务中的文档 factory(工厂)。它还附带 HTTP response 辅助工具,以及一条异步生成 PDF 的路径,让生成工作能在后台运行。

NextPDF Symfony 以标准 bundle 的形式将 nextpdf/core 引擎接入 Symfony 应用程序。它提供以下构建块,每一项都已对照 src/Symfony/ 中的 bundle 源码逐一验证:

  • 一个 bundle 入口点NextPDF\Symfony\NextPdfBundle 继承 Symfony 的 Bundle 基类,并注册一个 compiler pass。
  • 一个依赖注入 extensionNextPDF\Symfony\DependencyInjection\NextPdfExtension 加载服务定义,将 config tree(配置树)转换为 container 参数,并对外公开配置别名 nextpdf
  • 一棵类型化配置树NextPDF\Symfony\DependencyInjection\Configuration 定义了 nextpdf 的配置 schema。这个 schema 会校验 enum 值、设置默认值,并使用 %kernel.*% 参数 placeholder(占位符)。
  • 一个可注入的文档 factoryNextPDF\Symfony\Service\PdfFactory 会创建全新、预先配置好的 NextPDF\Core\Document 实例。它相当于静态 facade 的 Symfony 版本。
  • HTTP response 辅助工具NextPDF\Symfony\Http\PdfResponse 会构建 inline、下载与流式响应,并附带一组固定、符合 OWASP 原则的安全标头。
  • 一条异步生成路径NextPDF\Symfony\Message\GeneratePdfMessageNextPDF\Symfony\Message\GeneratePdfHandlerNextPDF\Symfony\Message\PdfBuilderInterface 会与 Symfony Messenger 集成,让 PDF 渲染能在 worker 上运行。
  • 一个编译期 extension 检测器NextPDF\Symfony\DependencyInjection\Compiler\OptionalExtensionPass 会检测可选的 NextPDF extension,并且只在这些 extension 存在时注册它们的服务。

这个 bundle 会注册一组小而稳定的公开 container 服务。文档服务 nextpdf.document(别名为 NextPDF\Contracts\PdfDocumentInterfaceNextPDF\Core\Document并非共享:每次 resolve(解析)都会返回一份彼此独立、用完即弃的文档。这符合 PSR-11 容器契约:在该契约下,以相同标识符连续调用两次 get(),根据容器配置,可能返回不同的值 — 见 PSR-11 §1.1.2。非共享绑定是有意设计的:文档会累积每次渲染的状态,因此每个请求都会拿到全新实例,可避免状态在长时间运行的 worker 中跨请求泄漏。

字体注册表(NextPDF\Contracts\FontRegistryInterface)的运作方式则相反:它是共享的 singleton(单例)。图像注册表带有 kernel.reset 标签,因此在 FrankenPHP 与 Messenger worker 下,其有界缓存会在请求之间被清除。配置页面列出了完整的服务与别名对照表。

字体与图像注册表都接受一个可选的 PSR-3 logger。只有在应用程序提供 logger 时,这个 bundle 才会绑定 Psr\Log\LoggerInterfacenullOnInvalid())。因此,日志记录是可选的协作组件,而非硬性依赖。这与 PSR-3 logger 契约一致:在该契约下,logger 是一个可注入、可替换的协作组件(PSR-3)。

这个 bundle 本身是 Apache-2.0 核心软件。少数能力只有在你同时安装相应可选包后才会出现:

能力需要检测方式
PDF 生成、PdfFactoryPdfResponse仅需核心始终可用
异步生成symfony/messenger安装 Messenger 后 handler 即启用
Chrome CDP HTML 渲染nextpdf/artisan编译期 class_exists 探测
PDF/A 归档、数字签名nextpdf/premium(安装 Pro)编译期 class_exists 探测

安装 nextpdf/premium 后,这个 bundle 可应用一组基线 PAdES B-B 签名配置。更高级的签名配置不在这个 bundle 的文档范围内。关于版本对照矩阵,请参阅 NextPDF Premium 文档。

当你在 Symfony 7 HTTP 应用程序或 worker 内构建 PDF 时,就使用 nextpdf/symfony。这个 bundle 为你提供由 container 管理的服务、worker 安全的注册表,以及安全的下载响应,因此你不必手动装配引擎。如果你只需要在脚本中做一次性生成,单靠核心包 nextpdf/core 就足够了。

每一行都对应本页提出的一项规范性主张,并锚定到受管制 SDO 语料库中的完整 64 位十六进制 reference_id。Provenance(来源信息)(语料库 manifest、检索传输)记录在 _sidecars/rag-citations.yaml 中。

规范条款参考 ID主张
PSR-11psr_11_container#1.1.2.p3.bContainer get() 返回值契约
PSR-3psr_3_logger#x3.p17LoggerInterface 可选依赖

当 nextpdf/premium(Pro)与这个 bundle 一同安装时,数字签名与 PDF/A 归档即可使用。这是一项可选的 Pro 能力。这里所记载的 Core bundle 采用它时不需要任何代码变更。见 </get-license/?intent=symfony-pro>。

  • /integrations/symfony/install/ — 安装并注册这个 bundle。
  • /integrations/symfony/configuration/ — 完整的 nextpdf 配置树与服务对照表。
  • /integrations/symfony/quickstart/ — 一个可运行的控制器与异步示例。
  • /integrations/symfony/boot-and-discovery/ — Symfony 如何发现并启动这个 bundle。
  • /integrations/symfony/production-usage/ — worker 安全性、流式与异步模式。