跳转到内容
getnextpdf.com

Enterprise 版本

Invoice — 深度参考

Invoice 模块有三个相互独立的接口面:内嵌、校验,以及 Schematron 规则执行。ZugferdEmbedderPeppolEmbedder 会将调用方提供的发票 XML 附加到 PDF/A-4f 或 PDF/A-3b 载体上,并返回一个结构化结果。InvoiceXmlValidator 会运行一次 EN 16931 结构预检,其严重程度可选择 COMPAT 或 STRICT。SchematronValidator 会在进程内执行预编译的 Schematron 规则包,并解析 SVRL 发现。NextPDF 不生成发票 XML;载荷由调用方提供并拥有。

此能力随 NextPDF Enterprisenextpdf/enterprise)发布,并通过一个 Enterprise 层级的授权信封激活。缺少该授权项的部署不会加载此能力的类。比较版本并获取授权

逐层级细节:电子发票检测与校验是 Pro 层级的接口面(Pro Compliance 模块)。混合发票内嵌、XRechnung CIUS 配置文件,以及进程内的 Schematron 引擎仅限 Enterprise。除 nextpdf/enterprise 包边界之外,没有单独的逐功能能力代码。

Terminal window
composer require nextpdf/enterprise:^3
符号参数默认行为返回抛出或失败于备注
ZugferdEmbedder::basic()PdfAManager, FileAttachment, string $xmlData内嵌 BASIC 配置文件的 CII XML:XmlGuard 检查、结构校验、XMP schema 注入、附加ZugferdEmbedResultInvalidArgumentException, ZugferdEmbeddingException快捷路径;推荐的起点
ZugferdEmbedder::minimum()PdfAManager, FileAttachment, string $xmlData在 MINIMUM 配置文件下使用相同流水线ZugferdEmbedResultInvalidArgumentException, ZugferdEmbeddingException快捷路径
ZugferdEmbedder::create()ZugferdProfile, string $xmlDataBuilder 入口;拒绝空 XMLselfInvalidArgumentException通过 withoutValidation()withDescription() 配置
ZugferdEmbedder::withAfRelationship() / PeppolEmbedder::withAfRelationship()AFRelationship|string覆盖默认的 /Alternative 关系;受关联文件规则手册限制selfInvalidArgumentException发票拒绝 SchemaEncryptedPayloadFormData
ZugferdEmbedder::embed()PdfAManager, FileAttachment终结性 builder 调用:XmlGuard、可选校验、载体检查、XMP、附加ZugferdEmbedResultInvalidArgumentException, ZugferdEmbeddingException校验失败会指明第一个错误
ZugferdProfile(枚举)取值 MINIMUM、BASIC_WL、BASIC、EN16931、EXTENDED、XRECHNUNGXRECHNUNG 附加 xrechnung.xml;CII 配置文件附加 factur-x.xml
ZugferdXmpSchema::apply()XmpMetadata, ZugferdProfile注册 Factur-X RDF 描述与 PDF/A 扩展 schema 条目XmpMetadataembed() 调用;也可直接使用
PeppolEmbedder::invoice() / ::creditNote()PdfAManager, FileAttachment, string $ublXml内嵌 Peppol BIS 3.0 UBL 发票或贷项通知 XMLPeppolEmbedResultInvalidArgumentException, PeppolEmbeddingException默认文件名 invoice.xml / creditnote.xml
PeppolEmbedder::create()string $ublXml, string $filename = 'invoice.xml'Builder 入口;拒绝空 XML 或文件名selfInvalidArgumentException通过 withFilename()withDescription()withoutSanitization() 配置
PeppolEmbedder::embed()PdfAManager, FileAttachmentXmlGuard 检查、载体检查、规则手册限制、附加PeppolEmbedResultInvalidArgumentException, PeppolEmbeddingException在内嵌时对载体感知的规则手册再检查一次
InvoiceXmlValidator::validate()string $xmlData, ZugferdProfile, ?InvoiceValidatorModeEN 16931 结构预检;默认 COMPAT 严重程度InvoiceValidationResult不抛出;失败以错误发现形式呈现模式先解析参数,再解析环境,最后回退 COMPAT
InvoiceXmlValidator::isCrossIndustryInvoice()string $xmlData对 CII 载荷进行根元素与命名空间检查bool不抛出;返回 false低成本检测探针
InvoiceValidatorMode(枚举)COMPAT(默认)将 BT-24 发现保持为警告;STRICT 将其提升为错误fromEnvironment() 在未设置或无法识别的取值上回退 COMPAT
InvoiceValidationResult / InvoiceValidationFinding不可变聚合:isValidgetErrors()getWarnings();每条发现含级别、代码、消息InvoiceValidationResult::fail() 封装单个错误
SchematronValidator::validate()string $xsltPath, string $xmlData执行预编译的 Schematron XSLT;将 SVRL 解析为发现SchematronResultXSLT 缺失或不可读抛出 InvalidArgumentException;引擎失败返回一个错误结果计时记录于 durationMs
SchematronValidator::runRules()string $xslPath, string $xmlPayload跨层级适配器;将错误发现映射为契约 RuleViolation 对象list<RuleViolation>validate()跳过 info 级别的发现
SchematronResult / SchematronFinding结论、发现、时长;getFailedAssertions()getSuccessfulReports()SchematronResult::error() 将引擎失败标记为无效
SchematronCacheInterface篡改检测缓存契约:getVerified()set()computeKey()在摘要不匹配时失败关闭
AtomicRenameSchematronCachestring $cacheDir, bool $atomicRename = true, LoggerInterface采用原子重命名写入、经 SHA-256 校验的文件缓存InvalidArgumentException, SchematronCacheException目录必须存在或可创建,且可写
VersionPinRegistryarray $pins, ?string $sourcePath经 SHA-256 锁定的规则包固定:loadFromLockFile()get()verifyArtefact()regenerateLockFile()锁文件 JSON 格式错误时抛出 VersionPinExceptionInvalidArgumentExceptionJsonException空白或格式错误的摘要失败关闭
InvoiceContractValidator?SemanticValidator跨层级 ValidatorInterface 适配器;结构预检加 EN 16931 深度语义规则ContractResult失败关闭;引擎错误以错误发现形式呈现在安装 nextpdf/premium 时绑定到框架路径
ZugferdContractEmbedderFacturXContractEmbedder跨层级 EmbedderInterface 适配器;字节进/字节出内嵌string(PDF 字节)传播委托失败委托给 Pro 层级的字节重写引擎
ZugferdEmbeddingException, PeppolEmbeddingException, SchematronCacheException, VersionPinException模块失败分类均继承自 RuntimeException
public static function basic(
PdfAManager $pdfAManager,
FileAttachment $fileAttachment,
string $xmlData,
): ZugferdEmbedResult
public function embed(
PdfAManager $pdfAManager,
FileAttachment $fileAttachment,
): ZugferdEmbedResult
public static function invoice(
PdfAManager $pdfAManager,
FileAttachment $fileAttachment,
string $ublXml,
): PeppolEmbedResult
public static function validate(
string $xmlData,
ZugferdProfile $profile,
?InvoiceValidatorMode $mode = null,
): InvoiceValidationResult
public function validate(string $xsltPath, string $xmlData): SchematronResult

