@@ -35,7 +35,7 @@ type Writer struct {
3535 last * Part
3636}
3737
38- // NewWriter returns a new Writer writing an OPC file to w.
38+ // NewWriter returns a new Writer writing an OPC package to w.
3939func NewWriter (w io.Writer ) * Writer {
4040 return & Writer {p : & pkg {
4141 parts : make (map [string ]* Part , 0 ),
@@ -49,6 +49,35 @@ func NewWriter(w io.Writer) *Writer {
4949 }, w : zip .NewWriter (w )}
5050}
5151
52+ // NewWriterFromReader returns a new Writer writing an OPC package to w
53+ // and with its content initialized with r.
54+ // Parts comming from r cannot be modified but new parts can be appended
55+ // and package core properties and relationships can be updated.
56+ func NewWriterFromReader (w io.Writer , r * Reader ) (* Writer , error ) {
57+ ow := NewWriter (w )
58+ for _ , p := range r .Files {
59+ pw , err := ow .CreatePart (p .Part , CompressionNormal )
60+ if err != nil {
61+ return nil , err
62+ }
63+ rc , err := p .Open ()
64+ if err != nil {
65+ return nil , err
66+ }
67+ _ , err = io .Copy (pw , rc )
68+ rc .Close ()
69+ if err != nil {
70+ return nil , err
71+ }
72+ }
73+ ow .Properties = r .Properties
74+ ow .Relationships = make ([]* Relationship , len (r .Relationships ))
75+ for i , rel := range r .Relationships {
76+ ow .Relationships [i ] = & (* rel )
77+ }
78+ return ow , nil
79+ }
80+
5281// Flush flushes any buffered data to the underlying writer.
5382// Part metadata, relationships, content types and other OPC related files won't be flushed.
5483// Calling Flush is not normally necessary; calling Close is sufficient.
0 commit comments