Help us shape the future of Go! Take the 2026 Go Developer Survey

merge

package
v0.1.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 21, 2026 License: Apache-2.0 Imports: 20 Imported by: 1

Documentation

Overview

Package merge 提供 OFD 文档的合并能力。

ZIP 级合并只重写 OFD.xml 与签名文件中的包内路径,把每个输入文档体 (DocBody)的目录树原样搬运到新的 Doc_N 目录,不解析或重写页面、资源 等内部 XML,因此改动最小、资源 ID 不需要重映射。被引用文件的字节保持 不变,签名摘要仍然有效;但签名值(SignedValue)本身覆盖了签名清单,重写 路径后需要重新签名。签名处理方式由 Options.Signatures 控制。

模型级合并(Pages)把多个文档体的页面解析为 creator 模型后重新生成一个 单文档 OFD,支持跨文档拼页,但需要重新编号文档级资源;页面级资源冲突会由 创建器报错。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Bytes

func Bytes(documents [][]byte, w io.Writer, options Options) error

Bytes 将 documents 中的每个 OFD 文档体合并为一个多文档 OFD 包并写入 w。 documents 为完整的 OFD 字节数据,已驻留内存。

func Files

func Files(paths []string, w io.Writer, options Options) error

Files 将 paths 指向的每个 OFD 文档体合并为一个多文档 OFD 包并写入 w。 输入文件按需读取、输出条目流式写入 w,适合较大的文档;即使只有一个输入 也会被重新打包为规范的多文档结构。

func Marshal

func Marshal(paths []string, options Options) ([]byte, error)

Marshal 合并 paths 指向的每个 OFD 文档体并返回完整 OFD 字节数据。

func Pages

func Pages(inputs []Source, w io.Writer, options PageOptions) error

Pages 把 inputs 中每个文档体的页面合并成一个单文档 OFD 并写入 w。

与 ZIP 级合并不同,模型级合并会把各源解析为 creator 模型后重新生成, 因此文档级资源(字体名、绘制参数名、图片/颜色空间/复合图元/模板 ID)会被 重新命名或编号,并同步改写引用。页面级资源保持原样,若跨源发生冲突会由 创建器报错。签名和版本不会保留;大纲、书签、动作和页面注解会保留,并按其 来源与最终页序重写跳转页索引,目标页未被保留的动作或注解会被丢弃。

func ParsePages

func ParsePages(spec string) ([]int, error)

ParsePages 解析 "1,3-5" 形式的全局页码表达式,返回从 1 开始的页序。

func Sources

func Sources(inputs []Source, w io.Writer, options Options) error

Sources 将每个 Source 的 OFD 文档体合并为一个多文档 OFD 包并写入 w。 每个 Source 的 Path、Data、Reader 必须且只能设置一个。

Types

type Limits

type Limits = creator.Limits

Limits 限制合并输入的规模,避免恶意或异常文档造成的解压放大。

type Options

type Options struct {
	// Compression 是输出 ZIP 的压缩策略,空值时使用 creator.CompressionAuto。
	Compression creator.CompressionMode
	// CompressionLevel 是 DEFLATE 压缩级别,0 使用默认级别 5,显式范围
	// 1(最快)到 9(最紧凑)。仅对实际使用 Deflate 的条目生效。
	CompressionLevel int
	// Deterministic 使用固定 ZIP 时间,生成可复现的合并结果。
	Deterministic bool
	// Signatures 是签名处理方式,空值时使用 creator.SignaturePreserve。
	// preserve 无法保持签名路径或受保护文件字节不变时返回错误。
	Signatures creator.SignatureMode
	// Orphans 是文档目录之外条目的处理方式,空值时使用 OrphanError。
	Orphans OrphanMode
	// Limits 限制合并输入的规模,零值使用默认限制。
	Limits Limits
	// OnWarning 可选,接收合并过程中的非致命提示,例如签名被重写后签名值失效。
	OnWarning func(string)
	// OnSignature 可选,接收每个输入签名的处理结果。
	OnSignature func(SignatureEvent)
}

Options 控制 ZIP 级合并的输出方式。

type OrphanMode

type OrphanMode string

OrphanMode 控制文档目录之外的条目如何处理。

const (
	// OrphanError 在存在文档目录之外的条目时返回错误。空值等同于此模式。
	OrphanError OrphanMode = "error"
	// OrphanIgnore 跳过文档目录之外的条目。
	OrphanIgnore OrphanMode = "ignore"
	// OrphanPreserve 把文档目录之外的条目按原路径保留到输出包根目录。
	OrphanPreserve OrphanMode = "preserve"
)

type PageLimits

