首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Migradoc和嵌套段落

Migradoc和嵌套段落
EN

Stack Overflow用户
提问于 2014-08-11 18:57:00
回答 2查看 512关注 0票数 0

我正在使用Ben Foster的Migradoc扩展来格式化一个使用Markdown语法的PDF文档。

在列表中使用头或子列表(<hx><li>元素)时,我遇到了一个问题(抛出了一个空引用异常)。问题是详细的here

问题的根本原因是Migradoc不支持嵌套段落。

有没有可能解决此问题的方法?

EN

回答 2

Stack Overflow用户

发布于 2014-08-11 19:35:55

你会问“这个问题有没有可能的变通办法?”

MigraDoc能够创建PDF和RTF。RTF (Word)支持嵌套段落吗?

可能不会。我认为这不是MigraDoc的问题。

嵌套列表在MigraDoc中是可能的,但可能需要更改扩展。IIRC当涉及编号列表时,嵌套有一定的限制。

IMHO嵌套段落没有意义。MigraDoc支持允许在单个段落中使用不同格式的AddFormattedText。这可能需要改变扩展和/或给扩展的输入。

票数 0
EN

Stack Overflow用户

发布于 2015-11-14 18:49:57

嘿,我也一直在使用Ben Foster的Migradoc扩展,也遇到了同样的问题。这可能并不完美,但对我来说已经足够好了。修改您的HtmlConverter.cs并执行以下操作:

首先,添加一个全局变量:

代码语言:javascript
复制
private int _nestedListLevel;

接下来,向AddDefaultNodeHandlers()方法添加两个新的节点处理程序:

代码语言:javascript
复制
nodeHandlers.Add("ul", (node, parent) =>
{
    if (parent is Paragraph)
    {
        _nestedListLevel++;
        return parent.Section;
    }

    _nestedListLevel = 0;
    return parent;
});

nodeHandlers.Add("ol", (node, parent) =>
{
    if (parent is Paragraph)
    {
        _nestedListLevel++;
        return parent.Section;
    }

    _nestedListLevel = 0;
    return parent;
});

最后,将"li“节点处理程序更改为以下内容...请注意,这删除了他所做的一些样式工作,但它使我的事情变得更简单,并且工作得很好。如果你愿意,你可以重新添加这些东西。

代码语言:javascript
复制
nodeHandlers.Add("li", (node, parent) =>
{
    var listStyle = node.ParentNode.Name == "ul"
        ? "UnorderedList"
        : "OrderedList";

    var section = (Section)parent;
    var isFirst = node.ParentNode.Elements("li").First() == node;
    var isLast = node.ParentNode.Elements("li").Last() == node;

    var listItem = section.AddParagraph().SetStyle(listStyle);

    if (listStyle == "UnorderedList")
    {
        listItem.Format.ListInfo.ListType = _nestedListLevel%2 == 1 ? ListType.BulletList2 : ListType.BulletList1;
    }
    else
    {
        listItem.Format.ListInfo.ListType = _nestedListLevel % 2 == 1 ? ListType.NumberList2 : ListType.NumberList1;
    }

    if (_nestedListLevel > 0)
    {
        listItem.Format.LeftIndent = String.Format(CultureInfo.InvariantCulture, "{0}in", _nestedListLevel*.75);
    }

    // disable continuation if this is the first list item
    listItem.Format.ListInfo.ContinuePreviousList = !isFirst;

    if (isLast)
        _nestedListLevel--;

    return listItem;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25241609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档