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