代码之家  ›  专栏  ›  技术社区  ›  Patric

OpenXML:添加新段落时插入lastRenderedPageBreak

  •  2
  • Patric  · 技术社区  · 7 年前

    我用OpenXML添加了一个新段落,如下所示:

    var pSpacerAfterSectorTitle = insertNodeSectorsArea.AppendChild(GetNewParagraph("Arial", 12, true, false, null));
    

    方法如下:

    private static Paragraph GetNewParagraph(string fontName, int fontSize, bool useBold, bool useUnderline, string text)
    {
        var p = new Paragraph();
        var pPr = p.AppendChild(new ParagraphProperties());
        var rPrP = pPr.AppendChild(GetNewRunProperties(fontName, fontSize, useBold, useUnderline));
        var r = p.AppendChild(new Run());
        var rPr = r.AppendChild(GetNewRunProperties(fontName, fontSize, useBold, useUnderline));
        if (!string.IsNullOrEmpty(text))
        {
            r.AppendChild(new Text() { Text = text,
                Space = SpaceProcessingModeValues.Preserve });
        }
        return p;
        }
    }
    

    private static RunProperties GetNewRunProperties(string fontName, int fontSize, bool useBold, bool useUnderline)
        {
            string fontSizeVal = (fontSize * 2).ToString();
    
            var runPr = new RunProperties();
            runPr.AppendChild(new RunFonts() { ComplexScript = fontName });
            if (useBold)
            {
                runPr.AppendChild(new Bold());
            }
            runPr.AppendChild(new FontSize() { Val = fontSizeVal });
            runPr.AppendChild(new FontSizeComplexScript() { Val = fontSizeVal });
            if (useUnderline)
            {
                runPr.AppendChild(new Underline() { Val = UnderlineValues.Single });
            }
            runPr.AppendChild(new Languages() { EastAsia = "de-CH" });
    
            return runPr;
        }
    

    当这一段以这种方式添加时,我会突然得到一个 lastRenderedPageBreak 在第一页,与我在意见中插入段落的位置无关。

    ...<w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr><w:lastRenderedPageBreak/><w:t>Sitzung 20171207 PSC 1</w:t></w:r></w:p>
    

    如果我注释掉添加的段落,则生成的文档不包含此分页符:

    ...<w:b/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr><w:t>Sitzung 20171207 PSC 1</w:t></w:r></w:p>
    

    我检查了我的代码很多次,但我没有创建这样的代码 上次呈现的分页符

    有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   kjhughes    7 年前

    在OOXML中, w:lastRenderedPageBreak 旨在由对文档进行分页的最后一个软件插入,以标记其分页计算的结果。

    所以,要直接回答你的问题, w: 上次呈现的分页符 是在你背后插入的,而不是你自己的代码。

    您可以通过不进行分页的库从MS Word中操纵OOXML以避免这种行为,但请注意 w: 上次呈现的分页符 当文档下次由分页软件呈现和保存时,可能会插入元素。

    还请注意,不幸的是 w:lastRenderedPageBreak is quite unreliable in marking pagination accurately .