feat(转换能力): 完善渐变转换与图像复用
build.yaml / build (push) Successful in 44s

This commit is contained in:
xiaoqidun committed 2026-09-28 17:52:00 +08:00
1 parent 95dea33a95
commit 056d7c3979
6 files changed
+22 -9

No files matched your search

+1 -1
View File
@@ -9,7 +9,7 @@ require (
github.com/tdewolff/canvas v0.0.0-20260923214215-09804640d00c github.com/tdewolff/canvas v0.0.0-20260923214215-09804640d00c
github.com/tdewolff/font v0.0.0-20260913163313-54f98bb59ee6 github.com/tdewolff/font v0.0.0-20260913163313-54f98bb59ee6
github.com/xiaoqidun/jbig2 v1.1.1 github.com/xiaoqidun/jbig2 v1.1.1
github.com/xiaoqidun/pdfgo v0.0.0-20260928085418-08275755d188 github.com/xiaoqidun/pdfgo v0.0.0-20260928094736-cdc5f892445c
golang.org/x/crypto v0.57.0 golang.org/x/crypto v0.57.0
golang.org/x/image v0.46.0 golang.org/x/image v0.46.0
golang.org/x/text v0.42.0 golang.org/x/text v0.42.0
+2 -2
View File
@@ -62,8 +62,8 @@ github.com/tdewolff/test v1.0.12 h1:7F21DqIajswxuche0geHdrUZRCWE4oko4b7bcmkkrxk=
github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
github.com/xiaoqidun/jbig2 v1.1.1 h1:SjliS9ZO0e9HX5oYUfBuXrfFsXhWricrSz+XY4zORDI= github.com/xiaoqidun/jbig2 v1.1.1 h1:SjliS9ZO0e9HX5oYUfBuXrfFsXhWricrSz+XY4zORDI=
github.com/xiaoqidun/jbig2 v1.1.1/go.mod h1:8QonVWtENmh2kc6l+leqeGl7psb79DWlHDkCpdChjfQ= github.com/xiaoqidun/jbig2 v1.1.1/go.mod h1:8QonVWtENmh2kc6l+leqeGl7psb79DWlHDkCpdChjfQ=
github.com/xiaoqidun/pdfgo v0.0.0-20260928085418-08275755d188 h1:XMOU0kQii0LW3BcFxPQLA7tgVfDmZ6zQcpZuU+eP+fk= github.com/xiaoqidun/pdfgo v0.0.0-20260928094736-cdc5f892445c h1:6idDj210CT1eyGK/fHDw0hD90GSrLqeRV7ECaP9dfyI=
github.com/xiaoqidun/pdfgo v0.0.0-20260928085418-08275755d188/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ= github.com/xiaoqidun/pdfgo v0.0.0-20260928094736-cdc5f892445c/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA= github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA=
+1 -1
View File
@@ -75,7 +75,7 @@ type pdfImporter struct {
objects []GraphicObject objects []GraphicObject
pages map[pdfgo.Reference]*pdfgo.Page pages map[pdfgo.Reference]*pdfgo.Page
pageIDs map[pdfgo.Reference]string pageIDs map[pdfgo.Reference]string
imageIDs map[*pdfgo.Stream]string imageIDs map[pdfImageKey]string
maskClips map[*pdfgo.SoftMask]pdfgo.Path maskClips map[*pdfgo.SoftMask]pdfgo.Path
pageBox pdfgo.Rectangle pageBox pdfgo.Rectangle
pageWidth float64 pageWidth float64
+4 -1
View File
@@ -390,7 +390,10 @@ func (c *pdfCompositor) mask(mask *pdfgo.SoftMask, inherited *pdfgo.ColorSpace)
return nil, err return nil, err
} }
} }
result[i] = mask.Transfer(v) result[i], err = mask.Transfer(v)
if err != nil {
return nil, err
}
} }
c.masks[mask] = result c.masks[mask] = result
return result, nil return result, nil
+4 -1
View File
@@ -522,7 +522,10 @@ func (p *pdfImporter) maskClip(mask *pdfgo.SoftMask) (pdfgo.Path, error) {
return pdfgo.Path{}, err return pdfgo.Path{}, err
} }
opacity := func(v float64) (bool, error) { opacity := func(v float64) (bool, error) {
v = mask.Transfer(v) v, err := mask.Transfer(v)
if err != nil {
return false, err
}
if v != 0 && v != 1 { if v != 0 && v != 1 {
return false, &pdfgo.UnsupportedError{Feature: "nonbinary luminosity mask"} return false, &pdfgo.UnsupportedError{Feature: "nonbinary luminosity mask"}
} }
+10 -3
View File
@@ -32,6 +32,12 @@ import (
"github.com/xiaoqidun/pdfgo" "github.com/xiaoqidun/pdfgo"
) )
// pdfImageKey 区分同一图像流在不同渲染意图下的资源
type pdfImageKey struct {
stream *pdfgo.Stream
intent pdfgo.Name
}
// image 转换图像样本,不将整页或其他对象栅格化 // image 转换图像样本,不将整页或其他对象栅格化
// 入参: mark PDF图像绘制信息 // 入参: mark PDF图像绘制信息
// 返回: error 错误信息 // 返回: error 错误信息
@@ -59,7 +65,8 @@ func (p *pdfImporter) image(mark pdfgo.ImageMark) error {
return &pdfgo.UnsupportedError{Feature: "image color separation overprint"} return &pdfgo.UnsupportedError{Feature: "image color separation overprint"}
} }
source := mark.Image source := mark.Image
id := p.imageIDs[source.Stream] key := pdfImageKey{stream: source.Stream, intent: source.Intent}
id := p.imageIDs[key]
if source.ImageMask { if source.ImageMask {
id = "" id = ""
} }
@@ -125,9 +132,9 @@ func (p *pdfImporter) image(mark pdfgo.ImageMark) error {
} }
if !source.ImageMask { if !source.ImageMask {
if p.imageIDs == nil { if p.imageIDs == nil {
p.imageIDs = map[*pdfgo.Stream]string{} p.imageIDs = map[pdfImageKey]string{}
} }
p.imageIDs[source.Stream] = id p.imageIDs[key] = id
} }
} }
return p.appendImage(mark, id) return p.appendImage(mark, id)