From 2b5d237bc2aaa2d72de4fa25c954da3da8a5720e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Tue, 21 Feb 2023 13:45:40 +0800 Subject: [PATCH] inline drawing add Size --- apidrawing.go | 12 ++++++++ cmd/getstructure/main.go | 60 ---------------------------------------- cmd/main/main.go | 19 ++++++++++--- docxlib.go | 6 ---- link.go | 30 ++++++++++++++++---- structpara.go | 2 +- 6 files changed, 52 insertions(+), 77 deletions(-) delete mode 100644 cmd/getstructure/main.go diff --git a/apidrawing.go b/apidrawing.go index e82f4ba..4059df2 100644 --- a/apidrawing.go +++ b/apidrawing.go @@ -95,3 +95,15 @@ func (p *Paragraph) AddInlineDrawingFrom(file string) (*Run, error) { } return p.AddInlineDrawing(data) } + +// Size of the inline drawing by EMU +func (in *WPInline) Size(w, h int) { + if in.Extent != nil { + in.Extent.CX = w + in.Extent.CY = h + } + if in.Graphic != nil && in.Graphic.GraphicData != nil && in.Graphic.GraphicData.Pic != nil && in.Graphic.GraphicData.Pic.SpPr != nil { + in.Graphic.GraphicData.Pic.SpPr.Xfrm.Ext.CX = w + in.Graphic.GraphicData.Pic.SpPr.Xfrm.Ext.CY = h + } +} diff --git a/cmd/getstructure/main.go b/cmd/getstructure/main.go deleted file mode 100644 index 210b54c..0000000 --- a/cmd/getstructure/main.go +++ /dev/null @@ -1,60 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "os" - - "github.com/fumiama/docxlib" -) - -var fileLocation *string - -func init() { - fileLocation = flag.String("file", "new-file.docx", "file location") - flag.Parse() -} - -func main() { - //Now let's try to read the file - readFile, err := os.Open(*fileLocation) - if err != nil { - panic(err) - } - defer readFile.Close() - fileinfo, err := readFile.Stat() - if err != nil { - panic(err) - } - size := fileinfo.Size() - doc, err := docxlib.Parse(readFile, int64(size)) - if err != nil { - panic(err) - } - for _, para := range doc.Document.Body.Paragraphs { - fmt.Println("New paragraph") - for _, child := range para.Children { - if child.Run != nil { - if child.Run.Text != nil { - fmt.Printf("\tWe've found a new run with the text ->%s\n", child.Run.Text.Text) - } - if child.Run.Drawing != nil { - fmt.Printf("\tWe've found a new run with the drawing ->%d\n", child.Run.Drawing.Inline.DistT) // TODO: replace to refid - } - } - if child.Link != nil { - id := child.Link.ID - text := child.Link.Run.InstrText - link, err := doc.ReferHref(id) - if err != nil { - fmt.Printf("\tWe found a link with id %s and text %s without target\n", id, text) - } else { - fmt.Printf("\tWe've found a new hyperlink with ref %s and the text %s\n", link, text) - } - - } - } - fmt.Print("End of paragraph\n\n") - } - fmt.Println("End of main") -} diff --git a/cmd/main/main.go b/cmd/main/main.go index ca8db9a..32843b1 100644 --- a/cmd/main/main.go +++ b/cmd/main/main.go @@ -36,11 +36,22 @@ func main() { para3.AddText("直接粘贴 inline") para4 := w.AddParagraph() - para4.AddInlineDrawingFrom("testdata/fumiama.JPG") - para4.AddInlineDrawingFrom("testdata/fumiama2x.webp") + r, err := para4.AddInlineDrawingFrom("testdata/fumiama.JPG") + if err != nil { + panic(err) + } + r.Drawing.Inline.Size(r.Drawing.Inline.Extent.CX/2, r.Drawing.Inline.Extent.CY/2) + r, err = para4.AddInlineDrawingFrom("testdata/fumiama2x.webp") + if err != nil { + panic(err) + } + r.Drawing.Inline.Size(r.Drawing.Inline.Extent.CX/2, r.Drawing.Inline.Extent.CY/2) para5 := w.AddParagraph() - para5.AddInlineDrawingFrom("testdata/fumiamayoko.png") + _, err = para5.AddInlineDrawingFrom("testdata/fumiamayoko.png") + if err != nil { + panic(err) + } f, err := os.Create(*fileLocation) if err != nil { @@ -83,7 +94,7 @@ func main() { if child.Link != nil { id := child.Link.ID text := child.Link.Run.InstrText - link, err := doc.ReferHref(id) + link, err := doc.ReferTarget(id) if err != nil { fmt.Printf("\tWe found a link with id %s and text %s without target\n", id, text) } else { diff --git a/docxlib.go b/docxlib.go index 35051bf..6900177 100644 --- a/docxlib.go +++ b/docxlib.go @@ -3,16 +3,10 @@ package docxlib import ( "archive/zip" "bytes" - "errors" "io" "io/fs" ) -var ( - // ErrRefIDNotFound cannot find such reference - ErrRefIDNotFound = errors.New("ref id not found") -) - // Docx is the structure that allow to access the internal represntation // in memory of the doc (either read or about to be written) type Docx struct { diff --git a/link.go b/link.go index c8feaac..64325bb 100644 --- a/link.go +++ b/link.go @@ -1,10 +1,18 @@ package docxlib import ( + "errors" "strconv" "sync/atomic" ) +var ( + // ErrRefIDNotFound cannot find such reference + ErrRefIDNotFound = errors.New("ref id not found") + // ErrRefTargetNotFound cannot find such target + ErrRefTargetNotFound = errors.New("ref target not found") +) + // when adding an hyperlink we need to store a reference in the relationship field // // this func is not thread-safe @@ -36,16 +44,26 @@ func (f *Docx) addImageRelation(m Media) string { return rel.ID } -// ReferHref gets the url for a reference -func (f *Docx) ReferHref(id string) (href string, err error) { +// ReferTarget gets the target for a reference +func (f *Docx) ReferTarget(id string) (string, error) { f.DocRelation.mu.RLock() defer f.DocRelation.mu.RUnlock() for _, a := range f.DocRelation.Relationships { if a.ID == id { - href = a.Target - return + return a.Target, nil } } - err = ErrRefIDNotFound - return + return "", ErrRefIDNotFound +} + +// ReferID gets the rId from target +func (f *Docx) ReferID(target string) (string, error) { + f.DocRelation.mu.RLock() + defer f.DocRelation.mu.RUnlock() + for _, a := range f.DocRelation.Relationships { + if a.Target == target { + return a.ID, nil + } + } + return "", ErrRefIDNotFound } diff --git a/structpara.go b/structpara.go index 0ac96cc..0ee3bef 100644 --- a/structpara.go +++ b/structpara.go @@ -26,7 +26,7 @@ func (p *Paragraph) String() string { case c.Link != nil: id := c.Link.ID text := c.Link.Run.InstrText - link, err := p.file.ReferHref(id) + link, err := p.file.ReferTarget(id) sb.WriteString(text) sb.WriteByte('(') if err != nil {