1
0
mirror of https://github.com/fumiama/go-docx.git synced 2026-06-28 15:10:24 +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,12 +284,7 @@ newdoclop:
return return
} }
func (p *Paragraph) copymedia(to *Docx) (np Paragraph) { func (r *Run) copymedia(to *Docx) *Run {
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 := *r
nr.Children = make([]interface{}, 0, len(r.Children)) nr.Children = make([]interface{}, 0, len(r.Children))
nr.file = to nr.file = to
@@ -300,7 +295,28 @@ func (p *Paragraph) copymedia(to *Docx) (np Paragraph) {
} }
nr.Children = append(nr.Children, rc) nr.Children = append(nr.Children, rc)
} }
np.Children = append(np.Children, &nr) 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 {
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
}
rid := to.addLinkRelation(tgt)
np.Children = append(np.Children, &Hyperlink{
ID: rid,
Run: *h.Run.copymedia(to),
})
continue continue
} }
np.Children = append(np.Children, pc) np.Children = append(np.Children, pc)
@@ -330,3 +346,19 @@ func (t *Table) copymedia(to *Docx) (nt Table) {
} }
return 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 ( import (
"archive/zip" "archive/zip"
"encoding/xml" "encoding/xml"
"errors"
"io" "io"
"strconv"
"strings" "strings"
) )
@@ -108,9 +110,23 @@ func (f *Docx) parseDocRelation(file *zip.File) error {
defer zf.Close() defer zf.Close()
f.docRelation.Xmlns = XMLNS_R f.docRelation.Xmlns = XMLNS_R
//TODO: find last rID err = xml.NewDecoder(zf).Decode(&f.docRelation)
f.rID = 100000 if err != nil {
return xml.NewDecoder(zf).Decode(&f.docRelation) 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 // parseMedia add the media into Docx struct