Files

465 lines
14 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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}, "示例图片")
}