mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-08-30 12:12:40 +08:00
feat(印章渲染): 加强印章渲染兼容性
This commit is contained in:
+12
-3
@@ -92,13 +92,22 @@ func (r *Renderer) GetPageBox(page *PageContent) (Box, error) {
|
|||||||
// 入参: ctx 画布上下文, page 页面内容
|
// 入参: ctx 画布上下文, page 页面内容
|
||||||
// 返回: error 错误信息
|
// 返回: error 错误信息
|
||||||
func (r *Renderer) RenderPageToContext(ctx *canvas.Context, page *PageContent) error {
|
func (r *Renderer) RenderPageToContext(ctx *canvas.Context, page *PageContent) error {
|
||||||
|
return r.renderPageToContext(ctx, page, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// renderPageToContext 渲染页面到指定上下文
|
||||||
|
// 入参: ctx 画布上下文, page 页面内容, drawBackground 是否绘制页面背景
|
||||||
|
// 返回: error 错误信息
|
||||||
|
func (r *Renderer) renderPageToContext(ctx *canvas.Context, page *PageContent, drawBackground bool) error {
|
||||||
box, err := r.GetPageBox(page)
|
box, err := r.GetPageBox(page)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
pageH := box.H
|
pageH := box.H
|
||||||
ctx.SetFillColor(canvas.White)
|
if drawBackground {
|
||||||
ctx.DrawPath(0, 0, canvas.Rectangle(box.W, box.H))
|
ctx.SetFillColor(canvas.White)
|
||||||
|
ctx.DrawPath(0, 0, canvas.Rectangle(box.W, box.H))
|
||||||
|
}
|
||||||
if len(page.Template) > 0 && r.Reader.doc != nil {
|
if len(page.Template) > 0 && r.Reader.doc != nil {
|
||||||
for _, tplRef := range page.Template {
|
for _, tplRef := range page.Template {
|
||||||
if tplRef.ZOrder != "Foreground" {
|
if tplRef.ZOrder != "Foreground" {
|
||||||
@@ -1058,7 +1067,7 @@ func (r *Renderer) renderStamp(ctx *canvas.Context, s Stamp, pageH float64) {
|
|||||||
ctx.Push()
|
ctx.Push()
|
||||||
ctx.Translate(x, screenY)
|
ctx.Translate(x, screenY)
|
||||||
ctx.Scale(w/sealBox.W, h/sealBox.H)
|
ctx.Scale(w/sealBox.W, h/sealBox.H)
|
||||||
renderer.RenderPageToContext(ctx, content)
|
renderer.renderPageToContext(ctx, content, false)
|
||||||
ctx.Pop()
|
ctx.Pop()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|||||||
+30
-5
@@ -19,7 +19,6 @@ import (
|
|||||||
"encoding/asn1"
|
"encoding/asn1"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"path"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -77,7 +76,7 @@ func (r *Reader) parseSignatures(doc *Document) error {
|
|||||||
}
|
}
|
||||||
for _, sigRef := range signatures.List {
|
for _, sigRef := range signatures.List {
|
||||||
func(sigRef OFDSignature) {
|
func(sigRef OFDSignature) {
|
||||||
sigPath := path.Join(path.Dir(doc.Signatures), sigRef.BaseLoc)
|
sigPath := resolveResourcePath(doc.Signatures, "", sigRef.BaseLoc)
|
||||||
sf, err := r.openFile(sigPath)
|
sf, err := r.openFile(sigPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -90,17 +89,20 @@ func (r *Reader) parseSignatures(doc *Document) error {
|
|||||||
var sealType string
|
var sealType string
|
||||||
var sealData []byte
|
var sealData []byte
|
||||||
if sigFile.SignedInfo.Seal.BaseLoc != "" {
|
if sigFile.SignedInfo.Seal.BaseLoc != "" {
|
||||||
sealPath := path.Join(path.Dir(sigPath), sigFile.SignedInfo.Seal.BaseLoc)
|
sealPath := resolveResourcePath(sigPath, "", sigFile.SignedInfo.Seal.BaseLoc)
|
||||||
if data, err := r.ResData(sealPath); err == nil {
|
if data, err := r.ResData(sealPath); err == nil {
|
||||||
sealType, sealData = extractSeal(data)
|
sealType, sealData = extractSeal(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(sealData) == 0 && sigFile.SignedValue != "" {
|
if len(sealData) == 0 && sigFile.SignedValue != "" {
|
||||||
signedValuePath := path.Join(path.Dir(sigPath), sigFile.SignedValue)
|
signedValuePath := resolveResourcePath(sigPath, "", sigFile.SignedValue)
|
||||||
if data, err := r.ResData(signedValuePath); err == nil {
|
if data, err := r.ResData(signedValuePath); err == nil {
|
||||||
sealType, sealData = extractSeal(data)
|
sealType, sealData = extractSeal(data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if len(sealData) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
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)
|
||||||
@@ -210,7 +212,9 @@ func extractImageData(data []byte) (string, []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if idx := bytes.Index(data, []byte("PK\x03\x04")); idx >= 0 {
|
if idx := bytes.Index(data, []byte("PK\x03\x04")); idx >= 0 {
|
||||||
return "ofd", data[idx:]
|
if end := zipDataEnd(data[idx:]); end > 0 {
|
||||||
|
return "ofd", data[idx : idx+end]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
@@ -237,6 +241,27 @@ func pngDataEnd(data []byte) int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// zipDataEnd 获取ZIP数据结束位置
|
||||||
|
// 入参: data ZIP数据
|
||||||
|
// 返回: int 结束位置
|
||||||
|
func zipDataEnd(data []byte) int {
|
||||||
|
if len(data) < 4 || !bytes.Equal(data[:4], []byte("PK\x03\x04")) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
sig := []byte("PK\x05\x06")
|
||||||
|
for i := len(data) - 22; i >= 0; i-- {
|
||||||
|
if i+22 > len(data) || !bytes.Equal(data[i:i+4], sig) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
commentLen := int(binary.LittleEndian.Uint16(data[i+20 : i+22]))
|
||||||
|
end := i + 22 + commentLen
|
||||||
|
if end <= len(data) {
|
||||||
|
return end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
// Stamp 印章信息结构
|
// Stamp 印章信息结构
|
||||||
type Stamp struct {
|
type Stamp struct {
|
||||||
Box Box
|
Box Box
|
||||||
|
|||||||
Reference in New Issue
Block a user