在當(dāng)今的開發(fā)環(huán)境中,選擇一個可靠且功能強(qiáng)大的庫是至關(guān)重要的。今天,我想向大家推薦一個現(xiàn)代開源的.NET庫——QuestPDF,它專注于PDF文檔的生成。
什么是QuestPDF?
QuestPDF是一個現(xiàn)代的開源.NET庫,專門用于PDF文檔的生成。它提供了一個全面的布局引擎,并通過簡潔且易于發(fā)現(xiàn)的C# Fluent API進(jìn)行操作。以下是QuestPDF的一些主要特點(diǎn):
代碼設(shè)計PDF文檔:使用C#進(jìn)行PDF文檔設(shè)計,完全采用代碼的方式。充分利用版本控制系統(tǒng)的優(yōu)勢。
強(qiáng)大的結(jié)構(gòu)元素:可以使用文本、圖像、邊框、表格等多種結(jié)構(gòu)元素來組成PDF文檔。
全面的布局引擎:專為PDF文檔生成和分頁支持而設(shè)計的布局引擎。
簡潔易懂的API:使用簡潔且易于理解的C# Fluent API編寫代碼,并利用IntelliSense快速發(fā)現(xiàn)可用選項。
熱重載功能:節(jié)省時間的熱重載功能,允許在不重新編譯代碼的情況下實(shí)時預(yù)覽PDF文檔。
GitHub
https://github.com/QuestPDF/QuestPDF
為什么選擇QuestPDF?
選擇一個項目依賴項可能是困難的。我們需要確保項目的穩(wěn)定性和可維護(hù)性。調(diào)查顯示,GitHub星標(biāo)數(shù)量在評估庫質(zhì)量時起著重要作用。因此,請為這個倉庫點(diǎn)個星標(biāo),這只需要幾秒鐘,但能幫助成千上萬的開發(fā)者!
如何開始?
開始探索QuestPDF庫吧!只需250行C#代碼,您就可以創(chuàng)建一個功能齊全的PDF發(fā)票實(shí)現(xiàn)。閱讀入門教程,熟悉庫的總體架構(gòu)、重要的布局結(jié)構(gòu)以及有用的模式和實(shí)踐。輕松開始設(shè)計您的PDF文檔、報告、發(fā)票等。
git clone https://github.com/QuestPDF/QuestPDF.git
安裝QuestPDF
在開始使用QuestPDF之前,你需要在項目中安裝它。你可以通過NuGet包管理器來完成這一操作。打開NuGet包管理器控制臺并運(yùn)行以下命令:
或者在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
{
// 定義文檔的元數(shù)據(jù)
public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
// 定義文檔的內(nèi)容和結(jié)構(gòu)
public void Compose(IDocumentContainer container)
{
// 配置頁面
container
.Page(page =>
{
// 設(shè)置頁面的邊距
page.Margin(50);
// 設(shè)置頁面大小為A4
page.Size(PageSizes.A4);
// 設(shè)置頁面背景顏色為白色
page.PageColor(Colors.White);
// 定義頁眉
page.Header()
.Text("QuestPDF Example") // 頁眉文本
.FontSize(20) // 字體大小
.Bold() // 加粗
.AlignCenter(); // 居中對齊
// 定義頁面內(nèi)容
page.Content()
.PaddingVertical(10) // 設(shè)置內(nèi)容的垂直內(nèi)邊距
.Column(column =>
{
// 設(shè)置列間距
column.Spacing(20);
// 添加文本項
column.Item().Text("Hello, QuestPDF!");
// 添加圖片項
column.Item().Image("img.png");
});
// 定義頁腳
page.Footer()
.AlignCenter() // 居中對齊
.Text(x =>
{
// 頁腳文本內(nèi)容,包含當(dāng)前頁碼和總頁數(shù)
x.Span("Page ");
x.CurrentPageNumber(); // 當(dāng)前頁碼
x.Span(" of ");
x.TotalPages(); // 總頁數(shù)
});
});
}
}
}
internal class Program
{
static void Main(string[] args)
{
QuestPDF.Settings.License = new QuestPDF.Infrastructure.LicenseType();//防止證書需要提示出錯
var document = new SimpleDocument();
// 生成PDF文件
document.GeneratePdf("example.pdf");
}
}
運(yùn)行后,生成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);
// 表格標(biāo)題
column.Item().Text("Sample Table").FontSize(16).Bold().AlignCenter();
// 創(chuàng)建表格
column.Item().Table(table =>
{
// 設(shè)置表格列數(shù)
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);
}
});
// 表格內(nèi)容
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);
// 圖表標(biāo)題
column.Item().Text("Sample Chart").FontSize(16).Bold().AlignCenter();
// 創(chuàng)建圖表
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;
// 創(chuàng)建SKPictureRecorder
using var recorder = new SKPictureRecorder();
var canvas = recorder.BeginRecording(new SKRect(0, 0, width, height));
// 示例數(shù)據(jù)
var data = new[] { 10, 20, 30, 40, 50 };
var maxData = 50;
// 創(chuàng)建畫筆
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);
}
// 獲取繪制內(nèi)容
var picture = recorder.EndRecording();
// 將SKPicture轉(zhuǎn)換為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());
}
}
}
結(jié)語
QuestPDF是一個強(qiáng)大且易于使用的工具,適合任何需要生成PDF文檔的.NET開發(fā)者。無論您是需要生成報告、發(fā)票還是其他類型的文檔,QuestPDF都能滿足您的需求。立即開始使用QuestPDF,體驗其強(qiáng)大的功能和簡潔的API設(shè)計吧!
更多信息請訪問QuestPDF官網(wǎng)。
該文章在 2024/6/8 23:57:24 編輯過