内嵌。 ZugferdEmbedder 会将调用方提供的 ZUGFeRD 2.4 / Factur-X 1.08 UN/CEFACT CII XML 载荷附加到一个 PDF/A 载体上。它支持两种载体:PDF/A-4f(ISO 19005-4:2020),即首选的现代载体,以及为向后兼容而保留的 PDF/A-3b(ISO 19005-3:2012)。embed() 总是先运行一次 XmlGuard 安全检查,然后在未设置 withoutValidation() 时进行结构校验,接着验证载体支持内嵌文件,经由 ZugferdXmpSchema 注入 XMP 扩展 schema 声明,并将该 XML 作为关联文件附加。附件关系默认为规则手册推荐的 /Alternative;覆盖值会经过同一规则手册,该手册强制执行 ISO 32000-2:2020 §14.13 的关系集合与 EN 16931 发票子集。PeppolEmbedder 针对调用方提供的 Peppol BIS Billing 3.0 UBL 2.1 发票或贷项通知 XML 执行等效操作。两个内嵌器都不生成发票 XML。

校验。 InvoiceXmlValidator 会依照 EN 16931 结构预期检查 CII XML:根元素、必需的分节、表头基数、在配置文件要求处的行项目,以及由业务规则 BR-1 强制要求的 BT-24 规范标识符。InvoiceValidatorMode 用于选择严重程度。COMPAT(默认)会将缺失或不匹配的 BT-24 报告为警告,以免一个布尔有效性门槛发生回退。STRICT 会将其变为硬错误,并额外针对声明的 ZugferdProfile 断言配置文件一致性,对齐外部 KoSIT / Mustang 校验器的语义。该模式按以下顺序解析:显式参数,然后是 INVOICE_VALIDATOR_MODE 环境覆盖,最后是 COMPAT。结果是结构化的 InvoiceValidationResult / InvoiceValidationFinding 对象;该校验器返回发现而非抛出异常。

Schematron。 SchematronValidator 会执行预编译的 Schematron 规则集——即在构建时编译为 XSLT 的 CEN EN 16931 .sch 规则——使用进程内的 PHP XSLT 处理器。它会将 SVRL 报告解析为 SchematronFinding / SchematronResult 对象:失败的断言成为错误发现,成功的报告成为 info 发现。一个可选缓存(SchematronCacheInterface,带有原子重命名的文件实现)会依内容摘要加编译器版本为键,提供经校验的样式表字节。VersionPinRegistry 会将每个外部规则包固定到一个经 SHA-256 锁定的版本,并在发生漂移或摘要格式错误时失败关闭。

