在当今的开发环境中,选择一个可靠且功能强大的库是至关重要的。今天,我想向大家推荐一个现代开源的.NET库——QuestPDF,它专注于PDF文档的生成。
什么是QuestPDF?
QuestPDF是一个现代的开源.NET库,专门用于PDF文档的生成。它提供了一个全面的布局引擎,并通过简洁且易于发现的C# Fluent API进行操作。以下是QuestPDF的一些主要特点:
代码设计PDF文档:使用C#进行PDF文档设计,完全采用代码的方式。充分利用版本控制系统的优势。
强大的结构元素:可以使用文本、图像、边框、表格等多种结构元素来组成PDF文档。
全面的布局引擎:专为PDF文档生成和分页支持而设计的布局引擎。
简洁易懂的API:使用简洁且易于理解的C# Fluent API编写代码,并利用IntelliSense快速发现可用选项。
热重载功能:节省时间的热重载功能,允许在不重新编译代码的情况下实时预览PDF文档。
GitHub
https://github.com/QuestPDF/QuestPDF
为什么选择QuestPDF?
选择一个项目依赖项可能是困难的。我们需要确保项目的稳定性和可维护性。调查显示,GitHub星标数量在评估库质量时起着重要作用。因此,请为这个仓库点个星标,这只需要几秒钟,但能帮助成千上万的开发者!
如何开始?
开始探索QuestPDF库吧!只需250行C#代码,您就可以创建一个功能齐全的PDF发票实现。阅读入门教程,熟悉库的总体架构、重要的布局结构以及有用的模式和实践。轻松开始设计您的PDF文档、报告、发票等。
git clone https://github.com/QuestPDF/QuestPDF.git
安装QuestPDF
在开始使用QuestPDF之前,你需要在项目中安装它。你可以通过NuGet包管理器来完成这一操作。打开NuGet包管理器控制台并运行以下命令:
或者在Visual Studio中,你可以通过“管理NuGet包”选项来搜索并安装QuestPDF。
快速入门
以下例子为直接引用项目,所做的测试
下面是一个简单的示例,展示了如何使用QuestPDF生成一个基本的PDF文档。
示例1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace TestApp
{
public class SimpleDocument : IDocument
{
// 定义文档的元数据
public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
// 定义文档的内容和结构
public void Compose(IDocumentContainer container)
{
// 配置页面
container
.Page(page =>
{
// 设置页面的边距
page.Margin(50);
// 设置页面大小为A4
page.Size(PageSizes.A4);
// 设置页面背景颜色为白色
page.PageColor(Colors.White);
// 定义页眉
page.Header()
.Text("QuestPDF Example") // 页眉文本
.FontSize(20) // 字体大小
.Bold() // 加粗
.AlignCenter(); // 居中对齐
// 定义页面内容
page.Content()
.PaddingVertical(10) // 设置内容的垂直内边距
.Column(column =>
{
// 设置列间距
column.Spacing(20);
// 添加文本项
column.Item().Text("Hello, QuestPDF!");
// 添加图片项
column.Item().Image("img.png");
});
// 定义页脚
page.Footer()
.AlignCenter() // 居中对齐
.Text(x =>
{
// 页脚文本内容,包含当前页码和总页数
x.Span("Page ");
x.CurrentPageNumber(); // 当前页码
x.Span(" of ");
x.TotalPages(); // 总页数
});
});
}
}
}
internal class Program
{
static void Main(string[] args)
{
QuestPDF.Settings.License = new QuestPDF.Infrastructure.LicenseType();//防止证书需要提示出错
var document = new SimpleDocument();
// 生成PDF文件
document.GeneratePdf("example.pdf");
}
}
运行后,生成pdf文件。
示例表格2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace TestApp
{
public class TableDocument : IDocument
{
public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
public void Compose(IDocumentContainer container)
{
container
.Page(page =>
{
page.Margin(50);
page.Size(PageSizes.A4);
page.PageColor(Colors.White);
page.Header()
.Text("Table Example")
.FontSize(20)
.Bold()
.AlignCenter();
page.Content()
.PaddingVertical(10)
.Column(column =>
{
column.Spacing(20);
// 表格标题
column.Item().Text("Sample Table").FontSize(16).Bold().AlignCenter();
// 创建表格
column.Item().Table(table =>
{
// 设置表格列数
table.ColumnsDefinition(columns =>
{
columns.RelativeColumn(2); // 第一列相对宽度为2
columns.RelativeColumn(3); // 第二列相对宽度为3
columns.RelativeColumn(2); // 第三列相对宽度为2
});
// 表头
table.Header(header =>
{
header.Cell().Element(CellStyle).Text("ID");
header.Cell().Element(CellStyle).Text("Name");
header.Cell().Element(CellStyle).Text("Age");
// 定义单元格样式
static IContainer CellStyle(IContainer container)
{
return container
.Padding(5)
.Background(Colors.Grey.Lighten2)
.Border(1)
.BorderColor(Colors.Black);
}
});
// 表格内容
for (int i = 1; i <= 10; i++)
{
table.Cell().Element(CellStyle).Text(i.ToString());
table.Cell().Element(CellStyle).Text($"Name {i}");
table.Cell().Element(CellStyle).Text((20 + i).ToString());
}
// 定义单元格样式
static IContainer CellStyle(IContainer container)
{
return container
.Padding(5)
.Border(1)
.BorderColor(Colors.Grey.Lighten1);
}
});
});
page.Footer()
.AlignCenter()
.Text(x =>
{
x.Span("Page ");
x.CurrentPageNumber();
x.Span(" of ");
x.TotalPages();
});
});
}
}
}
示例图表2
Nuget安装
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using SkiaSharp;
using SkiaSharp.Extended.Svg;
namespace TestApp
{
public class ChartDocument : IDocument
{
public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
public void Compose(IDocumentContainer container)
{
container
.Page(page =>
{
page.Margin(50);
page.Size(PageSizes.A4);
page.PageColor(Colors.White);
page.Header()
.Text("Chart Example")
.FontSize(20)
.Bold()
.AlignCenter();
page.Content()
.PaddingVertical(10)
.Column(column =>
{
column.Spacing(20);
// 图表标题
column.Item().Text("Sample Chart").FontSize(16).Bold().AlignCenter();
// 创建图表
var svgContent = GenerateSvgChart();
column.Item().Svg(svgContent);
});
page.Footer()
.AlignCenter()
.Text(x =>
{
x.Span("Page ");
x.CurrentPageNumber();
x.Span(" of ");
x.TotalPages();
});
});
}
private string GenerateSvgChart()
{
var width = 600;
var height = 400;
// 创建SKPictureRecorder
using var recorder = new SKPictureRecorder();
var canvas = recorder.BeginRecording(new SKRect(0, 0, width, height));
// 示例数据
var data = new[] { 10, 20, 30, 40, 50 };
var maxData = 50;
// 创建画笔
using var paint = new SKPaint
{
Color = SKColors.Blue,
IsAntialias = true,
Style = SKPaintStyle.Fill,
StrokeWidth = 2
};
// 计算条形图的宽度和间距
var barWidth = width / (data.Length * 2);
var spacing = barWidth;
for (int i = 0; i < data.Length; i++)
{
// 计算条形图的高度
var barHeight = (data[i] / (float)maxData) * height;
// 绘制条形图
var rect = new SKRect(
i * (barWidth + spacing),
height - barHeight,
i * (barWidth + spacing) + barWidth,
height
);
canvas.DrawRect(rect, paint);
}
// 获取绘制内容
var picture = recorder.EndRecording();
// 将SKPicture转换为SVG
using var svgStream = new MemoryStream();
var svgCanvas = SKSvgCanvas.Create(new SKRect(0, 0, width, height), svgStream);
svgCanvas.DrawPicture(picture);
svgCanvas.Dispose();
return System.Text.Encoding.UTF8.GetString(svgStream.ToArray());
}
}
}
结语
QuestPDF是一个强大且易于使用的工具,适合任何需要生成PDF文档的.NET开发者。无论您是需要生成报告、发票还是其他类型的文档,QuestPDF都能满足您的需求。立即开始使用QuestPDF,体验其强大的功能和简洁的API设计吧!
更多信息请访问QuestPDF官网。
该文章在 2024/6/8 23:57:24 编辑过