From 7bce7019072c9ce21f6b10290079837546b71265 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Mon, 12 Oct 2026 16:39:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=8E=8B=E7=BC=A9=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=89=88=E6=9C=AC=E5=8E=8B=E7=BC=A9=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B5=84=E6=BA=90=E6=89=AB=E6=8F=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_compression.go | 8 ++++++-- ofdgo_compression_images.go | 6 ++++++ ofdgo_version_edit.go | 14 +++++++++++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ofdgo_compression.go b/ofdgo_compression.go index ea3043a..393e251 100644 --- a/ofdgo_compression.go +++ b/ofdgo_compression.go @@ -166,7 +166,7 @@ func (e *Editor) outputSnapshot(ctx context.Context, options WriteOptions) (*Edi return &snapshot, nil } -// compressionImageSafety 保护蒙版及其原图和替换图像,不完整的文档结构不参与降采样 +// compressionImageSafety 按当前入口保护蒙版及其原图和替换图像,不完整的文档结构不参与降采样 // 入参: ctx 取消上下文, images 图片资源 // 返回: map[string]bool 只能无损处理的资源路径, bool 是否可分析尺寸, error 读取或取消错误 func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo) (map[string]bool, bool, error) { @@ -174,7 +174,11 @@ func (r *Reader) compressionImageSafety(ctx context.Context, images []ImageInfo) safe := true structured := len(r.OFD.DocBody) != 0 if structured { - dependencies, structures, err := r.documentDependencies(ctx, r.DocumentIndex()) + entry, err := r.DocumentRootContext(ctx) + if err != nil { + return nil, false, err + } + dependencies, structures, err := r.versionDependencies(ctx, entry, nil, nil) if err != nil { if ctx.Err() != nil { return nil, false, ctx.Err() diff --git a/ofdgo_compression_images.go b/ofdgo_compression_images.go index a0f6d6d..502493c 100644 --- a/ofdgo_compression_images.go +++ b/ofdgo_compression_images.go @@ -61,6 +61,12 @@ func (r *Reader) compressionImagePlan(ctx context.Context, options CompressionOp } return nil, nil, err } + if len(catalog) == 0 { + if document != r { + document.Close() + } + continue + } var demands map[string]image.Point masks, geometry, err := document.compressionImageSafety(ctx, catalog) if err == nil && geometry { diff --git a/ofdgo_version_edit.go b/ofdgo_version_edit.go index 4ee5602..d693327 100644 --- a/ofdgo_version_edit.go +++ b/ofdgo_version_edit.go @@ -50,6 +50,14 @@ type versionEditGraph struct { // 入参: ctx 取消上下文, entry 文档入口, parts 待修改条目, generated 本次自产页面及引用 // 返回: map[string]bool 引用路径, error 读取、结构或取消错误 func (r *Reader) versionFileDependencies(ctx context.Context, entry string, parts map[string][]byte, generated map[string]editorGeneratedReferences) (map[string]bool, error) { + used, _, err := r.versionDependencies(ctx, entry, parts, generated) + return used, err +} + +// versionDependencies 从指定入口汇总文件依赖和结构文件,不混入其他版本或读取二进制资源 +// 入参: ctx 取消上下文, entry 文档入口, parts 待修改条目, generated 本次自产页面及引用 +// 返回: map[string]bool 全部依赖, map[string]bool 结构文件, error 读取、结构或取消错误 +func (r *Reader) versionDependencies(ctx context.Context, entry string, parts map[string][]byte, generated map[string]editorGeneratedReferences) (map[string]bool, map[string]bool, error) { view := *r if len(parts) != 0 { view.files = maps.Clone(r.files) @@ -70,7 +78,7 @@ func (r *Reader) versionFileDependencies(ctx context.Context, entry string, part } for len(queue) != 0 { if err := ctx.Err(); err != nil { - return nil, err + return nil, nil, err } name := queue[0] queue = queue[1:] @@ -78,10 +86,10 @@ func (r *Reader) versionFileDependencies(ctx context.Context, entry string, part continue } if err := view.documentFileReferences(ctx, name, false, add); err != nil { - return nil, err + return nil, nil, err } } - return used, ctx.Err() + return used, queued, ctx.Err() } // versionEditGraph 流式建立标准文件依赖图,不保留完整XML节点树或解压后的原包文件