1
0
mirror of https://github.com/fumiama/go-docx.git synced 2026-06-04 23:30:25 +08:00

add api AppendFile

This commit is contained in:
源文雨
2023-04-23 19:28:05 +08:00
parent 34f53a967c
commit 050781fdde
2 changed files with 61 additions and 13 deletions

View File

@@ -284,23 +284,39 @@ newdoclop:
return
}
func (r *Run) copymedia(to *Docx) *Run {
nr := *r
nr.Children = make([]interface{}, 0, len(r.Children))
nr.file = to
for _, rc := range r.Children {
if d, ok := rc.(*Drawing); ok {
nr.Children = append(nr.Children, d.copymedia(to))
continue
}
nr.Children = append(nr.Children, rc)
}
return &nr
}
func (p *Paragraph) copymedia(to *Docx) (np Paragraph) {
np = *p
np.Children = make([]interface{}, 0, len(p.Children))
np.file = to
for _, pc := range p.Children {
if r, ok := pc.(*Run); ok {
nr := *r
nr.Children = make([]interface{}, 0, len(r.Children))
nr.file = to
for _, rc := range r.Children {
if d, ok := rc.(*Drawing); ok {
nr.Children = append(nr.Children, d.copymedia(to))
continue
}
nr.Children = append(nr.Children, rc)
np.Children = append(np.Children, r.copymedia(to))
continue
}
if h, ok := pc.(*Hyperlink); ok {
tgt, err := p.file.ReferTarget(h.ID)
if err != nil {
continue
}
np.Children = append(np.Children, &nr)
rid := to.addLinkRelation(tgt)
np.Children = append(np.Children, &Hyperlink{
ID: rid,
Run: *h.Run.copymedia(to),
})
continue
}
np.Children = append(np.Children, pc)
@@ -330,3 +346,19 @@ func (t *Table) copymedia(to *Docx) (nt Table) {
}
return
}
// AppendFile appends all contents in af to f
func (f *Docx) AppendFile(af *Docx) {
for _, item := range af.Document.Body.Items {
switch o := item.(type) {
case *Paragraph:
np := o.copymedia(f)
f.Document.Body.Items = append(f.Document.Body.Items, &np)
case *Table:
nt := o.copymedia(f)
f.Document.Body.Items = append(f.Document.Body.Items, &nt)
default:
f.Document.Body.Items = append(f.Document.Body.Items, o)
}
}
}

View File

@@ -23,7 +23,9 @@ package docx
import (
"archive/zip"
"encoding/xml"
"errors"
"io"
"strconv"
"strings"
)
@@ -108,9 +110,23 @@ func (f *Docx) parseDocRelation(file *zip.File) error {
defer zf.Close()
f.docRelation.Xmlns = XMLNS_R
//TODO: find last rID
f.rID = 100000
return xml.NewDecoder(zf).Decode(&f.docRelation)
err = xml.NewDecoder(zf).Decode(&f.docRelation)
if err != nil {
return err
}
for _, r := range f.docRelation.Relationship {
if !strings.HasPrefix(r.ID, "rId") {
return errors.New("invalid rel ID: " + r.ID)
}
id, err := strconv.ParseUint(r.ID[3:], 10, 64)
if err != nil {
return err
}
if f.rID < uintptr(id) {
f.rID = uintptr(id)
}
}
return nil
}
// parseMedia add the media into Docx struct