From 225f60919b635bddf0c610e775d19928efcf0c7f Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sun, 11 Oct 2026 21:12:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=8F=82=E7=85=A7=E6=A0=87=E5=87=86):=20?= =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=8C=85=E5=86=85=E8=B7=AF=E5=BE=84=E4=B8=8E?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_editor_annot_ops.go | 2 +- ofdgo_editor_import.go | 15 +++++++-------- ofdgo_editor_pages.go | 18 ++++++++++-------- ofdgo_reader.go | 19 +++++++++---------- ofdgo_sign.go | 4 ++-- ofdgo_writer.go | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/ofdgo_editor_annot_ops.go b/ofdgo_editor_annot_ops.go index 62d2c17..028c044 100644 --- a/ofdgo_editor_annot_ops.go +++ b/ofdgo_editor_annot_ops.go @@ -63,7 +63,7 @@ func (e *Editor) CaptureAnnotations(page int, ids []string) (*AnnotationSelectio if e.originalPage(page) { origin := e.source.pages[e.pages[page].ID] for _, name := range content.PageRes { - selection.resources = append(selection.resources, e.source.reader.ResPath(resolveResourcePath(origin.ref.BaseLoc, "", name))) + selection.resources = append(selection.resources, resolveResourcePath(e.source.reader.ResPath(origin.ref.BaseLoc), "", name)) } } return selection, nil diff --git a/ofdgo_editor_import.go b/ofdgo_editor_import.go index 957a16a..b3cfe04 100644 --- a/ofdgo_editor_import.go +++ b/ofdgo_editor_import.go @@ -857,17 +857,16 @@ func (m *editorPageImport) documentReference(group, kind, source, id, loc string return nil, fmt.Errorf("missing %s reference %q", kind, source) } -// resolve 按所在XML解析包内路径,兼容阅读器接受的文档相对路径 +// resolve 按所在XML和资源基准目录解析包内路径 // 入参: name 所在XML, base 资源目录, value 路径值 // 返回: string 包内路径, error 错误信息 func (m *editorPageImport) resolve(name, base, value string) (string, error) { - for _, candidate := range []string{resolveResourcePath(name, base, value), m.reader.ResPath(value)} { - if m.reader.files[candidate] != nil { - return candidate, nil - } - if file, ok := m.reader.packageFile(candidate); ok { - return cleanPackagePath(file.Name), nil - } + candidate := resolveResourcePath(name, base, value) + if _, ok := m.reader.files[candidate]; ok { + return candidate, nil + } + if file, ok := m.reader.packageFile(candidate); ok { + return cleanPackagePath(file.Name), nil } return "", fmt.Errorf("import reference %q in %s not found", value, name) } diff --git a/ofdgo_editor_pages.go b/ofdgo_editor_pages.go index 205135f..9e57cbf 100644 --- a/ofdgo_editor_pages.go +++ b/ofdgo_editor_pages.go @@ -213,17 +213,19 @@ func pruneCreatedPageReferences(data []byte, removed map[string]bool) ([]byte, e return editorPatchXML(data, patches), nil } -// editorPageLocation 解析标准XML引用,优先使用所在文件的相对路径 +// editorPageLocation 按所在XML解析引用,绝对路径以包根目录为基准 // 入参: reader 原包, parts 覆盖条目, name 所在XML, value 路径 // 返回: string 包内路径, error 路径不存在 func editorPageLocation(reader *Reader, parts map[string][]byte, name, value string) (string, error) { - for _, candidate := range []string{resolveResourcePath(name, "", value), reader.ResPath(value)} { - if _, ok := parts[candidate]; ok || reader.files[candidate] != nil { - return candidate, nil - } - if file, ok := reader.packageFile(candidate); ok { - return cleanPackagePath(file.Name), nil - } + candidate := resolveResourcePath(name, "", value) + if _, ok := parts[candidate]; ok { + return candidate, nil + } + if _, ok := reader.files[candidate]; ok { + return candidate, nil + } + if file, ok := reader.packageFile(candidate); ok { + return cleanPackagePath(file.Name), nil } return "", fmt.Errorf("page reference %q in %s not found", value, name) } diff --git a/ofdgo_reader.go b/ofdgo_reader.go index 6ebab8d..9856541 100644 --- a/ofdgo_reader.go +++ b/ofdgo_reader.go @@ -282,7 +282,7 @@ func (r *Reader) PageArea(page Page) (PageArea, error) { return r.resolvePageArea(content.Area, content.Template) } -// ResPath 获取资源的完整路径 +// ResPath 按当前文档目录解析ST_Loc,包内绝对路径以根目录为基准 // 入参: resLink 资源链接 // 返回: string 完整路径 func (r *Reader) ResPath(resLink string) string { @@ -299,10 +299,7 @@ func (r *Reader) ResPath(resLink string) string { } resLink = path.Clean(resLink) rootDir := strings.TrimPrefix(strings.ReplaceAll(r.RootDir, "\\", "/"), "/") - if rootDir != "" && (resLink == rootDir || strings.HasPrefix(resLink, rootDir+"/")) { - return resLink - } - return cleanPackagePath(path.Join(r.RootDir, resLink)) + return cleanPackagePath(path.Join(rootDir, resLink)) } // ResData 获取资源文件数据 @@ -443,6 +440,7 @@ func (r *Reader) AttachmentData(id string) ([]byte, error) { } // CustomTags 获取自定义标引 +// 返回的文件路径可直接传入ResData读取 // 返回: []CustomTag 自定义标引列表, error 错误信息 func (r *Reader) CustomTags() ([]CustomTag, error) { doc, err := r.Doc() @@ -457,8 +455,8 @@ func (r *Reader) CustomTags() ([]CustomTag, error) { } for i := range customTags.CustomTag { tag := &customTags.CustomTag[i] - tag.SchemaLoc = resolveResourcePath(partPath, "", tag.SchemaLoc) - tag.FileLoc = resolveResourcePath(partPath, "", tag.FileLoc) + tag.SchemaLoc = r.resourceLocation(partPath, "", tag.SchemaLoc) + tag.FileLoc = r.resourceLocation(partPath, "", tag.FileLoc) } if customTags.CustomTag == nil { customTags.CustomTag = []CustomTag{} @@ -482,6 +480,7 @@ func (r *Reader) CustomDatas() ([]CustomData, error) { } // Extensions 获取扩展项 +// 返回的文件路径可直接传入ResData读取 // 返回: []Extension 扩展项列表, error 错误信息 func (r *Reader) Extensions() ([]Extension, error) { doc, err := r.Doc() @@ -497,7 +496,7 @@ func (r *Reader) Extensions() ([]Extension, error) { for i := range extensions.Extension { extension := &extensions.Extension[i] for j := range extension.ExtendData { - extension.ExtendData[j] = resolveResourcePath(partPath, "", extension.ExtendData[j]) + extension.ExtendData[j] = r.resourceLocation(partPath, "", extension.ExtendData[j]) } } if extensions.Extension == nil { @@ -866,7 +865,7 @@ func (r *Reader) readPageContent(page Page, textOnly, template bool) (*PageConte content.Template = nil } for _, res := range content.PageRes { - r.loadRes(resolveResourcePath(page.BaseLoc, "", res)) + r.loadRes("/" + resolveResourcePath(fullPath, "", res)) } content.Area, err = r.resolvePageArea(content.Area, content.Template) if err != nil { @@ -883,7 +882,7 @@ func (r *Reader) loadPageResources(page Page) { return } for _, res := range header.PageRes { - r.loadRes(resolveResourcePath(page.BaseLoc, "", res)) + r.loadRes("/" + resolveResourcePath(r.ResPath(page.BaseLoc), "", res)) } } diff --git a/ofdgo_sign.go b/ofdgo_sign.go index a61565d..5dee1da 100644 --- a/ofdgo_sign.go +++ b/ofdgo_sign.go @@ -200,13 +200,13 @@ func (r *Reader) parseSignatures(doc *Document) error { var sealData []byte if sigFile.SignedInfo.Seal.BaseLoc != "" { sealPath := resolveResourcePath(sigPath, "", sigFile.SignedInfo.Seal.BaseLoc) - if data, err := r.ResData(sealPath); err == nil { + if data, err := r.readFile(sealPath); err == nil { sealType, sealData = extractSeal(data) } } if len(sealData) == 0 && sigFile.SignedValue != "" { signedValuePath := resolveResourcePath(sigPath, "", sigFile.SignedValue) - if data, err := r.ResData(signedValuePath); err == nil { + if data, err := r.readFile(signedValuePath); err == nil { if sig, err := parseSESSignature(data); err == nil { sealType, sealData = sig.Seal.PicType, sig.Seal.PicData } else { diff --git a/ofdgo_writer.go b/ofdgo_writer.go index c1c19a6..23e2d38 100644 --- a/ofdgo_writer.go +++ b/ofdgo_writer.go @@ -555,7 +555,7 @@ func (e *Editor) usedResources() (fonts, images []editorResource, spaces []Color } if origin := e.objectOrigin(editorObjectID(object)); origin != nil && origin.page != nil && (!exists || before.Type != object.Type || !reflect.DeepEqual(before.CompositeGraphicUnit, object.CompositeGraphicUnit)) { for _, name := range origin.page.original.PageRes { - files[e.source.reader.ResPath(resolveResourcePath(origin.page.ref.BaseLoc, "", name))] = true + files[resolveResourcePath(e.source.reader.ResPath(origin.page.ref.BaseLoc), "", name)] = true } } }