public void Save()
{
Headers headers = Headers;
// Save the main document
using (TextWriter tw = new StreamWriter(new PackagePartStream(mainPart.GetStream(FileMode.Create, FileAccess.Write))))
mainDoc.Save(tw, SaveOptions.None);
if (settings == null)
{
using (TextReader tr = new StreamReader(settingsPart.GetStream()))
settings = XDocument.Load(tr);
}
XElement body = mainDoc.Root.Element(w + "body");
XElement sectPr = body.Descendants(w + "sectPr").FirstOrDefault();
if (sectPr != null)
{
var evenHeaderRef =
(
from e in mainDoc.Descendants(w + "headerReference")
let type = e.Attribute(w + "type")
where type != null && type.Value.Equals("even", StringComparison.CurrentCultureIgnoreCase)
select e.Attribute(r + "id").Value
).LastOrDefault();
if (evenHeaderRef != null)
{
XElement even = headers.even.Xml;
Uri target = PackUriHelper.ResolvePartUri
(
mainPart.Uri,
mainPart.GetRelationship(evenHeaderRef).TargetUri
);
using (TextWriter tw = new StreamWriter(new PackagePartStream(package.GetPart(target).GetStream(FileMode.Create, FileAccess.Write))))
{
new XDocument
(
new XDeclaration("1.0", "UTF-8", "yes"),
even
).Save(tw, SaveOptions.None);
}
}
var oddHeaderRef =
(
from e in mainDoc.Descendants(w + "headerReference")
let type = e.Attribute(w + "type")
where type != null && type.Value.Equals("default", StringComparison.CurrentCultureIgnoreCase)
select e.Attribute(r + "id").Value
).LastOrDefault();
if (oddHeaderRef != null)
{
XElement odd = headers.odd.Xml;
Uri target = PackUriHelper.ResolvePartUri
(
mainPart.Uri,
mainPart.GetRelationship(oddHeaderRef).TargetUri
);
// Save header1
using (TextWriter tw = new StreamWriter(new PackagePartStream(package.GetPart(target).GetStream(FileMode.Create, FileAccess.Write))))
{
new XDocument
(
new XDeclaration("1.0", "UTF-8", "yes"),
odd
).Save(tw, SaveOptions.None);
}
}
var firstHeaderRef =
(
from e in mainDoc.Descendants(w + "headerReference")
let type = e.Attribute(w + "type")
where type != null && type.Value.Equals("first", StringComparison.CurrentCultureIgnoreCase)
select e.Attribute(r + "id").Value
).LastOrDefault();
if (firstHeaderRef != null)
{
XElement first = headers.first.Xml;
Uri target = PackUriHelper.ResolvePartUri
(
mainPart.Uri,
mainPart.GetRelationship(firstHeaderRef).TargetUri
);
// Save header3
using (TextWriter tw = new StreamWriter(new PackagePartStream(package.GetPart(target).GetStream(FileMode.Create, FileAccess.Write))))
{
new XDocument
(
new XDeclaration("1.0", "UTF-8", "yes"),
first
).Save(tw, SaveOptions.None);
}
}
var oddFooterRef =
(
from e in mainDoc.Descendants(w + "footerReference")
let type = e.Attribute(w + "type")
where type != null && type.Value.Equals("default", StringComparison.CurrentCultureIgnoreCase)
select e.Attribute(r + "id").Value
).LastOrDefault();
if (oddFooterRef != null)
{
XElement odd = footers.odd.Xml;
Uri target = PackUriHelper.ResolvePartUri
(
mainPart.Uri,
mainPart.GetRelationship(oddFooterRef).TargetUri
);
// Save header1
using (TextWriter tw = new StreamWriter(new PackagePartStream(package.GetPart(target).GetStream(FileMode.Create, FileAccess.Write))))
{
new XDocument
(
new XDeclaration("1.0", "UTF-8", "yes"),
odd
).Save(tw, SaveOptions.None);
}
}
var evenFooterRef =
(
from e in mainDoc.Descendants(w + "footerReference")
let type = e.Attribute(w + "type")
where type != null && type.Value.Equals("even", StringComparison.CurrentCultureIgnoreCase)
select e.Attribute(r + "id").Value
).LastOrDefault();
if (evenFooterRef != null)
{
XElement even = footers.even.Xml;
Uri target = PackUriHelper.ResolvePartUri
(
mainPart.Uri,
mainPart.GetRelationship(evenFooterRef).TargetUri
);
// Save header2
using (TextWriter tw = new StreamWriter(new PackagePartStream(package.GetPart(target).GetStream(FileMode.Create, FileAccess.Write))))
{
new XDocument
(
new XDeclaration("1.0", "UTF-8", "yes"),
even
).Save(tw, SaveOptions.None);
}
}
var firstFooterRef =
(
from e in mainDoc.Descendants(w + "footerReference")
let type = e.Attribute(w + "type")
where type != null && type.Value.Equals("first", StringComparison.CurrentCultureIgnoreCase)
select e.Attribute(r + "id").Value
).LastOrDefault();
if (firstFooterRef != null)
{
XElement first = footers.first.Xml;
Uri target = PackUriHelper.ResolvePartUri
(
mainPart.Uri,
mainPart.GetRelationship(firstFooterRef).TargetUri
);
// Save header3
using (TextWriter tw = new StreamWriter(new PackagePartStream(package.GetPart(target).GetStream(FileMode.Create, FileAccess.Write))))
{
new XDocument
(
new XDeclaration("1.0", "UTF-8", "yes"),
first
).Save(tw, SaveOptions.None);
}
}
// Save the settings document.
using (TextWriter tw = new StreamWriter(new PackagePartStream(settingsPart.GetStream(FileMode.Create, FileAccess.Write))))
settings.Save(tw, SaveOptions.None);
if (endnotesPart != null)
{
using (TextWriter tw = new StreamWriter(new PackagePartStream(endnotesPart.GetStream(FileMode.Create, FileAccess.Write))))
endnotes.Save(tw, SaveOptions.None);
}
if (footnotesPart != null)
{
using (TextWriter tw = new StreamWriter(new PackagePartStream(footnotesPart.GetStream(FileMode.Create, FileAccess.Write))))
footnotes.Save(tw, SaveOptions.None);
}
if (stylesPart != null)
{
using (TextWriter tw = new StreamWriter(new PackagePartStream(stylesPart.GetStream(FileMode.Create, FileAccess.Write))))
styles.Save(tw, SaveOptions.None);
}
if (stylesWithEffectsPart != null)
{
using (TextWriter tw = new StreamWriter(new PackagePartStream(stylesWithEffectsPart.GetStream(FileMode.Create, FileAccess.Write))))
stylesWithEffects.Save(tw, SaveOptions.None);
}
if (numberingPart != null)
{
using (TextWriter tw = new StreamWriter(new PackagePartStream(numberingPart.GetStream(FileMode.Create, FileAccess.Write))))
numbering.Save(tw, SaveOptions.None);
}
if (fontTablePart != null)
{
using (TextWriter tw = new StreamWriter(new PackagePartStream(fontTablePart.GetStream(FileMode.Create, FileAccess.Write))))
fontTable.Save(tw, SaveOptions.None);
}
}
// Close the document so that it can be saved.
package.Flush();
#region Save this document back to a file or stream, that was specified by the user at save time.
if (filename != null)
{
using (FileStream fs = new FileStream(filename, FileMode.Create))
{
fs.Write(memoryStream.ToArray(), 0, (int)memoryStream.Length);
}
}
else
{
if (stream.CanSeek) // 2013-05-25: Check if stream can be seeked to support System.Web.HttpResponseStream
{
// Set the length of this stream to 0
stream.SetLength(0);
// Write to the beginning of the stream
stream.Position = 0;
}
memoryStream.WriteTo(stream);
memoryStream.Flush();
}
#endregion
}