From 30d9699385612bdca6f557eb9d1afd7ecf99af76 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Mon, 28 Sep 2026 20:23:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=BD=AC=E6=8D=A2=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=A2=9C=E8=89=B2=E8=BD=AC=E6=8D=A2=E4=B8=8E?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=A1=AB=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 4 ++-- ofdgo_pdf.go | 2 +- ofdgo_pdf_shading.go | 6 +++--- ofdgo_render_compile.go | 4 +--- ofdgo_renderer_path_canvas.go | 12 ++++-------- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 02c08fe..2a7c017 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/tdewolff/canvas v0.0.0-20260923214215-09804640d00c github.com/tdewolff/font v0.0.0-20260913163313-54f98bb59ee6 github.com/xiaoqidun/jbig2 v1.1.1 - github.com/xiaoqidun/pdfgo v0.0.0-20260928111239-49265df4c04c + github.com/xiaoqidun/pdfgo v0.0.0-20260928121523-d13a51030150 golang.org/x/crypto v0.57.0 golang.org/x/image v0.46.0 golang.org/x/text v0.42.0 diff --git a/go.sum b/go.sum index 4dbc436..14b3ed5 100644 --- a/go.sum +++ b/go.sum @@ -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/xiaoqidun/jbig2 v1.1.1 h1:SjliS9ZO0e9HX5oYUfBuXrfFsXhWricrSz+XY4zORDI= github.com/xiaoqidun/jbig2 v1.1.1/go.mod h1:8QonVWtENmh2kc6l+leqeGl7psb79DWlHDkCpdChjfQ= -github.com/xiaoqidun/pdfgo v0.0.0-20260928111239-49265df4c04c h1:AkN9yw2b5LXinOBkWy/Wppdu4AtqQ2j6M4AYxlThL/A= -github.com/xiaoqidun/pdfgo v0.0.0-20260928111239-49265df4c04c/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ= +github.com/xiaoqidun/pdfgo v0.0.0-20260928121523-d13a51030150 h1:N4JwW+p/KtgiNeNGVEdqswfLvefqZXGeS6tPpYKpIJQ= +github.com/xiaoqidun/pdfgo v0.0.0-20260928121523-d13a51030150/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.8.5 h1:r6N5afV5qj/5S4UTch8agZHJ8UxNCMwX7WjkkJam2NA= diff --git a/ofdgo_pdf.go b/ofdgo_pdf.go index 61a4d7b..d29156b 100644 --- a/ofdgo_pdf.go +++ b/ofdgo_pdf.go @@ -315,7 +315,7 @@ func pdfBounds(points []pdfgo.Point) Box { // 返回: *FillColor OFD颜色 func (p *pdfImporter) color(paint pdfgo.Paint) *FillColor { alpha := int(math.Round(paint.Alpha * 255)) - if paint.CMYK != nil { + if paint.CMYK != nil && (paint.Space == nil || !paint.Space.Calibrated()) { if p.cmykSpace == "" { p.cmykSpace = p.editor.nextID() p.editor.resources = append(p.editor.resources, editorResource{space: &ColorSpace{ID: p.cmykSpace, Type: "CMYK", BitsPerComponent: 16}}) diff --git a/ofdgo_pdf_shading.go b/ofdgo_pdf_shading.go index d6c2b3b..16d876e 100644 --- a/ofdgo_pdf_shading.go +++ b/ofdgo_pdf_shading.go @@ -52,7 +52,7 @@ func pdfGradientStopsError(stops []pdfgo.GradientStop, space *pdfgo.ColorSpace) for i := 1; i < len(stops); i++ { a, b := stops[i-1], stops[i] if a.Position != b.Position && a.Values != b.Values { - return &pdfgo.UnsupportedError{Feature: "nonlinear ICC gradient conversion"} + return &pdfgo.UnsupportedError{Feature: "nonlinear calibrated gradient conversion"} } } } @@ -69,7 +69,7 @@ func pdfGradientError(paint pdfgo.Paint) error { return &pdfgo.UnsupportedError{Feature: "nonlinear mesh conversion"} } if mesh.Space.Calibrated() && !mesh.Space.SRGBEquivalent() { - return &pdfgo.UnsupportedError{Feature: "nonlinear ICC mesh conversion"} + return &pdfgo.UnsupportedError{Feature: "nonlinear calibrated mesh conversion"} } } if paint.Axial != nil { @@ -99,7 +99,7 @@ func (p *pdfImporter) gradientPath(mark pdfgo.PathMark) error { case paint.Mesh != nil: space = paint.Mesh.Space } - if paint.CMYK == nil && (space == nil || space.Model != "DeviceCMYK" || space.Calibrated()) { + if space != nil && space.Calibrated() || paint.CMYK == nil && (space == nil || space.Model != "DeviceCMYK") { cmyk = false break } diff --git a/ofdgo_render_compile.go b/ofdgo_render_compile.go index 73f3c10..a8c67c9 100644 --- a/ofdgo_render_compile.go +++ b/ofdgo_render_compile.go @@ -139,13 +139,11 @@ func (c *semanticCompiler) fill(path GeometryPath, paint Paint, evenOdd bool, cl if len(path) == 0 || paint.Kind == PaintNone || paint.Kind == PaintSolid && paint.Color.A == 0 { return nil } + path = closedGeometry(path) if !c.measure && paint.Kind != PaintPattern { return c.command(path, paint, evenOdd, clip, shadingMatrix, nil) } var err error - if clip != nil || paint.Kind == PaintPattern || paint.Gradient != nil || paint.Mesh != nil { - path = closedGeometry(path) - } if evenOdd && (clip != nil || paint.Kind == PaintPattern || paint.Gradient != nil || paint.Mesh != nil) { path, err = c.geometry.Normalize(path, true) if err != nil { diff --git a/ofdgo_renderer_path_canvas.go b/ofdgo_renderer_path_canvas.go index 54a0595..b368a94 100644 --- a/ofdgo_renderer_path_canvas.go +++ b/ofdgo_renderer_path_canvas.go @@ -245,15 +245,11 @@ func (r *Renderer) renderPath(ctx *canvas.Context, obj PathObject, pageH float64 if shouldFill { fillPaint, shadingClip, fillView := resolveShdPaint(ctx, style.fillPaint) fillClip := intersectClipPath(clipPath, shadingClip) - fp := p - _, repeat := fillPaint.(*repeatAxialGradient) - if fillClip != nil || repeat { - paths := canvas.Paths(p.Copy().Split()) - for _, path := range paths { - path.Close() - } - fp = paths.Merge() + paths := canvas.Paths(p.Copy().Split()) + for _, path := range paths { + path.Close() } + fp := paths.Merge() fillRule := canvas.NonZero if obj.Rule == "Even-Odd" { fillRule = canvas.EvenOdd