C# Как объединить 3 документа, верхний и нижний колонтитулы и тело, разделенные в каждом документе с OpenXML и PowerTools?
Мне нужна помощь о том, как объединить 3 документа, один из которых содержит только нижний колонтитул, а другой - заголовок.
Это вроде работает, но в слове показывается какое-то сообщение о том, что раздел продолжается или что-то еще. Который виден только при редактировании документа. Кажется, это дополнительная или дублирующая копия раздела. Может ли кто-нибудь помочь мне с этим?
Оригинальный вопрос с исходным кодом:
http://ericwhite.com/blog/forums/topic/discard-footer-or-section-separatly/
public partial class Source
{
public bool DiscardHeadersInKeptSections { get; set; }
public bool DiscardFootersInKeptSections { get; set; }
public bool IsDiscardingParts
{
get
{
return DiscardHeadersInKeptSections || DiscardFootersInKeptSections;
}
}
}
public static partial class DocumentBuilder
{
private static void RemoveHeadersFromSections(WordprocessingDocument doc)
{
var mdXDoc = doc.MainDocumentPart.GetXDocument();
var sections = mdXDoc.Descendants(W.sectPr).ToList();
foreach (var sect in sections)
{
sect.Elements(W.headerReference).Remove();
}
doc.MainDocumentPart.PutXDocument();
}
private static void RemoveFootersFromSections(WordprocessingDocument doc)
{
var mdXDoc = doc.MainDocumentPart.GetXDocument();
var sections = mdXDoc.Descendants(W.sectPr).ToList();
foreach (var sect in sections)
{
sect.Elements(W.footerReference).Remove();
}
doc.MainDocumentPart.PutXDocument();
}
private static void ProcessSectionsForLinkToPreviousHeaders(WordprocessingDocument doc)
{
CachedHeaderFooter[] cachedHeaderFooter = new[]
{
new CachedHeaderFooter() { Ref = W.headerReference, Type = "first" },
new CachedHeaderFooter() { Ref = W.headerReference, Type = "even" },
new CachedHeaderFooter() { Ref = W.headerReference, Type = "default" },
};
var mdXDoc = doc.MainDocumentPart.GetXDocument();
var sections = mdXDoc.Descendants(W.sectPr).ToList();
var firstSection = true;
foreach (var sect in sections)
{
if (firstSection)
{
var headerFirst = FindReference(sect, W.headerReference, "first");
var headerDefault = FindReference(sect, W.headerReference, "default");
var headerEven = FindReference(sect, W.headerReference, "even");
if (headerEven == null)
{
if (headerDefault != null)
AddReferenceToExistingHeaderOrFooter(doc.MainDocumentPart, sect, (string)headerDefault.Attribute(R.id), W.headerReference, "even");
else
InitEmptyHeaderOrFooter(doc.MainDocumentPart, sect, W.headerReference, "even");
}
if (headerFirst == null)
{
if (headerDefault != null)
AddReferenceToExistingHeaderOrFooter(doc.MainDocumentPart, sect, (string)headerDefault.Attribute(R.id), W.headerReference, "first");
else
InitEmptyHeaderOrFooter(doc.MainDocumentPart, sect, W.headerReference, "first");
}
foreach (var hf in cachedHeaderFooter)
{
if (sect.Elements(hf.Ref).FirstOrDefault(z => (string)z.Attribute(W.type) == hf.Type) == null)
InitEmptyHeaderOrFooter(doc.MainDocumentPart, sect, hf.Ref, hf.Type);
var reference = sect.Elements(hf.Ref).FirstOrDefault(z => (string)z.Attribute(W.type) == hf.Type);
if (reference == null)
throw new OpenXmlPowerToolsException("Internal error");
hf.CachedPartRid = (string)reference.Attribute(R.id);
}
firstSection = false;
continue;
}
else
{
CopyOrCacheHeaderOrFooter(doc, cachedHeaderFooter, sect, W.headerReference, "first");
CopyOrCacheHeaderOrFooter(doc, cachedHeaderFooter, sect, W.headerReference, "even");
CopyOrCacheHeaderOrFooter(doc, cachedHeaderFooter, sect, W.headerReference, "default");
}
}
doc.MainDocumentPart.PutXDocument();
}
private static void ProcessSectionsForLinkToPreviousFooters(WordprocessingDocument doc)
{
CachedHeaderFooter[] cachedHeaderFooter = new[]
{
new CachedHeaderFooter() { Ref = W.footerReference, Type = "first" },
new CachedHeaderFooter() { Ref = W.footerReference, Type = "even" },
new CachedHeaderFooter() { Ref = W.footerReference, Type = "default" },
};
var mdXDoc = doc.MainDocumentPart.GetXDocument();
var sections = mdXDoc.Descendants(W.sectPr).ToList();
var firstSection = true;
foreach (var sect in sections)
{
if (firstSection)
{
var footerFirst = FindReference(sect, W.footerReference, "first");
var footerDefault = FindReference(sect, W.footerReference, "default");
var footerEven = FindReference(sect, W.footerReference, "even");
if (footerEven == null)
{
if (footerDefault != null)
AddReferenceToExistingHeaderOrFooter(doc.MainDocumentPart, sect, (string)footerDefault.Attribute(R.id), W.footerReference, "even");
else
InitEmptyHeaderOrFooter(doc.MainDocumentPart, sect, W.footerReference, "even");
}
if (footerFirst == null)
{
if (footerDefault != null)
AddReferenceToExistingHeaderOrFooter(doc.MainDocumentPart, sect, (string)footerDefault.Attribute(R.id), W.footerReference, "first");
else
InitEmptyHeaderOrFooter(doc.MainDocumentPart, sect, W.footerReference, "first");
}
foreach (var hf in cachedHeaderFooter)
{
if (sect.Elements(hf.Ref).FirstOrDefault(z => (string)z.Attribute(W.type) == hf.Type) == null)
InitEmptyHeaderOrFooter(doc.MainDocumentPart, sect, hf.Ref, hf.Type);
var reference = sect.Elements(hf.Ref).FirstOrDefault(z => (string)z.Attribute(W.type) == hf.Type);
if (reference == null)
throw new OpenXmlPowerToolsException("Internal error");
hf.CachedPartRid = (string)reference.Attribute(R.id);
}
firstSection = false;
continue;
}
else
{
CopyOrCacheHeaderOrFooter(doc, cachedHeaderFooter, sect, W.footerReference, "first");
CopyOrCacheHeaderOrFooter(doc, cachedHeaderFooter, sect, W.footerReference, "even");
CopyOrCacheHeaderOrFooter(doc, cachedHeaderFooter, sect, W.footerReference, "default");
}
}
doc.MainDocumentPart.PutXDocument();
}
}
Строка:393 в DocumentBuilder.cs
if (source.KeepSections && source.IsDiscardingParts)
{
if(source.DiscardHeadersInKeptSections)
{
RemoveHeadersFromSections(doc);
}
else
{
ProcessSectionsForLinkToPreviousHeaders(doc);
}
if(source.DiscardFootersInKeptSections)
{
RemoveFootersFromSections(doc);
}
else
{
ProcessSectionsForLinkToPreviousFooters(doc);
}
}
else if (source.KeepSections)
ProcessSectionsForLinkToPreviousHeadersAndFooters(doc);
List<XElement> contents = doc.MainDocumentPart.GetXDocument()
.Root
.Element(W.body)
.Elements()
.Skip(source.Start)
.Take(source.Count)
.ToList();
try
{
AppendDocument(doc, output, contents, source.KeepSections, source.InsertId, images);
}
catch (DocumentBuilderInternalException dbie)
{
if (dbie.Message.Contains("{0}"))
throw new DocumentBuilderException(string.Format(dbie.Message, sourceNum));
else
throw dbie;
}
}
}
}
else
{
using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(source.WmlDocument))
using (WordprocessingDocument doc = streamDoc.GetWordprocessingDocument())
{
#if TestForUnsupportedDocuments
// throws exceptions if a document contains unsupported content
TestForUnsupportedDocument(doc, sources.IndexOf(source));
#endif
if (source.KeepSections && source.IsDiscardingParts)
{
if(source.DiscardHeadersInKeptSections)
{
RemoveHeadersFromSections(doc);
}
else
{
ProcessSectionsForLinkToPreviousHeaders(doc);
}
if(source.DiscardFootersInKeptSections)
{
RemoveFootersFromSections(doc);
}
else
{
ProcessSectionsForLinkToPreviousFooters(doc);
}
}
else if (source.KeepSections)
ProcessSectionsForLinkToPreviousHeadersAndFooters(doc);
Как я это использую
sources.Add(new Source(settings.TemplateFilePath, false));
sources[0].DiscardFootersInKeptSections = true;
sources[0].DiscardHeadersInKeptSections = true;
sources.Add(new Source(tempHeaderPath, true) { DiscardFootersInKeptSections = true });
sources.Add(new Source(tempFooterPath, true) { DiscardHeadersInKeptSections = true });
document.xml
<w:p w:rsidR="005C6B96" w:rsidRPr="00B14B81" w:rsidRDefault="005C6B96" w:rsidP="004F23F1"/>
<w:p w:rsidR="00077D08" w:rsidRDefault="00D14262">
<w:pPr>
<w:sectPr w:rsidR="00077D08" w:rsidSect="0018015B">
<w:footerReference w:type="even" r:id="rId7"/>
<w:footerReference w:type="default" r:id="rId8"/>
<w:headerReference w:type="first" r:id="rId9"/>
<w:footerReference w:type="first" r:id="rId10"/>
<w:type w:val="continuous"/>
<w:pgSz w:w="11906" w:h="16838" w:code="9"/>
<w:pgMar w:top="1418" w:right="1418" w:bottom="2552" w:left="1418" w:header="318" w:footer="851" w:gutter="0"/>
<w:cols w:space="708"/>
<w:titlePg/>
<w:docGrid w:linePitch="360"/>
</w:sectPr>
</w:pPr>
<w:r>
<w:t>Josh Gomez</w:t>
</w:r>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
</w:p>
<w:p w:rsidR="00D14262" w:rsidRDefault="00D14262"/>
<w:sectPr w:rsidR="00D14262" w:rsidSect="0018015B">
<w:footerReference w:type="even" r:id="rId11"/>
<w:footerReference w:type="default" r:id="rId12"/>
<w:footerReference w:type="first" r:id="rId13"/>
<w:type w:val="continuous"/>
<w:pgSz w:w="11906" w:h="16838" w:code="9"/>
<w:pgMar w:top="1418" w:right="1418" w:bottom="2552" w:left="1418" w:header="318" w:footer="851" w:gutter="0"/>
<w:cols w:space="708"/>
<w:titlePg/>
<w:docGrid w:linePitch="360"/>
</w:sectPr>
</w:body>
</w:document>