首页 > 解决方案 > 使用 WordProcessingDocument 时 Word 文档不显示页眉、页脚和图像

问题描述

我习惯于WordprocessingDocument在 word 文档中读取和写入内容,但是当我使用 打开文档时MemoryStream,它没有向我显示 word 文档中已经存在的图像和页眉/页脚。下面是相同的代码。

private void AddReport(MainDocumentPart parent, MemoryStream report)
        {
            using (MemoryStream editingMemoryStream = new MemoryStream())
            {
                report.Position = 0;
                report.CopyTo(editingMemoryStream);
                editingMemoryStream.Position = 0;
                using (WordprocessingDocument newDoc = WordprocessingDocument.Open(editingMemoryStream, true))
                {
                    WP.Body Template = newDoc.MainDocumentPart.Document.Body;
                    var Main = newDoc.MainDocumentPart;
                    var cloneTemplate = Template.CloneNode(true);

                    parent.Document.Body.PrependChild(new WP.Paragraph(new WP.Run(cloneTemplate)));
                    parent.Document.Save();
                }
            }
        }

Word 文档的屏幕截图: 在此处输入图像描述 在此,父文档是我在上述文档之前添加的文档。任何帮助将不胜感激。提前致谢。

标签: c#ms-wordopenxml-sdkmemorystream

解决方案


页眉、页脚和图像不是文档正文的一部分,因此在所描述的场景中不会被转移到另一个文档。

所有这些信息都存储在 Word 文件的“zip 包”中包含的单独“xml 部分”中。该Body部分仅包含引用(“rel”部分中列出的关系 ID,指向/链接到包中包含的相关 xml 部分)。

这可以通过在 Open XML SDK Productivity Tool 中打开文档并检查底层 Word Open XML 来查看。

为了将此类内容复制到另一个文档,不仅需要克隆正文,还需要克隆每个相关的 xml 部分以及您想要的内容,同时动态生成必要的关系 - 这不是一件容易的事。Internet 上的这里和其他地方(包括我的博客 WordMeister)都有一些帖子,展示了如何完成此操作的基础知识,您可以将其用作理解所需方法的起点。

或者,根据父文档是什么,从“新”文档的副本开始并使用其他内容对其进行编辑可能更有意义。

FWIW 并为了完整起见在这里提到:COM 对象模型将执行所描述的操作 - 复制文档的主体并粘贴到另一个文档确实会保留所有这些信息。但是 Word 应用程序正在完成开发人员在使用 Open XML SDK 时需要编写代码的所有“繁重工作”。


推荐阅读