用openxml从最后一页排除页眉、页脚和水印

本文关键字:最后 一页 排除 openxml | 更新日期: 2023-09-27 18:06:02

我使用Open XML (DocumentFormat.OpenXml nuget包)来生成docx文件。以下是我的方法:

我有一个名为template.docx的文件。在这个文件中,我有一个Cover Page和一个空白页面,其中有header, footer和背景图像。总之,我首先打开文档,然后向文档添加一些文本,然后关闭它。

另一方面,我有一个名为template-back.docx的文件,我想把它附加在上面修改的文档(template.docx)的末尾。

我可以这样做,通过使用这个代码片段:

    public static void MergeDocumentWithPagebreak(string sourceFile, string destinationFile, string altChunkID) {
        using (var myDoc = WordprocessingDocument.Open(sourceFile, true)) {
            var mainPart = myDoc.MainDocumentPart;
            //Append page break
            var para = new Paragraph(new Run((new Break() { Type = BreakValues.Page })));
            mainPart.Document.Body.InsertAfter(para, mainPart.Document.Body.LastChild);
            //Append file
            var chunk = mainPart.AddAlternativeFormatImportPart(
            AlternativeFormatImportPartType.WordprocessingML, altChunkID);
            using (var fileStream = File.Open(destinationFile, FileMode.Open))
                chunk.FeedData(fileStream);
            var altChunk = new AltChunk{
                Id = altChunkID
            };
            mainPart.Document
                    .Body
                    .InsertAfter(altChunk, mainPart.Document.Body.Elements<Paragraph>().Last());
            mainPart.Document.Save();
        }
    }

但是,当我这样做时,header, footer和背景图像,被应用到最后一个页面。我希望能够排除最后一页从得到这些设计。我希望它干净,简单和白色。但在谷歌上搜索这个问题,没有任何帮助。你有什么主意吗?提前感谢。

公立小学

关于合并文档的原文在这里:

用openxml从最后一页排除页眉、页脚和水印

这有点棘手,但并不那么复杂。

首先你得明白单词是怎么工作的:

  • 默认情况下,一个word文档是一个节,这个节共享页眉和页脚。如果你想要不同的页眉/页脚,你必须在页面末尾创建一个换行符,以表明"下一页是一个新的部分"。
  • 一旦创建了一个新的节,你必须指出"新的节不共享相同的页眉/页脚"

一些关于"如何在word中创建不同头文件"的文档。http://www.techrepublic.com/blog/microsoft-office/accommodate-different-headers-and-footers-in-a-word-document/

如果我们翻译到你的代码,在插入你的文档之前,你必须:

  • 创建分隔符
  • 在本节中插入新的页眉/页脚(空的)
  • 将新文档插入到新部分

创建新的头文件,其他一些文档:https://msdn.microsoft.com/en-us/library/office/cc546917.aspx

技巧:如果你插入的文档不包含页眉/页脚,创建一个空的并重新复制

信息:我试图删除<w:headerReference r:id="rIdX" w:type="default"/>或将r:id设置为0,但它不起作用。创建空标题是最快的方法

用以下代码替换你的分页符

Paragraph PageBreakParagraph = new Paragraph(new DocumentFormat.OpenXml.Wordprocessing.Run(new DocumentFormat.OpenXml.Wordprocessing.Break() { Type = BreakValues.Page }));

我还看到你在最后一个子之后插入,这与追加并不重要,但对你来说效果很好!用这个代替。

wordprocessingDocument.MainDocumentPart.Document.Body.Append(PageBreakParagraph)

您需要在section属性中添加分隔符。然后需要将节属性附加到段落属性。然后将段落属性附加到段落中。

        Paragraph paragraph232 = new Paragraph();
        ParagraphProperties paragraphProperties220 = new ParagraphProperties();
        SectionProperties sectionProperties1 = new SectionProperties();
        SectionType sectionType1 = new SectionType(){ Val = SectionMarkValues.NextPage };
        sectionProperties1.Append(sectionType1);
        paragraphProperties220.Append(sectionProperties1);
        paragraph232.Append(paragraphProperties220);
//Replace your last but one line with this one.
mainPart.Document
                .Body
                .Append(altChunk);

生成的Open XML是:

  <w:p>
    <w:pPr>
      <w:sectPr>
        <w:type w:val="nextPage" />
      </w:sectPr>
    </w:pPr>
  </w:p>

最简单的方法是在word中创建文档,然后在open XML生产力工具中打开它,您可以反映代码并查看c#代码将生成您想要实现的各种open XML元素。希望这对你有帮助!