package document import ( "encoding/base64" "fmt" "os" "path/filepath" "strings" ) // Drawing 表示Word文档中的图形 type Drawing struct { ID string Name string Description string ImagePath string ImageData []byte Width int // 单位为EMU (English Metric Unit) Height int // 单位为EMU (1厘米 = 360000 EMU) WrapType string // 文字环绕方式:inline, square, tight, through, topAndBottom, behind, inFront PositionH *DrawingPosition PositionV *DrawingPosition } // DrawingPosition 表示图形的位置 type DrawingPosition struct { RelativeFrom string // 相对位置:page, margin, column, paragraph, line, character Align string // 对齐方式:left, center, right, inside, outside Offset int // 偏移量,单位为EMU } // NewDrawing 创建一个新的图形 func NewDrawing() *Drawing { return &Drawing{ ID: generateUniqueID(), WrapType: "inline", } } // SetImagePath 设置图片路径 func (d *Drawing) SetImagePath(path string) *Drawing { d.ImagePath = path // 设置图片名称 if d.Name == "" { d.Name = filepath.Base(path) } // 读取图片数据 data, err := os.ReadFile(path) if err == nil { d.ImageData = data } return d } // SetImageData 设置图片数据 func (d *Drawing) SetImageData(data []byte) *Drawing { d.ImageData = data return d } // SetSize 设置图片大小 func (d *Drawing) SetSize(width, height int) *Drawing { d.Width = width d.Height = height return d } // SetName 设置图片名称 func (d *Drawing) SetName(name string) *Drawing { d.Name = name return d } // SetDescription 设置图片描述 func (d *Drawing) SetDescription(description string) *Drawing { d.Description = description return d } // SetWrapType 设置文字环绕方式 func (d *Drawing) SetWrapType(wrapType string) *Drawing { d.WrapType = wrapType return d } // SetPositionH 设置水平位置 func (d *Drawing) SetPositionH(relativeFrom, align string, offset int) *Drawing { d.PositionH = &DrawingPosition{ RelativeFrom: relativeFrom, Align: align, Offset: offset, } return d } // SetPositionV 设置垂直位置 func (d *Drawing) SetPositionV(relativeFrom, align string, offset int) *Drawing { d.PositionV = &DrawingPosition{ RelativeFrom: relativeFrom, Align: align, Offset: offset, } return d } // ToXML 将图形转换为XML func (d *Drawing) ToXML() string { xml := "" // 内联图片 if d.WrapType == "inline" { xml += "" // 图片大小 xml += "" // 图片效果 xml += "" // 文档中的图片 xml += "" // 图片属性 xml += "" xml += "" xml += "" // 图片 xml += "" xml += "" xml += "" // 图片信息 xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" // 图片填充 xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" // 图片形状 xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" } else { // 浮动图片 xml += "" // 简单位置 xml += "" // 水平位置 if d.PositionH != nil { xml += "" if d.PositionH.Align != "" { xml += "" + d.PositionH.Align + "" } else { xml += "" + fmt.Sprintf("%d", d.PositionH.Offset) + "" } xml += "" } else { xml += "" xml += "left" xml += "" } // 垂直位置 if d.PositionV != nil { xml += "" if d.PositionV.Align != "" { xml += "" + d.PositionV.Align + "" } else { xml += "" + fmt.Sprintf("%d", d.PositionV.Offset) + "" } xml += "" } else { xml += "" xml += "top" xml += "" } // 图片大小 xml += "" // 图片效果 xml += "" // 文字环绕方式 switch d.WrapType { case "square": xml += "" case "tight": xml += "" case "through": xml += "" case "topAndBottom": xml += "" case "behind": xml += "" case "inFront": xml += "" default: xml += "" } // 文档中的图片 xml += "" // 图片属性 xml += "" xml += "" xml += "" // 图片 xml += "" xml += "" xml += "" // 图片信息 xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" // 图片填充 xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" // 图片形状 xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" xml += "" } xml += "" return xml } // GetImageData 获取图片数据的Base64编码 func (d *Drawing) GetImageData() string { return base64.StdEncoding.EncodeToString(d.ImageData) } // GetImageType 获取图片类型 func (d *Drawing) GetImageType() string { if d.ImagePath != "" { ext := strings.ToLower(filepath.Ext(d.ImagePath)) switch ext { case ".jpg", ".jpeg": return "jpeg" case ".png": return "png" case ".gif": return "gif" case ".bmp": return "bmp" case ".tif", ".tiff": return "tiff" case ".wmf": return "x-wmf" case ".emf": return "x-emf" default: return "jpeg" } } return "jpeg" } // GetContentType 获取图片的Content-Type func (d *Drawing) GetContentType() string { switch d.GetImageType() { case "jpeg": return "image/jpeg" case "png": return "image/png" case "gif": return "image/gif" case "bmp": return "image/bmp" case "tiff": return "image/tiff" case "x-wmf": return "image/x-wmf" case "x-emf": return "image/x-emf" default: return "image/jpeg" } } // Error 实现error接口 func (d *Drawing) Error() string { return fmt.Sprintf("Drawing error: %s", d.Description) }