mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-08-30 12:12:40 +08:00
feat(字体路径): 优化回退字体路径
This commit is contained in:
+9
-8
@@ -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,10 +77,8 @@ 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,10 +89,8 @@ 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
@@ -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 {
|
||||||
|
|||||||
+23
-22
@@ -71,28 +71,29 @@ func (r *Reader) parseSignatures(doc *Document) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, sigRef := range signatures.List {
|
for _, sigRef := range signatures.List {
|
||||||
sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc)
|
func(sigRef OFDSignature) {
|
||||||
sf, err := r.openFile(sigPath)
|
sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc)
|
||||||
if err != nil {
|
sf, err := r.openFile(sigPath)
|
||||||
continue
|
if err != nil {
|
||||||
}
|
return
|
||||||
var sigFile SignatureFile
|
}
|
||||||
if err := xml.NewDecoder(sf).Decode(&sigFile); err != nil {
|
defer sf.Close()
|
||||||
sf.Close()
|
var sigFile SignatureFile
|
||||||
continue
|
if err := xml.NewDecoder(sf).Decode(&sigFile); err != nil {
|
||||||
}
|
return
|
||||||
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 {
|
||||||
pageID := annot.PageRef
|
pageID := annot.PageRef
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user