From 84a67d17df3f586b626345bf4bdd2607d588c3eb Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Sun, 4 Oct 2026 01:14:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=BD=AC=E6=8D=A2=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=E8=AE=BE=E5=A4=87=E7=BD=91=E5=B1=8F=E4=B8=8E?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=BB=A7=E6=89=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 4 ++-- ofdgo_pdf.go | 4 ++++ ofdgo_pdf_composite.go | 2 +- ofdgo_pdf_group.go | 4 +++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 953e49b..5b94318 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,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-20261003152411-fd6d20ac0470 + github.com/xiaoqidun/pdfgo v0.0.0-20261003171053-bd8834324b6d 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 42c3501..21911db 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-20261003152411-fd6d20ac0470 h1:jH4WLMpcFUYwpu9TzYYgqYiv1NTEMBsEzaO2qpiEc6w= -github.com/xiaoqidun/pdfgo v0.0.0-20261003152411-fd6d20ac0470/go.mod h1:4Pf0JO0BEf1uzRY+uZjlMjN/OPn3PYa0YMi6cqPPTLQ= +github.com/xiaoqidun/pdfgo v0.0.0-20261003171053-bd8834324b6d h1:8JS9LgB+i9n9/g997JaWObw4aVDPGLrRQASHdWSusGE= +github.com/xiaoqidun/pdfgo v0.0.0-20261003171053-bd8834324b6d/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 7c64b57..9dbc5e3 100644 --- a/ofdgo_pdf.go +++ b/ofdgo_pdf.go @@ -37,6 +37,7 @@ var ErrPDFPassword = pdfgo.ErrPassword // OnProgress按open、pages、convert及write.*阶段报告进度,total为0表示总量未知 // ResolveFile读取PDF引用的外部媒体、附件和页面,默认不访问网络或本地路径 // ResolveReference可提供已解密的引用页面,目标阅读器由调用方维护 +// Halftones提供只读设备命名网屏,所属阅读器由调用方维护,连续色调输出不网屏化 type PDFImportOptions struct { Password []byte PasswordUTF8 bool @@ -48,6 +49,7 @@ type PDFImportOptions struct { RasterDPI float64 ResolveFile pdfgo.FileResolver ResolveReference pdfgo.ReferenceResolver + Halftones map[string]*pdfgo.Halftone } // PDFImportReport 汇总转换页数、对象数、链接数和转换警告 @@ -98,6 +100,7 @@ type pdfImporter struct { referenceStreams map[*pdfgo.Stream]*pdfgo.Reader referencePages map[pdfReferencePageKey]*pdfgo.Page halftoneWarnings map[*pdfgo.Halftone]bool + halftones map[string]*pdfgo.Halftone transferBackdrop bool } @@ -144,6 +147,7 @@ func ImportPDF(ctx context.Context, source io.ReaderAt, size int64, options PDFI importer.pageIndexes = make(map[pdfgo.Reference]int) importer.resolveFile = options.ResolveFile importer.resolveReference = options.ResolveReference + importer.halftones = options.Halftones importer.referenceReaders = make(map[[32]byte]*pdfgo.Reader) importer.referenceStreams = make(map[*pdfgo.Stream]*pdfgo.Reader) importer.referencePages = make(map[pdfReferencePageKey]*pdfgo.Page) diff --git a/ofdgo_pdf_composite.go b/ofdgo_pdf_composite.go index 043e44d..73b380b 100644 --- a/ofdgo_pdf_composite.go +++ b/ofdgo_pdf_composite.go @@ -245,7 +245,7 @@ func (p *pdfImporter) collectCompositeNodes(walk func(pdfgo.Visitor) error) ([]p var collect func(func(pdfgo.Visitor) error) ([]pdfCompositeNode, error) collect = func(walk func(pdfgo.Visitor) error) ([]pdfCompositeNode, error) { var nodes []pdfCompositeNode - v := pdfgo.Visitor{Warning: p.warning, Reference: p.referencePage} + v := pdfgo.Visitor{Warning: p.warning, Reference: p.referencePage, Halftones: p.halftones} v.Path = func(mark pdfgo.PathMark) error { if err := p.halftone(mark.Style); err != nil { return err diff --git a/ofdgo_pdf_group.go b/ofdgo_pdf_group.go index 313b94a..fa6ea12 100644 --- a/ofdgo_pdf_group.go +++ b/ofdgo_pdf_group.go @@ -95,6 +95,7 @@ func pdfOpaqueVisitor(visitor pdfgo.Visitor) pdfgo.Visitor { v := pdfgo.Visitor{ Reference: visitor.Reference, OptionalContent: visitor.OptionalContent, + Halftones: visitor.Halftones, Path: func(m pdfgo.PathMark) error { return check(m.Style, m.Fill, m.Stroke) }, Text: func(m pdfgo.TextMark) error { return check(m.Style, m.Mode%4 == 0 || m.Mode%4 == 2, m.Mode%4 == 1 || m.Mode%4 == 2) @@ -138,6 +139,7 @@ func (p *pdfImporter) groupPaths(mark pdfgo.GroupMark, walk func(pdfgo.Visitor) collect := pdfgo.Visitor{ Reference: visitor.Reference, OptionalContent: visitor.OptionalContent, + Halftones: visitor.Halftones, Warning: visitor.Warning, Text: func(pdfgo.TextMark) error { return errPDFGroupRaster }, Image: func(pdfgo.ImageMark) error { return errPDFGroupRaster }, @@ -301,7 +303,7 @@ func (p *pdfImporter) rasterGroup(mark pdfgo.GroupMark, walk func(pdfgo.Visitor) // visitor 绑定当前导入器的图元与透明组访问函数 // 返回: pdfgo.Visitor 页面访问器 func (p *pdfImporter) visitor() pdfgo.Visitor { - v := pdfgo.Visitor{Path: p.path, Text: p.text, Image: p.image, Warning: p.warning, Reference: p.referencePage} + v := pdfgo.Visitor{Path: p.path, Text: p.text, Image: p.image, Warning: p.warning, Reference: p.referencePage, Halftones: p.halftones} v.Group = func(mark pdfgo.GroupMark, walk func(pdfgo.Visitor) error) error { return p.group(mark, walk, v) } return v }