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
+9 -8
View File
@@ -36,6 +36,7 @@ type Reader struct {
compositeGraphicUnitCache map[string]*CompositeGraphicUnit
doc *Document
Stamps map[string][]Stamp
fileIndex map[string]*zip.File
}
// Close 关闭阅读器
@@ -50,6 +51,10 @@ func (r *Reader) Close() error {
// 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")
if err != nil {
return fmt.Errorf("failed to read ofd.xml: %w", err)
@@ -72,10 +77,8 @@ func (r *Reader) initRoot() error {
func (r *Reader) readFile(name string) ([]byte, error) {
name = strings.ReplaceAll(name, "\\", "/")
name = strings.TrimPrefix(name, "/")
for _, f := range r.Zip.File {
if f.Name == name {
return readZipFile(f)
}
if f, ok := r.fileIndex[name]; ok {
return readZipFile(f)
}
return nil, fmt.Errorf("file not found: %s", name)
}
@@ -86,10 +89,8 @@ func (r *Reader) readFile(name string) ([]byte, error) {
func (r *Reader) openFile(name string) (io.ReadCloser, error) {
name = strings.ReplaceAll(name, "\\", "/")
name = strings.TrimPrefix(name, "/")
for _, f := range r.Zip.File {
if f.Name == name {
return f.Open()
}
if f, ok := r.fileIndex[name]; ok {
return f.Open()
}
return nil, fmt.Errorf("file not found: %s", name)
}
+15 -6
View File
@@ -23,6 +23,7 @@ import (
"io/fs"
"math"
"path/filepath"
"runtime"
"strconv"
"strings"
@@ -777,18 +778,26 @@ func (r *Renderer) loadFont(fontID string) *canvas.FontFamily {
return ff
}
}
winFontDir := `C:\Windows\Fonts`
matches := r.globFontFiles(winFontDir, "*"+targetName+"*")
var sysFontDir string
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 {
switch targetName {
case "SimSun":
matches = r.globFontFiles(winFontDir, "simsun.ttc")
matches = r.globFontFiles(sysFontDir, "simsun.ttc")
case "KaiTi":
matches = r.globFontFiles(winFontDir, "simkai.ttf")
matches = r.globFontFiles(sysFontDir, "simkai.ttf")
case "SimHei":
matches = r.globFontFiles(winFontDir, "simhei.ttf")
matches = r.globFontFiles(sysFontDir, "simhei.ttf")
case "FangSong":
matches = r.globFontFiles(winFontDir, "simfang.ttf")
matches = r.globFontFiles(sysFontDir, "simfang.ttf")
}
}
for _, m := range matches {
+23 -22
View File
@@ -71,28 +71,29 @@ func (r *Reader) parseSignatures(doc *Document) error {
return err
}
for _, sigRef := range signatures.List {
sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc)
sf, err := r.openFile(sigPath)
if err != nil {
continue
}
var sigFile SignatureFile
if err := xml.NewDecoder(sf).Decode(&sigFile); err != nil {
sf.Close()
continue
}
sf.Close()
signedValuePath := path.Join(path.Dir(sigPath), sigFile.SignedValue)
svData, err := r.ResData(signedValuePath)
if err != nil {
continue
}
sealType, sealData := extractSeal(svData)
for _, annot := range sigFile.SignedInfo.StampAnnot {
pageID := annot.PageRef
bbox, _ := ParseBox(annot.Boundary)
r.addStamp(pageID, bbox, sealType, sealData)
}
func(sigRef OFDSignature) {
sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc)
sf, err := r.openFile(sigPath)
if err != nil {
return
}
defer sf.Close()
var sigFile SignatureFile
if err := xml.NewDecoder(sf).Decode(&sigFile); err != nil {
return
}
signedValuePath := path.Join(path.Dir(sigPath), sigFile.SignedValue)
svData, err := r.ResData(signedValuePath)
if err != nil {
return
}
sealType, sealData := extractSeal(svData)
for _, annot := range sigFile.SignedInfo.StampAnnot {
pageID := annot.PageRef
bbox, _ := ParseBox(annot.Boundary)
r.addStamp(pageID, bbox, sealType, sealData)
}
}(sigRef)
}
return nil
}