mirror of
https://github.com/ZeroHawkeye/wordZero.git
synced 2025-09-27 20:22:17 +08:00
465 lines
14 KiB
Go
465 lines
14 KiB
Go
// Package main 图片占位符模板功能演示示例
|
||
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"fmt"
|
||
"image"
|
||
"image/color"
|
||
"image/png"
|
||
"log"
|
||
"os"
|
||
|
||
"github.com/ZeroHawkeye/wordZero/pkg/document"
|
||
)
|
||
|
||
// createSampleImageWithColor 创建指定颜色的示例图片数据
|
||
func createSampleImageWithColor(width, height int, bgColor color.RGBA, text string) []byte {
|
||
// 创建图片
|
||
img := image.NewRGBA(image.Rect(0, 0, width, height))
|
||
|
||
// 填充背景色
|
||
for y := 0; y < height; y++ {
|
||
for x := 0; x < width; x++ {
|
||
img.Set(x, y, bgColor)
|
||
}
|
||
}
|
||
|
||
// 添加边框
|
||
borderColor := color.RGBA{0, 0, 0, 255} // 黑色边框
|
||
for x := 0; x < width; x++ {
|
||
img.Set(x, 0, borderColor) // 上边框
|
||
img.Set(x, height-1, borderColor) // 下边框
|
||
}
|
||
for y := 0; y < height; y++ {
|
||
img.Set(0, y, borderColor) // 左边框
|
||
img.Set(width-1, y, borderColor) // 右边框
|
||
}
|
||
|
||
// 添加中心标记点(简单的十字)
|
||
centerX := width / 2
|
||
centerY := height / 2
|
||
markColor := color.RGBA{0, 0, 0, 255} // 黑色标记
|
||
|
||
// 画水平线
|
||
for x := centerX - 10; x <= centerX+10; x++ {
|
||
if x >= 0 && x < width {
|
||
img.Set(x, centerY, markColor)
|
||
}
|
||
}
|
||
|
||
// 画垂直线
|
||
for y := centerY - 10; y <= centerY+10; y++ {
|
||
if y >= 0 && y < height {
|
||
img.Set(centerX, y, markColor)
|
||
}
|
||
}
|
||
|
||
// 转换为PNG字节数组
|
||
buf := new(bytes.Buffer)
|
||
png.Encode(buf, img)
|
||
return buf.Bytes()
|
||
}
|
||
|
||
func main() {
|
||
fmt.Println("WordZero 图片占位符模板功能演示")
|
||
fmt.Println("=====================================")
|
||
|
||
// 确保输出目录存在
|
||
if _, err := os.Stat("examples/output"); os.IsNotExist(err) {
|
||
os.MkdirAll("examples/output", 0755)
|
||
}
|
||
|
||
// 演示1: 基础图片占位符
|
||
fmt.Println("\n1. 基础图片占位符演示")
|
||
demonstrateBasicImagePlaceholder()
|
||
|
||
// 演示2: 配置图片样式的占位符
|
||
fmt.Println("\n2. 配置图片样式演示")
|
||
demonstrateStyledImagePlaceholder()
|
||
|
||
// 演示3: 图片与文本混合模板
|
||
fmt.Println("\n3. 图片与文本混合模板演示")
|
||
demonstrateMixedContentTemplate()
|
||
|
||
// 演示4: 从现有文档创建带图片的模板
|
||
fmt.Println("\n4. 从现有文档创建图片模板演示")
|
||
demonstrateDocumentImageTemplate()
|
||
|
||
// 演示5: 二进制数据图片占位符
|
||
fmt.Println("\n5. 二进制数据图片占位符演示")
|
||
demonstrateBinaryImagePlaceholder()
|
||
|
||
fmt.Println("\n=====================================")
|
||
fmt.Println("图片占位符模板功能演示完成!")
|
||
fmt.Println("生成的文档保存在 examples/output/ 目录下")
|
||
}
|
||
|
||
// demonstrateBasicImagePlaceholder 演示基础图片占位符功能
|
||
func demonstrateBasicImagePlaceholder() {
|
||
// 创建模板引擎
|
||
engine := document.NewTemplateEngine()
|
||
|
||
// 创建包含图片占位符的模板
|
||
templateContent := `产品介绍文档
|
||
|
||
产品名称:{{productName}}
|
||
|
||
产品图片:
|
||
{{#image productImage}}
|
||
|
||
产品描述:{{productDescription}}
|
||
|
||
技术规格:
|
||
- 尺寸:{{dimensions}}
|
||
- 重量:{{weight}}
|
||
- 颜色:{{color}}
|
||
|
||
联系我们:{{contactInfo}}`
|
||
|
||
// 加载模板
|
||
_, err := engine.LoadTemplate("product_intro", templateContent)
|
||
if err != nil {
|
||
log.Fatalf("加载模板失败: %v", err)
|
||
}
|
||
|
||
// 创建模板数据
|
||
data := document.NewTemplateData()
|
||
data.SetVariable("productName", "智能手表 Pro")
|
||
data.SetVariable("productDescription", "这是一款功能强大的智能手表,具有健康监测、运动跟踪等多种功能。")
|
||
data.SetVariable("dimensions", "45mm x 38mm x 10.7mm")
|
||
data.SetVariable("weight", "32g")
|
||
data.SetVariable("color", "太空灰")
|
||
data.SetVariable("contactInfo", "电话:400-123-4567 | 邮箱:support@example.com")
|
||
|
||
// 创建图片配置(默认居中显示)
|
||
imageConfig := &document.ImageConfig{
|
||
Position: document.ImagePositionInline,
|
||
Alignment: document.AlignCenter,
|
||
Size: &document.ImageSize{
|
||
Width: 100, // 100mm宽度
|
||
KeepAspectRatio: true,
|
||
},
|
||
AltText: "智能手表产品图片",
|
||
Title: "智能手表 Pro",
|
||
}
|
||
|
||
// 设置图片数据(创建蓝色背景的产品图片)
|
||
imageData := createSampleImageWithColor(200, 150, color.RGBA{100, 150, 255, 255}, "产品图片")
|
||
data.SetImageFromData("productImage", imageData, imageConfig)
|
||
|
||
// 渲染模板
|
||
doc, err := engine.RenderToDocument("product_intro", data)
|
||
if err != nil {
|
||
log.Fatalf("渲染模板失败: %v", err)
|
||
}
|
||
|
||
// 保存文档
|
||
err = doc.Save("examples/output/template_image_basic_demo.docx")
|
||
if err != nil {
|
||
log.Fatalf("保存文档失败: %v", err)
|
||
}
|
||
|
||
fmt.Println("✓ 基础图片占位符演示完成,文档已保存为 template_image_basic_demo.docx")
|
||
}
|
||
|
||
// demonstrateStyledImagePlaceholder 演示配置图片样式的占位符
|
||
func demonstrateStyledImagePlaceholder() {
|
||
engine := document.NewTemplateEngine()
|
||
|
||
templateContent := `公司年度报告
|
||
|
||
{{companyName}} 2024年度报告
|
||
|
||
公司标志:
|
||
{{#image companyLogo}}
|
||
|
||
首席执行官致辞:
|
||
{{ceoMessage}}
|
||
|
||
核心团队:
|
||
{{#image teamPhoto}}
|
||
|
||
业绩数据:
|
||
销售额:{{revenue}}
|
||
增长率:{{growthRate}}
|
||
|
||
展望未来:
|
||
{{futureOutlook}}`
|
||
|
||
_, err := engine.LoadTemplate("annual_report", templateContent)
|
||
if err != nil {
|
||
log.Fatalf("加载模板失败: %v", err)
|
||
}
|
||
|
||
data := document.NewTemplateData()
|
||
data.SetVariable("companyName", "WordZero科技")
|
||
data.SetVariable("ceoMessage", "过去的一年,我们在技术创新和市场拓展方面取得了显著成就...")
|
||
data.SetVariable("revenue", "5000万元")
|
||
data.SetVariable("growthRate", "25%")
|
||
data.SetVariable("futureOutlook", "我们将继续专注于技术创新,为客户提供更优质的服务。")
|
||
|
||
// 公司标志配置 - 小尺寸,右对齐,橙色背景
|
||
logoConfig := &document.ImageConfig{
|
||
Position: document.ImagePositionInline,
|
||
Alignment: document.AlignRight,
|
||
Size: &document.ImageSize{
|
||
Width: 50, // 50mm宽度
|
||
Height: 20, // 20mm高度
|
||
},
|
||
AltText: "公司标志",
|
||
Title: "WordZero科技标志",
|
||
}
|
||
|
||
// 团队照片配置 - 大尺寸,居中,绿色背景
|
||
teamConfig := &document.ImageConfig{
|
||
Position: document.ImagePositionInline,
|
||
Alignment: document.AlignCenter,
|
||
Size: &document.ImageSize{
|
||
Width: 150, // 150mm宽度
|
||
KeepAspectRatio: true,
|
||
},
|
||
AltText: "核心团队合影",
|
||
Title: "WordZero科技核心团队",
|
||
}
|
||
|
||
// 设置图片(使用不同颜色的图片)
|
||
logoImageData := createSampleImageWithColor(150, 60, color.RGBA{255, 200, 100, 255}, "LOGO")
|
||
teamImageData := createSampleImageWithColor(300, 200, color.RGBA{100, 255, 150, 255}, "团队照片")
|
||
|
||
data.SetImageFromData("companyLogo", logoImageData, logoConfig)
|
||
data.SetImageFromData("teamPhoto", teamImageData, teamConfig)
|
||
|
||
doc, err := engine.RenderToDocument("annual_report", data)
|
||
if err != nil {
|
||
log.Fatalf("渲染模板失败: %v", err)
|
||
}
|
||
|
||
err = doc.Save("examples/output/template_image_styled_demo.docx")
|
||
if err != nil {
|
||
log.Fatalf("保存文档失败: %v", err)
|
||
}
|
||
|
||
fmt.Println("✓ 配置图片样式演示完成,文档已保存为 template_image_styled_demo.docx")
|
||
}
|
||
|
||
// demonstrateMixedContentTemplate 演示图片与文本混合模板
|
||
func demonstrateMixedContentTemplate() {
|
||
engine := document.NewTemplateEngine()
|
||
|
||
templateContent := `技术文档:{{title}}
|
||
|
||
概述:{{overview}}
|
||
|
||
步骤1:{{step1Description}}
|
||
{{#image step1Image}}
|
||
|
||
步骤2:{{step2Description}}
|
||
{{#image step2Image}}
|
||
|
||
步骤3:{{step3Description}}
|
||
{{#image step3Image}}
|
||
|
||
{{#if hasWarning}}
|
||
⚠️ 注意事项:
|
||
{{warningText}}
|
||
{{/if}}
|
||
|
||
{{#each tips}}
|
||
💡 提示 {{@index}}:{{this}}
|
||
{{/each}}
|
||
|
||
结论:{{conclusion}}`
|
||
|
||
_, err := engine.LoadTemplate("tech_doc", templateContent)
|
||
if err != nil {
|
||
log.Fatalf("加载模板失败: %v", err)
|
||
}
|
||
|
||
data := document.NewTemplateData()
|
||
data.SetVariable("title", "智能设备安装指南")
|
||
data.SetVariable("overview", "本文档将指导您完成智能设备的安装过程。")
|
||
data.SetVariable("step1Description", "首先,打开包装盒并取出所有组件。")
|
||
data.SetVariable("step2Description", "将设备连接到电源,等待指示灯亮起。")
|
||
data.SetVariable("step3Description", "使用手机应用程序完成设备配置。")
|
||
data.SetVariable("conclusion", "安装完成!设备现在可以正常使用了。")
|
||
|
||
// 设置条件和列表
|
||
data.SetCondition("hasWarning", true)
|
||
data.SetVariable("warningText", "请确保在干燥环境中操作,避免水分接触设备。")
|
||
|
||
tips := []interface{}{
|
||
"确保Wi-Fi信号稳定",
|
||
"保持手机和设备距离在3米以内",
|
||
"如遇问题,请重启设备重试",
|
||
}
|
||
data.SetList("tips", tips)
|
||
|
||
// 为每个步骤配置图片 - 使用不同颜色
|
||
stepImageConfig := &document.ImageConfig{
|
||
Position: document.ImagePositionInline,
|
||
Alignment: document.AlignCenter,
|
||
Size: &document.ImageSize{
|
||
Width: 80,
|
||
KeepAspectRatio: true,
|
||
},
|
||
}
|
||
|
||
// 创建不同颜色的步骤图片
|
||
step1ImageData := createSampleImageWithColor(160, 120, color.RGBA{255, 180, 180, 255}, "步骤1")
|
||
step2ImageData := createSampleImageWithColor(160, 120, color.RGBA{180, 255, 180, 255}, "步骤2")
|
||
step3ImageData := createSampleImageWithColor(160, 120, color.RGBA{180, 180, 255, 255}, "步骤3")
|
||
|
||
data.SetImageFromData("step1Image", step1ImageData, stepImageConfig)
|
||
data.SetImageFromData("step2Image", step2ImageData, stepImageConfig)
|
||
data.SetImageFromData("step3Image", step3ImageData, stepImageConfig)
|
||
|
||
doc, err := engine.RenderToDocument("tech_doc", data)
|
||
if err != nil {
|
||
log.Fatalf("渲染模板失败: %v", err)
|
||
}
|
||
|
||
err = doc.Save("examples/output/template_image_mixed_demo.docx")
|
||
if err != nil {
|
||
log.Fatalf("保存文档失败: %v", err)
|
||
}
|
||
|
||
fmt.Println("✓ 图片与文本混合模板演示完成,文档已保存为 template_image_mixed_demo.docx")
|
||
}
|
||
|
||
// demonstrateDocumentImageTemplate 演示从现有文档创建带图片的模板
|
||
func demonstrateDocumentImageTemplate() {
|
||
// 首先创建一个基础文档作为模板
|
||
baseDoc := document.New()
|
||
|
||
// 添加标题
|
||
title := baseDoc.AddParagraph("{{companyName}} 产品目录")
|
||
title.SetAlignment(document.AlignCenter)
|
||
|
||
// 添加介绍段落
|
||
baseDoc.AddParagraph("欢迎浏览我们的产品目录。以下是我们的明星产品:")
|
||
|
||
// 添加产品信息段落(包含图片占位符)
|
||
baseDoc.AddParagraph("产品名称:{{productName}}")
|
||
baseDoc.AddParagraph("{{#image productImage}}")
|
||
baseDoc.AddParagraph("产品价格:{{price}}")
|
||
baseDoc.AddParagraph("产品特色:{{features}}")
|
||
|
||
// 添加联系信息
|
||
contact := baseDoc.AddParagraph("联系我们:{{contactInfo}}")
|
||
contact.SetAlignment(document.AlignCenter)
|
||
|
||
// 从基础文档创建模板
|
||
engine := document.NewTemplateEngine()
|
||
template, err := engine.LoadTemplateFromDocument("product_catalog", baseDoc)
|
||
if err != nil {
|
||
log.Fatalf("从文档创建模板失败: %v", err)
|
||
}
|
||
|
||
fmt.Printf("从文档创建的模板包含 %d 个变量\n", len(template.Variables))
|
||
|
||
// 准备数据
|
||
data := document.NewTemplateData()
|
||
data.SetVariable("companyName", "创新科技")
|
||
data.SetVariable("productName", "智能音箱 X1")
|
||
data.SetVariable("price", "¥299")
|
||
data.SetVariable("features", "AI语音助手、高保真音质、智能家居控制")
|
||
data.SetVariable("contactInfo", "官网:www.example.com | 热线:400-888-9999")
|
||
|
||
// 配置产品图片 - 紫色背景
|
||
productImageConfig := &document.ImageConfig{
|
||
Position: document.ImagePositionInline,
|
||
Alignment: document.AlignCenter,
|
||
Size: &document.ImageSize{
|
||
Width: 100,
|
||
KeepAspectRatio: true,
|
||
},
|
||
AltText: "智能音箱产品图片",
|
||
Title: "智能音箱 X1",
|
||
}
|
||
|
||
imageData := createSampleImageWithColor(200, 150, color.RGBA{200, 150, 255, 255}, "音箱图片")
|
||
data.SetImageFromData("productImage", imageData, productImageConfig)
|
||
|
||
// 渲染模板
|
||
doc, err := engine.RenderTemplateToDocument("product_catalog", data)
|
||
if err != nil {
|
||
log.Fatalf("渲染模板失败: %v", err)
|
||
}
|
||
|
||
err = doc.Save("examples/output/template_image_from_doc_demo.docx")
|
||
if err != nil {
|
||
log.Fatalf("保存文档失败: %v", err)
|
||
}
|
||
|
||
fmt.Println("✓ 从现有文档创建图片模板演示完成,文档已保存为 template_image_from_doc_demo.docx")
|
||
}
|
||
|
||
// demonstrateBinaryImagePlaceholder 演示二进制数据图片占位符
|
||
func demonstrateBinaryImagePlaceholder() {
|
||
engine := document.NewTemplateEngine()
|
||
|
||
templateContent := `数据分析报告
|
||
|
||
报告标题:{{reportTitle}}
|
||
生成时间:{{generateTime}}
|
||
|
||
关键指标图表:
|
||
{{#image chartImage}}
|
||
|
||
数据摘要:
|
||
{{summary}}
|
||
|
||
详细分析:
|
||
{{analysis}}
|
||
|
||
结论与建议:
|
||
{{conclusion}}`
|
||
|
||
_, err := engine.LoadTemplate("data_report", templateContent)
|
||
if err != nil {
|
||
log.Fatalf("加载模板失败: %v", err)
|
||
}
|
||
|
||
data := document.NewTemplateData()
|
||
data.SetVariable("reportTitle", "2024年第三季度销售数据分析")
|
||
data.SetVariable("generateTime", "2024年10月15日")
|
||
data.SetVariable("summary", "本季度销售额较上季度增长15%,各产品线表现良好。")
|
||
data.SetVariable("analysis", "移动端销售占比持续提升,达到总销售额的60%。华东地区仍是最大市场。")
|
||
data.SetVariable("conclusion", "建议继续加强移动端渠道建设,并在华南地区投入更多营销资源。")
|
||
|
||
// 模拟图表数据 - 黄色背景的图表
|
||
chartImageData := createSampleImageWithColor(300, 200, color.RGBA{255, 255, 150, 255}, "数据图表")
|
||
|
||
chartConfig := &document.ImageConfig{
|
||
Position: document.ImagePositionInline,
|
||
Alignment: document.AlignCenter,
|
||
Size: &document.ImageSize{
|
||
Width: 120,
|
||
KeepAspectRatio: true,
|
||
},
|
||
AltText: "销售数据图表",
|
||
Title: "2024 Q3 销售数据图表",
|
||
}
|
||
|
||
// 使用二进制数据设置图片
|
||
data.SetImageFromData("chartImage", chartImageData, chartConfig)
|
||
|
||
doc, err := engine.RenderToDocument("data_report", data)
|
||
if err != nil {
|
||
log.Fatalf("渲染模板失败: %v", err)
|
||
}
|
||
|
||
err = doc.Save("examples/output/template_image_binary_demo.docx")
|
||
if err != nil {
|
||
log.Fatalf("保存文档失败: %v", err)
|
||
}
|
||
|
||
fmt.Println("✓ 二进制数据图片占位符演示完成,文档已保存为 template_image_binary_demo.docx")
|
||
}
|
||
|
||
// createSampleImageData 创建示例图片数据(为了向后兼容保留,但现在使用红色背景)
|
||
func createSampleImageData() []byte {
|
||
return createSampleImageWithColor(100, 100, color.RGBA{255, 100, 100, 255}, "示例图片")
|
||
}
|