type PageLimits struct {
	// MaxInputBytes 是单个输入 OFD 的最大字节数,0 表示默认 512MB。
	MaxInputBytes int64
	// MaxTotalBytes 是所有输入 OFD 的总字节数上限,0 表示默认 1GB。
	MaxTotalBytes int64
	// MaxPages 是输出合并文档的最大页数,0 表示默认 100000。
	MaxPages int
}

PageLimits 限制模型级合并的输入规模。

type PageOptions

type PageOptions struct {
	// Compression 是输出 ZIP 的压缩策略,空值时使用 creator.CompressionAuto。
	Compression creator.CompressionMode
	// CompressionLevel 是 DEFLATE 压缩级别,0 使用默认级别 5,显式范围
	// 1(最快)到 9(最紧凑)。仅对实际使用 Deflate 的条目生效。
	CompressionLevel int
	// Deterministic 使用固定 ZIP 时间,生成可复现的合并结果。
	Deterministic bool
	// Pages 指定输出页序,元素为按输入顺序拼接后的 1 起始全局页码;为空时输出
	// 全部页面。允许重复与重排,越界会返回错误。与 Selectors 互斥。
	Pages []int
	// Selectors 按来源选页,元素为 1 起始的来源序号与该来源内 1 起始的页码;
	// Source 为 0 表示全局页序。与 Pages 互斥。
	Selectors []PageSelector
	// Limits 限制输入字节数与输出页数,零值使用默认限制。
	Limits PageLimits
	// Concurrency 是并行解析/转换输入的并发数,0 表示默认 4,1 表示串行。
	Concurrency int
	// OnSignature 可选,接收每个输入签名在模型级合并中被丢弃的结果。
	OnSignature func(SignatureEvent)
	// ID、Title、Author、Subject 可选覆盖输出文档元数据;为空时沿用首个来源。
	ID      string
	Title   string
	Author  string
	Subject string
}

PageOptions 控制模型级页面合并的输出方式。

type PageSelector

type PageSelector struct {
	Source int
	Pages  []int
}

PageSelector 选择某个来源的页面。Source 是 1 起始的输入序号,0 表示全局页序; Pages 是 1 起始的页码,Source 非 0 时相对该来源的第一页,为空表示该来源全部页面。

func ParsePageSelection

func ParsePageSelection(spec string) ([]PageSelector, error)

ParsePageSelection 解析选页表达式,支持全局页序与按来源选择:

"1,3-5"          全局页序(拼接后从 1 开始)
"s1:1,3-5;s2:2"  第 1 个输入的第 1、3、4、5 页,再第 2 个输入的第 2 页

来源序号从 1 开始,按输入(`-i`/位置参数)顺序编号;空串返回空选择。

type SignatureAction

type SignatureAction string

SignatureAction 描述合并过程对某个签名采取的动作。

const (
	// SignaturePreserved 表示签名文件字节原样保留。
	SignaturePreserved SignatureAction = "preserved"
	// SignatureRewritten 表示签名文件中的包内路径被重写,签名值会失效。
	SignatureRewritten SignatureAction = "rewritten"
	// SignatureDropped 表示签名被丢弃。
	SignatureDropped SignatureAction = "dropped"
)

type SignatureEvent

type SignatureEvent struct {
	// Input 是来源名称,文件输入时为路径。
	Input string
	// DocumentIndex 是文档体索引,从 0 开始。
	DocumentIndex int
	// ID 是签名标识或签名文件路径。
	ID string
	// Action 是对该签名的处理动作。
	Action SignatureAction
}

SignatureEvent 描述某个输入签名的处理结果。

type SignatureStatus

type SignatureStatus struct {
	// ID 是签名标识。
	ID string
	// DigestValid 仅表示签名引用与数据摘要匹配,不包含算法一致性与保护范围检查。
	DigestValid bool
	// Verified 表示 SM2/SES 密码学签名验证通过。
	Verified bool
	// VerificationError 是密码学验证的错误信息。
	VerificationError string
	// Validation 是完整验签结论;只有 Status 为 valid 才表示完整通过。
	Validation *parser.SignatureValidation
}

SignatureStatus 描述输出文档中一个签名的校验状态。

func VerifySignatures

func VerifySignatures(input any) ([]SignatureStatus, error)

VerifySignatures 解析 OFD 并汇总每个签名的摘要与密码学验证状态。 input 支持文件路径、字节数据或 io.Reader。

type Source

type Source struct {
	Name   string
	Path   string
	Data   []byte
	Reader io.ReaderAt
	Size   int64
}

Source 描述一个可整体读取的 OFD 输入。Path、Data、Reader 必须且只能设置一个:

  • Path 为文件路径,按需读取,内存占用最低;
  • Data 为完整 OFD 字节数据;
  • Reader 为随机访问的数据源,必须同时设置正数 Size,可避免整体复制到内存。

Name 是可选的输入标识,用于错误信息。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL