feat(字体路径): 优化回退字体路径

This commit is contained in:
2026-02-28 10:57:51 +08:00
parent d72614b5b8
commit 50fa73c218
3 changed files with 47 additions and 36 deletions
+7 -6
View File
@@ -36,6 +36,7 @@ type Reader struct {
compositeGraphicUnitCache map[string]*CompositeGraphicUnit compositeGraphicUnitCache map[string]*CompositeGraphicUnit
doc *Document doc *Document
Stamps map[string][]Stamp Stamps map[string][]Stamp
fileIndex map[string]*zip.File
} }
// Close 关闭阅读器 // Close 关闭阅读器
@@ -50,6 +51,10 @@ func (r *Reader) Close() error {
// initRoot 读取根节点信息 // initRoot 读取根节点信息
// 返回: error 错误信息 // 返回: error 错误信息
func (r *Reader) initRoot() error { func (r *Reader) initRoot() error {
r.fileIndex = make(map[string]*zip.File)
for _, f := range r.Zip.File {
r.fileIndex[f.Name] = f
}
data, err := r.readFile("OFD.xml") data, err := r.readFile("OFD.xml")
if err != nil { if err != nil {
return fmt.Errorf("failed to read ofd.xml: %w", err) return fmt.Errorf("failed to read ofd.xml: %w", err)
@@ -72,11 +77,9 @@ func (r *Reader) initRoot() error {
func (r *Reader) readFile(name string) ([]byte, error) { func (r *Reader) readFile(name string) ([]byte, error) {
name = strings.ReplaceAll(name, "\\", "/") name = strings.ReplaceAll(name, "\\", "/")
name = strings.TrimPrefix(name, "/") name = strings.TrimPrefix(name, "/")
for _, f := range r.Zip.File { if f, ok := r.fileIndex[name]; ok {
if f.Name == name {
return readZipFile(f) return readZipFile(f)
} }
}
return nil, fmt.Errorf("file not found: %s", name) return nil, fmt.Errorf("file not found: %s", name)
} }
@@ -86,11 +89,9 @@ func (r *Reader) readFile(name string) ([]byte, error) {
func (r *Reader) openFile(name string) (io.ReadCloser, error) { func (r *Reader) openFile(name string) (io.ReadCloser, error) {
name = strings.ReplaceAll(name, "\\", "/") name = strings.ReplaceAll(name, "\\", "/")
name = strings.TrimPrefix(name, "/") name = strings.TrimPrefix(name, "/")
for _, f := range r.Zip.File { if f, ok := r.fileIndex[name]; ok {
if f.Name == name {
return f.Open() return f.Open()
} }
}
return nil, fmt.Errorf("file not found: %s", name) return nil, fmt.Errorf("file not found: %s", name)
} }
+15 -6
View File
@@ -23,6 +23,7 @@ import (
"io/fs" "io/fs"
"math" "math"
"path/filepath" "path/filepath"
"runtime"
"strconv" "strconv"
"strings" "strings"
@@ -777,18 +778,26 @@ func (r *Renderer) loadFont(fontID string) *canvas.FontFamily {
return ff return ff
} }
} }
winFontDir := `C:\Windows\Fonts` var sysFontDir string
matches := r.globFontFiles(winFontDir, "*"+targetName+"*") switch runtime.GOOS {
case "linux":
sysFontDir = `/usr/share/fonts`
case "darwin":
sysFontDir = `/Library/Fonts`
default:
sysFontDir = `C:\Windows\Fonts`
}
matches := r.globFontFiles(sysFontDir, "*"+targetName+"*")
if len(matches) == 0 { if len(matches) == 0 {
switch targetName { switch targetName {
case "SimSun": case "SimSun":
matches = r.globFontFiles(winFontDir, "simsun.ttc") matches = r.globFontFiles(sysFontDir, "simsun.ttc")
case "KaiTi": case "KaiTi":
matches = r.globFontFiles(winFontDir, "simkai.ttf") matches = r.globFontFiles(sysFontDir, "simkai.ttf")
case "SimHei": case "SimHei":
matches = r.globFontFiles(winFontDir, "simhei.ttf") matches = r.globFontFiles(sysFontDir, "simhei.ttf")
case "FangSong": case "FangSong":
matches = r.globFontFiles(winFontDir, "simfang.ttf") matches = r.globFontFiles(sysFontDir, "simfang.ttf")
} }
} }
for _, m := range matches { for _, m := range matches {
+6 -5
View File
@@ -71,21 +71,21 @@ func (r *Reader) parseSignatures(doc *Document) error {
return err return err
} }
for _, sigRef := range signatures.List { for _, sigRef := range signatures.List {
func(sigRef OFDSignature) {
sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc) sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc)
sf, err := r.openFile(sigPath) sf, err := r.openFile(sigPath)
if err != nil { if err != nil {
continue return
} }
defer sf.Close()
var sigFile SignatureFile var sigFile SignatureFile
if err := xml.NewDecoder(sf).Decode(&sigFile); err != nil { if err := xml.NewDecoder(sf).Decode(&sigFile); err != nil {
sf.Close() return
continue
} }
sf.Close()
signedValuePath := path.Join(path.Dir(sigPath), sigFile.SignedValue) signedValuePath := path.Join(path.Dir(sigPath), sigFile.SignedValue)
svData, err := r.ResData(signedValuePath) svData, err := r.ResData(signedValuePath)
if err != nil { if err != nil {
continue return
} }
sealType, sealData := extractSeal(svData) sealType, sealData := extractSeal(svData)
for _, annot := range sigFile.SignedInfo.StampAnnot { for _, annot := range sigFile.SignedInfo.StampAnnot {
@@ -93,6 +93,7 @@ func (r *Reader) parseSignatures(doc *Document) error {
bbox, _ := ParseBox(annot.Boundary) bbox, _ := ParseBox(annot.Boundary)
r.addStamp(pageID, bbox, sealType, sealData) r.addStamp(pageID, bbox, sealType, sealData)
} }
}(sigRef)
} }
return nil return nil
} }