feat(命名空间): 规范声明顺序,修复命名空间
build.yaml / build (push) Successful in 49s

This commit is contained in:
xiaoqidun committed 2026-10-12 11:20:30 +08:00
1 parent 17a9a03361
commit c4b81155a9
19 files changed
+410 -142

No files matched your search

+37 -6
View File
@@ -62,6 +62,27 @@ type Reader struct {
encryption *encryptionState
}
// documentPageList 仅读取文档中的页面索引,统计页数时不构建其他结构
type documentPageList struct {
Pages Pages
}
// UnmarshalXML 按文档命名空间读取页面列表,跳过其他文档结构和扩展
// 入参: d XML解码器, start 起始节点
// 返回: error 解析错误
func (list *documentPageList) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
if start.Name.Local != "Document" {
return fmt.Errorf("expected Document root, got %s", start.Name.Local)
}
*list = documentPageList{}
return decodeOFDChildren(d, start, func(d *xml.Decoder, node xml.StartElement) error {
if node.Name.Local == "Pages" {
return d.DecodeElement(&list.Pages, &node)
}
return d.Skip()
})
}
// Close 关闭阅读器持有的文件,重复调用不再关闭底层文件
// 返回: error 错误信息
func (r *Reader) Close() error {
@@ -117,10 +138,7 @@ func (r *Reader) DocumentPageCountContext(ctx context.Context, index int) (int,
if err != nil {
return 0, err
}
var doc struct {
XMLName xml.Name `xml:"Document"`
Pages Pages `xml:"Pages"`
}
var doc documentPageList
decoder := xml.NewDecoder(imageInput{ReadCloser: io.NopCloser(bytes.NewReader(data)), context: ctx})
if err := decoder.Decode(&doc); err != nil {
return 0, fmt.Errorf("failed to unmarshal document.xml: %w", err)
@@ -1003,6 +1021,7 @@ func (r *Reader) readPageHeaderContext(ctx context.Context, page Page) (PageCont
defer f.Close()
var content PageContent
d := xml.NewDecoder(imageInput{ReadCloser: f, context: ctx})
var root xml.Name
scan:
for {
if err := ctx.Err(); err != nil {
@@ -1016,9 +1035,21 @@ scan:
return PageContent{}, err
}
if start, ok := token.(xml.StartElement); ok {
switch start.Name.Local {
case "Page":
if root.Local == "" {
if start.Name.Local != "Page" {
return PageContent{}, fmt.Errorf("expected Page root, got %s", start.Name.Local)
}
root = start.Name
continue
}
if !ofdXMLChild(root, start.Name) {
if err := d.Skip(); err != nil {
return PageContent{}, err
}
continue
}
start = ofdXMLStart(start)
switch start.Name.Local {
case "Template":
var template Template
if err := d.DecodeElement(&template, &start); err != nil {