public void ApplyTemplate(Stream templateStream, bool includeContent)
{
Package templatePackage = Package.Open(templateStream);
try
{
PackagePart documentPart = null;
XDocument documentDoc = null;
foreach (PackagePart packagePart in templatePackage.GetParts())
{
switch (packagePart.Uri.ToString())
{
case "/word/document.xml":
documentPart = packagePart;
using (XmlReader xr = XmlReader.Create(packagePart.GetStream(FileMode.Open, FileAccess.Read)))
{
documentDoc = XDocument.Load(xr);
}
break;
case "/_rels/.rels":
if (!package.PartExists(packagePart.Uri))
{
package.CreatePart(packagePart.Uri, packagePart.ContentType, packagePart.CompressionOption);
}
PackagePart globalRelsPart = package.GetPart(packagePart.Uri);
using (
StreamReader tr = new StreamReader(
packagePart.GetStream(FileMode.Open, FileAccess.Read), Encoding.UTF8))
{
using (
StreamWriter tw = new StreamWriter(
new PackagePartStream(globalRelsPart.GetStream(FileMode.Create, FileAccess.Write)), Encoding.UTF8))
{
tw.Write(tr.ReadToEnd());
}
}
break;
case "/word/_rels/document.xml.rels":
break;
default:
if (!package.PartExists(packagePart.Uri))
{
package.CreatePart(packagePart.Uri, packagePart.ContentType, packagePart.CompressionOption);
}
Encoding packagePartEncoding = Encoding.Default;
if (packagePart.Uri.ToString().EndsWith(".xml") || packagePart.Uri.ToString().EndsWith(".rels"))
{
packagePartEncoding = Encoding.UTF8;
}
PackagePart nativePart = package.GetPart(packagePart.Uri);
using (
StreamReader tr = new StreamReader(
packagePart.GetStream(FileMode.Open, FileAccess.Read), packagePartEncoding))
{
using (
StreamWriter tw = new StreamWriter(
new PackagePartStream(nativePart.GetStream(FileMode.Create, FileAccess.Write)), tr.CurrentEncoding))
{
tw.Write(tr.ReadToEnd());
}
}
break;
}
}
if (documentPart != null)
{
string mainContentType = documentPart.ContentType.Replace("template.main", "document.main");
if (package.PartExists(documentPart.Uri))
{
package.DeletePart(documentPart.Uri);
}
PackagePart documentNewPart = package.CreatePart(
documentPart.Uri, mainContentType, documentPart.CompressionOption);
using (XmlWriter xw = XmlWriter.Create(new PackagePartStream(documentNewPart.GetStream(FileMode.Create, FileAccess.Write))))
{
documentDoc.WriteTo(xw);
}
foreach (PackageRelationship documentPartRel in documentPart.GetRelationships())
{
documentNewPart.CreateRelationship(
documentPartRel.TargetUri,
documentPartRel.TargetMode,
documentPartRel.RelationshipType,
documentPartRel.Id);
}
mainPart = documentNewPart;
mainDoc = documentDoc;
PopulateDocument(this, templatePackage);
// DragonFire: I added next line and recovered ApplyTemplate method.
// I do it, becouse PopulateDocument(...) writes into field "settingsPart" the part of Template's package
// and after line "templatePackage.Close();" in finally, field "settingsPart" becomes not available and method "Save" throw an exception...
// That's why I recreated settingsParts and unlinked it from Template's package =)
settingsPart = HelperFunctions.CreateOrGetSettingsPart(package);
}
if (!includeContent)
{
foreach (Paragraph paragraph in Paragraphs)
{
paragraph.Remove(false);
}
}
}
finally
{
package.Flush();
var documentRelsPart = package.GetPart(new Uri("/word/_rels/document.xml.rels", UriKind.Relative));
using (TextReader tr = new StreamReader(documentRelsPart.GetStream(FileMode.Open, FileAccess.Read)))
{
tr.Read();
}
templatePackage.Close();
PopulateDocument(Document, package);
}
}