fumiama / go-docx

One of the most functional libraries to partially read and write .docx files (a.k.a. Microsoft Word documents or ECMA-376 Office Open XML) in Go.
GNU Affero General Public License v3.0
109 stars 14 forks source link

A3模板以及分页符 #17

Closed mabiao0525 closed 5 months ago

mabiao0525 commented 5 months ago

请问现在有可以更换A4为A3的调用吗,以及是否可以添加分页符?

fumiama commented 5 months ago

你可以自行新建一个A3的空白文档,仿照 https://github.com/fumiama/go-docx/tree/master/xml/a4 的格式将相关文件拷贝出来,然后使用UseTemplate()方法替换。至于分页符,确实没有,你可以按同样的方法得到分页符的定义,提交相关PR。

mabiao0525 commented 5 months ago

另外,我觉得AddText是不是这样写好一些 `// AddText adds text to paragraph func (p Paragraph) AddText(text string) Run { if text == "\t" { return p.AddTab() }

c := make([]interface{}, 0, 64)

for i, s := range strings.Split(text, "\n") {
    if i > 0 {
        c = append(c, &BarterRabbet{})
    }
    for tabIndex, k := range strings.Split(s, "\t") {
        if tabIndex > 0 {
            c = append(c, &Tab{})
        }
        if s != "" {
            c = append(c, &Text{
                Text: k,
            })
        }
    }
}

run := &Run{
    RunProperties: &RunProperties{},
    Children:      c,
}

p.Children = append(p.Children, run)

return run

}` 这样才可以加入换行,之前的AddText是不带换行符的,只识别了\t

fumiama commented 5 months ago

你可以发一个PR.

mabiao0525 commented 5 months ago

你好,目前关于A3模板我进行了2种方法的测试,不过都出现了一些问题: 1.新建了空白A3word文档,并将相关文件考入,使用UseTemplate函数,但是在执行到WriteTo时会出现panic: open xml/a3/_rels/.rels: file does not exist提示,图中是我当前的测试代码,以及项目树 Snipaste_2024-03-15_11-19-58 `package main

import ( "embed" "os"

"github.com/fumiama/go-docx"

)

var ( //go:embed xml //go:embed xml/a3/_rels/* templateFS embed.FS

// a3TemplateFilesList is the files list under templateFS/xml/a3
a3TemplateFilesList = []string{
    "_rels/.rels",
    "docProps/app.xml",
    "docProps/core.xml",
    "word/theme/theme1.xml",
    "word/fontTable.xml",
    "word/styles.xml",
    "[Content_Types].xml",
}

)

func main() { w := docx.NewA4() w.UseTemplate("a3", a3TemplateFilesList, templateFS) w.AddParagraph().AddText("test")

result, err := os.Create("result.docx")
// save to file
if err != nil {
    panic(err)
}
_, err = w.WriteTo(result)
if err != nil {
    panic(err)
}
err = result.Close()
if err != nil {
    panic(err)
}

} ` 不知道是不是我的使用有问题,想问下如何正确使用,是否可以出一个UseTemplate的说明

2.下载源码,直接用A3格式相关文档替换原xml/a4中的文件,运行后,可以生成文件,但是打开文件会显示 1 点击确定后,打开仍为A4模板,想问下有无解决办法

fumiama commented 5 months ago

抱歉,看来是我判断错误了,A4 A3的判定应该在docyments.xml,由以下语句控制(A3的情况)

<w:sectPr w:rsidR="00384B6B" w:rsidSect="00654812">
    <w:pgSz w:w="16840" w:h="23820"/>
    <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
    <w:cols w:space="425"/>
    <w:docGrid w:type="lines" w:linePitch="312"/>
</w:sectPr>
fumiama commented 5 months ago

关于这个,我可以改,但最近没时间,你要急用的话可以自己改一下,然后另行提交PR。我已经推送了一个新版本,将令人迷惑的NewA4()替换了。

mabiao0525 commented 5 months ago

谢谢,请问你有什么思路吗,因为我看在wirteTo中的pack函数时会把document.xml.rels和document.xml覆盖掉

mabiao0525 commented 5 months ago

已经完成,提交了PR,请查收

fumiama commented 5 months ago

谢谢,请问你有什么思路吗,因为我看在wirteTo中的pack函数时会把document.xml.rels和document.xml覆盖掉

就按你那样就可以了,建议封装一些新的函数方便切换页面大小。

func (f *Docx) WithA4Page() *Docx
func (f *Docx) WithA3Page() *Docx
mabiao0525 commented 5 months ago

已完成