merge

package
v0.1.3 Latest Latest
Warning

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

Go to latest
Published: Sep 24, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

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 是签名处理方式,空值时使用 archive.SignaturePreserve。
	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
}

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