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>

0 ответов

Другие вопросы по тегам