feat(转换服务): 修复异常注解转换中断
build.yaml / build (push) Successful in 50s

This commit is contained in:
xiaoqidun committed 2026-09-30 23:46:30 +08:00
1 parent c5867b0948
commit e5993aed24
6 files changed
+325 -72

No files matched your search

+23 -68
View File
@@ -17,9 +17,8 @@ package ofdgo
import (
"context"
"fmt"
"maps"
"strconv"
"strings"
"time"
"github.com/xiaoqidun/pdfgo"
)
@@ -39,6 +38,14 @@ func (p *pdfImporter) appearanceAnnotation(ctx context.Context, page *pdfgo.Page
return &pdfgo.UnsupportedError{Feature: fmt.Sprintf("annotation field %q", key)}
}
}
remark, err := p.reader.ReadAnnotationText(annotation, "Contents", p.warning)
if err != nil {
return err
}
if annotation.Subtype == "FreeText" {
annotation.Dictionary = maps.Clone(annotation.Dictionary)
annotation.Dictionary["Contents"] = pdfgo.String("\xef\xbb\xbf" + remark)
}
flags := int64(0)
if value := annotation.Dictionary["F"]; value != nil {
resolved, err := p.reader.Resolve(value)
@@ -95,7 +102,7 @@ func (p *pdfImporter) appearanceAnnotation(ctx context.Context, page *pdfgo.Page
if flags&(2|32) == 0 {
p.compositeNodes = stamp.compositeNodes
}
converted := Annotation{Type: pdfAnnotationType(annotation.Subtype), Subtype: string(annotation.Subtype), Appearance: Appearance{Boundary: pdfBoundary(box), Objects: stamp.objects}}
converted := Annotation{Type: pdfAnnotationType(annotation.Subtype), Subtype: string(annotation.Subtype), Remark: remark, Appearance: Appearance{Boundary: pdfBoundary(box), Objects: stamp.objects}}
if annotation.Subtype == "Text" {
value, err := p.reader.Resolve(annotation.Dictionary["Open"])
if err != nil {
@@ -129,80 +136,28 @@ func (p *pdfImporter) appearanceAnnotation(ctx context.Context, page *pdfgo.Page
region.Fill, region.Stroke, region.Actions = &no, &no, actions
converted.Appearance.Objects = append(converted.Appearance.Objects, GraphicObject{Type: "PathObject", PathObject: region})
}
if value, err := p.reader.Resolve(annotation.Dictionary["Contents"]); err != nil {
return err
} else if value != nil {
contents, ok := value.(pdfgo.String)
if !ok {
return fmt.Errorf("invalid PDF annotation contents")
}
converted.Remark, err = pdfgo.DecodeTextString(contents)
if err != nil {
return err
}
}
if flags&(2|32) != 0 {
visible := false
converted.Visible = &visible
}
converted.NoZoom = flags&8 != 0 || annotation.Subtype == "Text"
converted.NoRotate = flags&16 != 0 || annotation.Subtype == "Text"
if value := annotation.Dictionary["T"]; value != nil {
resolved, err := p.reader.Resolve(value)
if err != nil {
return err
}
creator, ok := resolved.(pdfgo.String)
if !ok {
return fmt.Errorf("invalid PDF annotation creator")
}
converted.Creator, err = pdfgo.DecodeTextString(creator)
if err != nil {
return err
}
converted.Creator, err = p.reader.ReadAnnotationText(annotation, "T", p.warning)
if err != nil {
return err
}
if value := annotation.Dictionary["M"]; value != nil {
resolved, err := p.reader.Resolve(value)
if err != nil {
return err
modified, err := p.reader.ReadAnnotationText(annotation, "M", p.warning)
if err != nil {
return err
}
if modified != "" {
if date, err := pdfgo.ParseDate(modified); err == nil && date.Year() > 0 {
converted.LastModDate = date.Format("2006-01-02")
}
encoded, ok := resolved.(pdfgo.String)
if !ok {
return fmt.Errorf("invalid PDF annotation modification date")
}
date, err := pdfgo.DecodeTextString(encoded)
if err != nil {
return err
}
date = strings.TrimPrefix(date, "D:")
if len(date) < 4 {
return fmt.Errorf("invalid PDF annotation modification date")
}
year, err := strconv.Atoi(date[:4])
if err != nil {
return fmt.Errorf("invalid PDF annotation modification date: %w", err)
}
month, day := 1, 1
if len(date) >= 6 {
month, err = strconv.Atoi(date[4:6])
if err != nil {
return fmt.Errorf("invalid PDF annotation modification month: %w", err)
}
}
if len(date) >= 8 {
day, err = strconv.Atoi(date[6:8])
if err != nil {
return fmt.Errorf("invalid PDF annotation modification day: %w", err)
}
}
parsed := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
if parsed.Year() != year || int(parsed.Month()) != month || parsed.Day() != day {
return fmt.Errorf("invalid PDF annotation modification date")
}
converted.LastModDate = parsed.Format("2006-01-02")
if len(date) > 8 {
p.report.Warnings = append(p.report.Warnings, pdfgo.Diagnostic{Page: p.page + 1, Message: "PDF annotation modification time cannot fit OFD annotation date"})
if converted.Parameters == nil {
converted.Parameters = &AnnotationParameters{}
}
converted.Parameters.Parameter = append(converted.Parameters.Parameter, AnnotationParameter{Name: "PDF.M", Value: modified})
}
if _, err := p.editor.AddAnnotation(p.page, converted); err != nil {
return fmt.Errorf("PDF annotation: %w", err)