该模块生产并检查结构化发票数据。它断言任何文档是一份法律合规的发票、是经税务机关批准的,或保证会被任何机关受理。该校验器仅检查 EN 16931 语义模型以及 ZUGFeRD / Factur-X / UBL 容器;它排除各国扩展(例如意大利 SDI、法国 Chorus Pro、德国 XRechnung 传输)。正如 EN 16931-1 所述,发票开具方有责任满足相关立法的规则;这不是一个税务机关校验器。对某项标准的支持并不等于符合该标准。

  • 空 XML 会快速失败:builder 抛出 InvalidArgumentExceptionInvoiceXmlValidator::validate() 返回一个失败结果。
  • XmlGuard 会拒绝 DOCTYPE 声明、实体展开、超大载荷以及控制字符。内嵌器会将其以 ZugferdEmbeddingExceptionPeppolEmbeddingException 呈现,并保留原始原因。
  • withoutValidation()withoutSanitization() 绝不会绕过 XmlGuard 安全检查。仅结构性的业务术语检查可被跳过。
  • 不支持内嵌文件的载体(除 PDF/A-4f 或 PDF/A-3b 之外的任何载体)会引发 InvalidArgumentException,并指明可接受的版本。
  • 不被允许的 AFRelationship 取值会在 builder 边界处被拒绝;在 embed() 内部会再运行一次载体感知的规则手册再检查。
  • COMPAT 会将缺失的 BT-24 保持在警告严重程度;STRICT 会将缺失以及配置文件不匹配的 BT-24 取值变为硬错误。
  • SchematronValidator 仅在 XSLT 路径缺失或不可读时抛出。转换或 SVRL 解析失败会返回 isValid 为 false 的 SchematronResult::error()
  • 存储字节未通过摘要校验的缓存条目会被逐出,并从磁盘重新读取样式表;被污染的字节绝不会被返回。
  • XSLT 处理器在文件与网络资源加载被阻断的情况下运行,且从不注册 PHP 函数;document()xsl:includexsl:importresult-document 均无法加载资源。
  • VersionPinRegistry 会在摄入时与再生成时拒绝空白或格式错误的 SHA-256 摘要;verifyArtefact() 会返回 false,而非放行一个无法核实的固定。
  • 本模块不执行任何密码学签名;FIPS 模式行为不在此处范围内(参见 Signature 模块)。
行为参考状态
核心发票语义模型EN 16931-1:2026 §4依其构建;开具方仍负有责任
规范标识符(BT-24)EN 16931-1:2026 BR-1COMPAT 中为警告,STRICT 中为错误
UN/CEFACT CII 语法绑定CEN/TS 16931-3-3:2020支持内嵌
UBL 2.1 语法绑定CEN/TS 16931-3-2:2020支持内嵌
PDF/A-3 关联文件ISO 19005-3:2012 §6.7.8支持该载体
PDF/A-4f 内嵌文件ISO 19005-4:2020 Annex A支持该载体
关联文件关系取值ISO 32000-2:2020 §14.13受规则手册限制
Schematron / SVRL 报告解析ISO/IEC 19757-3依其构建(以产品为依据;该标准不在引用语料库中)

依其构建,而非认证或税务机关批准。NextPDF 未持有上述任何标准的认证。NextPDF 生产符合 EN 16931 数据模型的结构化发票并报告规则发现;它不生产法律合规的发票、不提供经税务机关批准的输出,也不保证受理。请咨询你的税务与法律顾问。

  • Schematron 引擎需要 ext-xsl PHP 扩展;预置并启用它是运营方的责任。
  • 处理在进程内本地完成。在内嵌或校验期间不发生任何对外网络调用。各国电子发票传输、清算平台与归档系统位于本模块之外。
  • 规则包在构建时从 .sch 编译为 XSLT;运行时仅执行预编译的样式表。
  • 缓存键会折入编译器版本盐值(当前为 nextpdf-schxslt-1.0);提升它会使已部署的缓存失效,而无需清除步骤。
  • 规则包固定存放在位于 enterprise/config/invoice-versions.lock 的锁文件中(VersionPinRegistry::DEFAULT_LOCK_PATH);CI 会针对固定的摘要校验已部署的工件。
  • 跨层级调用方使用 InvoiceContractValidatorZugferdContractEmbedder;层级原生的 Enterprise 调用方直接使用 ZugferdEmbedderInvoiceXmlValidator

本页仅记录外部可观察的行为以及受支持的公共 API 接口面。内部命名空间路径、辅助类、机制表、runbook 文件名与工单前缀不在范围内。