c# - 使用 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 文档的屏幕截图: 在此处输入图像描述 在此,父文档是我在上述文档之前添加的文档。任何帮助将不胜感激。提前致谢。
解决方案
页眉、页脚和图像不是文档正文的一部分,因此在所描述的场景中不会被转移到另一个文档。
所有这些信息都存储在 Word 文件的“zip 包”中包含的单独“xml 部分”中。该Body
部分仅包含引用(“rel”部分中列出的关系 ID,指向/链接到包中包含的相关 xml 部分)。
这可以通过在 Open XML SDK Productivity Tool 中打开文档并检查底层 Word Open XML 来查看。
为了将此类内容复制到另一个文档,不仅需要克隆正文,还需要克隆每个相关的 xml 部分以及您想要的内容,同时动态生成必要的关系 - 这不是一件容易的事。Internet 上的这里和其他地方(包括我的博客 WordMeister)都有一些帖子,展示了如何完成此操作的基础知识,您可以将其用作理解所需方法的起点。
或者,根据父文档是什么,从“新”文档的副本开始并使用其他内容对其进行编辑可能更有意义。
FWIW 并为了完整起见在这里提到:COM 对象模型将执行所描述的操作 - 复制文档的主体并粘贴到另一个文档确实会保留所有这些信息。但是 Word 应用程序正在完成开发人员在使用 Open XML SDK 时需要编写代码的所有“繁重工作”。
推荐阅读
- django - Django 2.0 升级导致 Wagtail (2.1) 管理员消失。
- agda - 如何对荒谬/不可构造的类型进行模式匹配?
- java - 对范围和变量的误解
- c++ - cpp浅拷贝或深拷贝中的默认构造函数?
- node.js - 如何将 swagger-ui npm 模块与现有的 OpenAPI 规范文件一起使用
- html - 为什么 div 被 jcarousel 剪掉了?未知问题挑战
- java - 将 jsonobject 附加到现有的 jsonobject
- angularjs - 添加 $setPristine() 时出现意外行为
- selenium-webdriver - 尝试在元素之后选择下一个跨度
- php - 将用户的电子邮件密码存储在数据库中的最安全方法是什么