如何在MigraDoc / PDFsharp中创建项目符号列表

15
即使阅读了这篇论坛帖子后,使用migradoc / pdfsharp创建带项目符号的列表仍然很难理解。我基本上想像这样显示一组项目:
  • Dodge
  • Nissan
  • Ford
  • Chevy
4个回答

22

这是一个示例(在HelloWorld示例中添加了几行代码):

// Add some text to the paragraph
paragraph.AddFormattedText("Hello, World!", TextFormat.Italic);

// Add Bulletlist begin
Style style = document.AddStyle("MyBulletList", "Normal");
style.ParagraphFormat.LeftIndent = "0.5cm";
string[] items = "Dodge|Nissan|Ford|Chevy".Split('|');
for (int idx = 0; idx < items.Length; ++idx)
{
  ListInfo listinfo = new ListInfo();
  listinfo.ContinuePreviousList = idx > 0;
  listinfo.ListType = ListType.BulletList1;
  paragraph = section.AddParagraph(items[idx]);
  paragraph.Style = "MyBulletList";
  paragraph.Format.ListInfo = listinfo;
}
// Add Bulletlist end

return document;

我没使用AddToList方法将所有内容放在一个地方。在真实的应用程序中,我会使用这个方法(它是一个用户定义的方法,在这个线程中提供了代码)。


3
好的,谢谢。我会将这个细节添加到样式中,使其右对齐:style.ParagraphFormat.LeftIndent = "1cm"; style.ParagraphFormat.FirstLineIndent = "-0.5cm"; - Spiky
1
我有点困惑。每个项目符号列表都被视为一个段落吗? - Sabareesh Kkanan
3
@Sabareesh Kkanan:每个项目符号是一个段落,项目符号列表是一系列段落。如果一个条目跨越多行,则可以进行高级格式设置(例如首行缩进)。 - I liked the old Stack Overflow
谢谢Matt!那正是我所需要的。哦,我喜欢你在《老友记》中的表现。 - Ryan

10
比上面的答案更加简洁一点:
var document = new Document();

var style = document.AddStyle("BulletList", "Normal");
style.ParagraphFormat.LeftIndent = "0.5cm";
style.ParagraphFormat.ListInfo = new ListInfo
{
    ContinuePreviousList = true,
    ListType = ListType.BulletList1
};

var section = document.AddSection();
section.AddParagraph("Bullet 1", "BulletList");
section.AddParagraph("Bullet 2", "BulletList");

样式只需创建一次,包括列表信息,并可在任何地方重复使用。


重复使用ListInfo对于编号列表是无效的。对于带有多个项目符号列表的RTF文件生成,我也不会重复使用它。 - I liked the old Stack Overflow
@User241.007 我没有意识到这种方法不适用于带编号的列表或RTF文件。然而,对于PDF文件,这种方法可以很好地工作,也适用于多个项目符号列表。我会保留这个答案,因为至少对于pdf,这种方法可以节省很多代码(您只需要定义listinfo一次)。 - Robin van der Knaap
如果段落太长,下一行没有正确缩进,您是否可以设置此选项? - MIKE
@MIKE style.ParagraphFormat.LeftIndent = "1cm"; style.ParagraphFormat.FirstLineIndent = "-0.5cm"; 我是用这种方法解决的,不确定是否有更好的替代方案。 - Robin van der Knaap

3

使用PDFsharp需要自己绘制项目符号。

使用MigraDoc,您可以添加一个段落,并为该段落设置paragraph.Format.ListInfo以创建项目符号列表。

链接的线程显示了两个帮助程序:

DefineList()仅设置一个成员变量,以便下次创建新列表。

AddToList()对于每个条目都会调用。

只需调用DefineList()开始新的项目符号列表,然后为每个条目调用AddToList()。 DefineList()对于编号列表有很大的作用。

根据您的需要调整帮助程序。


你有这方面的示例代码吗?我还是无法让它正常工作。 - leora

0
我发现这个帮助类和扩展方法使得管理不同的列表(包括有序和无序列表)变得更简单。只需在想要创建新列表的部分使用扩展方法,即可获得一个新的列表上下文。然后,在列表上下文中调用AddListItem方法,以获得一个新的段落来添加你的内容。
当你需要开始一个新的列表时,只需再次调用扩展方法,以获取一个新的列表上下文。
using MigraDoc.DocumentObjectModel;

public static class ListHelper
{
    /// <summary>
    /// Start a new list in the current section.
    /// </summary>
    /// <param name="section"></param>
    /// <param name="listType"></param>
    /// <returns></returns>
    public static ListContext NewItemList(this Section section, ListType listType)
    {
        return new ListContext(section, listType);
    }
}

public class ListContext
{
    private readonly Section section;
    private readonly ListType listType;
    private bool isFirstItem;

    public ListContext(Section section, ListType listType)
    {
        this.section = section;
        this.listType = listType;
        this.isFirstItem = true;
    }

    /// <summary>
    /// Returns a new paragraph to add the content for the list item.
    /// </summary>
    /// <returns></returns>
    public Paragraph AddListItem()
    {
        var par = section.AddParagraph();

        par.Format.LeftIndent = "0.5cm";
        var listInfo = new ListInfo()
        {
            ListType = listType,
            ContinuePreviousList = !isFirstItem
        };
        isFirstItem = false;
        par.Format.ListInfo = listInfo;

        return par;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接