项目

QuestPDF 创建领域专用语言(DSL)

现有的流式 API 提供了一种清晰且易于理解的方式来描述文档的结构。在编写文档时,你可能会发现许多部分使用了相似的样式,例如边框或背景。特别是当你需要维护文档一致性时,这种情况尤为明显。为了使未来的修改变得更简单,你可以将这些重复的样式代码提取到单独的扩展方法中。这样,你可以在不增加代码复杂性的情况下,为文档结构赋予有意义的名称。

下面的例子中,我们将创建一个简单的表格,其中标签单元格有灰色背景,值单元格有白色背景。首先,我们来创建相应的扩展方法:

static class SimpleExtension
{
    private static IContainer Cell(this IContainer container, bool dark)
    {
        return container
            .Border(1) // 边框宽度为1像素
            .Background(dark ? Colors.Grey.Lighten2 : Colors.White) // 根据dark参数设置背景色
            .Padding(10); // 内边距为10像素
    }

    // 只显示文本标签
    public static void LabelCell(this IContainer container, string text) => container.Cell(true).Text(text).Medium(); // 设置文本字体大小为中等

    // 允许注入任何类型的内容,如图像
    public static IContainer ValueCell(this IContainer container) => container.Cell(false);
}

现在,你可以使用新创建的领域专用语言(DSL)来构建表格:

.Grid(grid =>
{
    grid.Columns(10); // 设置列数为10

    for (var i = 1; i <= 4; i++)
    {
        grid.Item(2).LabelCell(Placeholders.Label()); // 在第2行插入标签单元格
        grid.Item(3).ValueCell().Image(Placeholders.Image(200, 150)); // 在第3行插入值单元格,并添加图像
    }
});

这个例子会生成以下输出:

示例

请注意,此示例仅展示了如何使用扩展方法构建自定义 API 元素的概念。你可以利用这种方法构建和重用更复杂的结构。例如,扩展方法可以接受参数。

在本文档中