【问题标题】:Issue when paragraph falls into new line Open XML段落落入新行 Open XML 时的问题
【发布时间】:2026-02-11 03:30:02
【问题描述】:

我有许多图像要插入到文档中,这些替换内容与替换段落所在的页面不同。这似乎是当我尝试在 MS Word 中打开生成的文档时出现修复弹出窗口的原因。 这是我用来复制图像的代码:

tbl.Drawing drawing = buildImage(doc.MainDocumentPart.GetIdOfPart(imagePart), heightEmus, widthEmus);
tbl.Paragraph paragraph1 = new tbl.Paragraph();
tbl.ParagraphProperties paragraphProperties1 = new tbl.ParagraphProperties();
KeepLines keepLines1 = new KeepLines();
paragraphProperties1.Append(keepLines1);
BookmarkStart bookmarkStart1 = new BookmarkStart() { Name = "_GoBack", Id = "0" };
tbl.Run run1 = new tbl.Run();
LastRenderedPageBreak lastRenderedPageBreak1 = new LastRenderedPageBreak();
run1.Append(lastRenderedPageBreak1);
run1.Append(drawing);
BookmarkEnd bookmarkEnd1 = new BookmarkEnd() { Id = "0" };
paragraph1.Append(paragraphProperties1);
paragraph1.Append(bookmarkStart1);
paragraph1.Append(run1);
paragraph1.Append(bookmarkEnd1);
paragraph.InsertAfterSelf(paragraph1);

在尝试了几种方法后,我受到这篇文章的启发: OpenXml - How to identify whether the paragraph extends to next page

xml看起来是这样的(左边是修复的,右边是损坏的):

【问题讨论】:

  • 尽量不要添加 LastRenderedPageBreak 属性。 Word 将在下次打开文档时重新计算页面布局(换行符和分页符),无论上次保存和关闭文档时它们在哪里。如果 Word 不存在,它就无关紧要......
  • 我没加,还是一样
  • 尝试使用OpenXml productivity tool - 您可以将文档加载到其中并点击“验证”按钮以找出文件中无效的内容。
  • 该选项在两个文件上产生相同的结果
  • 好吧,修复文件中不在“坏”文件中的另一件事是 rPr (RunProperties)。更确切地说,Word 在那里添加了哪些不在您的代码中的内容?使用生产力工具的代码生成部分来获取 Word 想要修复的文档并将其合并到您的代码中。

标签: c# .net xml openxml openxml-sdk


【解决方案1】:

我不认为(但不确定)问题在于 w:lastRenderedPageBreak。我怀疑我没有看到导致 Word 失败的确切问题。

当我遇到这些类型的问题时,我会使用“二进制搜索”方法 - 删除标记直到 Word 打开而不失败,然后重新添加标记直到它失败。不幸的是,这基本上是当 Word 无法打开时我们可以采取的唯一方法。我们没有从 Word 获得任何关于失败原因的信息。

前段时间,我录制了一个截屏视频,解释了我在面对这种情况时所采取的方法。

https://www.youtube.com/watch?v=xAnmxPqP_5A

【讨论】:

  • 有时你只需要一双额外的眼睛 :)