在企业级应用和信息系统中,PDF 一直是最常见、也是最稳定的文档输出格式之一。无论是财务报表、合同文档、业务统计报告,还是系统自动生成的通知文件,PDF 都具备版式固定、跨平台一致、不可随意修改等优势。因此,在后端代码中动态生成 PDF 文档,几乎是每一个 .NET 项目都会涉及的需求。
相比于依赖 Office 环境或手工拼接 PDF,使用专业的 PDF 组件可以显著降低开发复杂度。本文将围绕 Free Spire.PDF for .NET,系统地介绍如何在 C# 中创建 PDF 文档,并逐步实现以下常见功能:
从零创建 PDF 页面、绘制结构化文本内容、插入业务相关图片、绘制图形元素,以及生成支持分页和样式控制的复杂表格。通过完整示例,你可以快速将这些能力应用到实际项目中。
在实际业务中,PDF 的第一页通常用于展示标题、说明性文字或报告概览,因此文本排版能力尤为重要。Free Spire.PDF 提供了灵活的文本绘制 API,可以同时控制字体、颜色、对齐方式以及行距等样式。
下面的示例演示了如何创建一个 PDF 文档,并在页面中绘制标题与正文说明。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using Spire.Pdf; using Spire.Pdf.Graphics; using System.Drawing;
namespace PdfGenerationTutorial { class AddText { static void Main(string[] args) { PdfDocument doc = new PdfDocument(); PdfPageBase page = doc.Pages.Add();
// 报告标题 PdfTrueTypeFont titleFont = new PdfTrueTypeFont( new Font("微软雅黑", 16f, FontStyle.Bold), true); PdfBrush titleBrush = PdfBrushes.DarkSlateBlue;
page.Canvas.DrawString( "2025 年度销售数据分析报告", titleFont, titleBrush, 60, 40 );
// 报告正文说明 string description = "本报告用于汇总展示公司 2025 年度的核心销售数据," + "内容涵盖主要产品的销售数量、单价及总金额统计。" + "通过系统自动生成 PDF 文档,可以确保数据的一致性和可追溯性," + "同时减少人工整理报表的工作量,适用于内部汇报、管理决策及归档场景。";
PdfTrueTypeFont bodyFont = new PdfTrueTypeFont( new Font("宋体", 11f), true); PdfBrush bodyBrush = PdfBrushes.Black;
RectangleF textArea = new RectangleF( 60, 90, page.Canvas.ClientSize.Width - 120, page.Canvas.ClientSize.Height - 160 );
PdfStringFormat textFormat = new PdfStringFormat(); textFormat.Alignment = PdfTextAlignment.Justify; textFormat.LineSpacing = 18f;
page.Canvas.DrawString( description, bodyFont, bodyBrush, textArea, textFormat );
doc.SaveToFile("Report_Text.pdf"); doc.Dispose(); } } } |
运行该代码,将生成如下 PDF 文档:

在这个示例中,标题与正文使用了不同的字体大小和颜色,并通过 RectangleF 明确限定了文本绘制区域。这样做的好处是,无论文本内容长度如何变化,布局都能保持稳定,同时自动处理换行问题。
除了文本内容,图片在 PDF 中同样扮演着重要角色。例如企业 Logo、产品示意图、审批章或背景水印,都会频繁出现在正式文档中。
下面的代码展示了三种常见图片使用方式:普通插入、缩放展示以及半透明水印。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using Spire.Pdf; using Spire.Pdf.Graphics; using System.Drawing;
namespace PdfGenerationTutorial { class AddImage { static void Main(string[] args) { PdfDocument doc = new PdfDocument(); PdfPageBase page = doc.Pages.Add();
Image image = Image.FromFile("company_logo.png"); PdfImage pdfImage = PdfImage.FromImage(image);
// 左上角插入公司 Logo page.Canvas.DrawImage(pdfImage, 50, 50, 120, 60);
// 页面中部插入示意图 RectangleF imageArea = new RectangleF(50, 150, 220, 140); page.Canvas.DrawImage(pdfImage, imageArea);
// 页面居中水印 float pageWidth = page.Canvas.ClientSize.Width; float pageHeight = page.Canvas.ClientSize.Height;
float wmWidth = pdfImage.Width * 0.4f; float wmHeight = pdfImage.Height * 0.4f; float x = (pageWidth - wmWidth) / 2; float y = (pageHeight - wmHeight) / 2;
page.Canvas.Save(); page.Canvas.SetTransparency(0.25f, 0.25f, PdfBlendMode.Multiply); page.Canvas.DrawImage(pdfImage, x, y, wmWidth, wmHeight); page.Canvas.Restore();
doc.SaveToFile("Report_Image.pdf"); doc.Dispose(); } } } |
生成文档示例:

通过 SetTransparency 方法,可以轻松实现 PDF 水印效果。这在合同、报价单和内部资料中非常常见,既能体现品牌,又不会影响正文内容的可读性。
在报表类 PDF 中,线条、矩形或简单图形常用于分隔内容区域,增强页面结构感。Free Spire.PDF 提供了与 GDI+ 类似的绘图接口,使用起来非常直观。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using Spire.Pdf; using Spire.Pdf.Graphics; using System.Drawing;
namespace PdfGenerationTutorial { class Shapes { static void Main(string[] args) { PdfDocument doc = new PdfDocument(); PdfPageBase page = doc.Pages.Add();
// 分割线 PdfPen linePen = new PdfPen(Color.DarkGray, 1.5f); page.Canvas.DrawLine(linePen, 50, 80, 500, 80);
// 信息块背景 PdfPen rectPen = new PdfPen(Color.SteelBlue, 1f); PdfBrush rectBrush = new PdfSolidBrush(Color.AliceBlue); page.Canvas.DrawRectangle(rectPen, rectBrush, 50, 100, 200, 90);
// 高亮标识 PdfPen circlePen = new PdfPen(Color.Orange, 2f); PdfBrush circleBrush = new PdfSolidBrush(Color.Moccasin); page.Canvas.DrawEllipse(circlePen, circleBrush, 300, 120, 60, 60);
doc.SaveToFile("Report_Shapes.pdf"); doc.Close(); } } } |
运行该代码,将生成如下 PDF 文档:

这些基础图形虽然简单,但在实际报表中可以用于突出重点数据区域或增强整体排版层次。
PDF 表格是业务系统中最常见、也是最复杂的输出形式之一。下面的示例模拟了一个“产品销售明细表”,并演示如何设置表头样式、隔行背景以及跨页重复表头。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
using Spire.Pdf; using Spire.Pdf.Graphics; using Spire.Pdf.Tables; using System.Data; using System.Drawing;
namespace PdfGenerationTutorial { class DataTableExample { static void Main(string[] args) { PdfDocument doc = new PdfDocument(); PdfPageBase page = doc.Pages.Add();
DataTable tableData = new DataTable(); tableData.Columns.Add("编号"); tableData.Columns.Add("产品名称"); tableData.Columns.Add("单价(元)"); tableData.Columns.Add("销量"); tableData.Columns.Add("销售额(元)");
for (int i = 0; i < 25; i++) { decimal price = 49.9m + i; int qty = i + 2; tableData.Rows.Add( i + 1, $"智能设备型号-{i + 1}", price, qty, price * qty ); }
PdfTable table = new PdfTable(); table.DataSource = tableData;
table.Style.BorderPen = new PdfPen(Color.Gray, 0.5f); table.Style.DefaultStyle.Font = new PdfTrueTypeFont(new Font("微软雅黑", 10f), true); table.Style.DefaultStyle.StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
table.Style.HeaderSource = PdfHeaderSource.Rows; table.Style.HeaderRowCount = 1; table.Style.ShowHeader = true; table.Style.HeaderStyle.BackgroundBrush = new PdfSolidBrush(Color.LightSkyBlue); table.Style.HeaderStyle.Font = new PdfTrueTypeFont(new Font("微软雅黑", 11f, FontStyle.Bold), true); table.Style.RepeatHeader = true;
table.Style.AlternateStyle = new PdfCellStyle(); table.Style.AlternateStyle.BackgroundBrush = new PdfSolidBrush(Color.WhiteSmoke); table.Style.AlternateStyle.StringFormat = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
table.Columns[0].Width = 50; table.Columns[1].Width = 160; table.Columns[2].Width = 90; table.Columns[3].Width = 70; table.Columns[4].Width = 100;
table.Draw(page, new PointF(40, 50));
doc.SaveToFile("Sales_Table.pdf"); doc.Close(); } } } |
生成的 PDF 文档如下:

在这个场景中,即使数据行数超过一页,表格也会自动分页,并在每一页顶部重复显示表头,非常适合正式业务报表的生成需求。
| 类 / 属性 / 方法 | 说明 |
|---|---|
| PdfDocument | 表示一个 PDF 文档对象,所有页面和内容都基于该对象创建 |
| PdfDocument.Pages.Add() | 向文档中添加一个新的 PDF 页面 |
| PdfPageBase | 表示 PDF 中的单个页面,所有绘制操作都在此进行 |
| page.Canvas | 页面画布对象,用于绘制文本、图片、图形等元素 |
| PdfTrueTypeFont | 使用系统字体创建 PDF 字体,支持中文显示 |
| PdfBrush / PdfPen | 分别用于填充颜色和描边绘制 |
| Canvas.DrawString() | 在指定位置或区域绘制文本内容 |
| PdfStringFormat | 控制文本对齐方式、行距、段落布局 |
| RectangleF | 定义文本或图片的绘制区域,用于布局控制 |
| PdfImage.FromImage() | 将 System.Drawing.Image 转换为 PDF 可用图片 |
| Canvas.DrawImage() | 在页面中绘制图片,支持缩放和定位 |
| Canvas.SetTransparency() | 设置绘制内容透明度,常用于水印效果 |
| PdfTable | 用于创建 PDF 表格并绑定数据源 |
| PdfTable.DataSource | 绑定 DataTable 或其他数据集合 |
| PdfTable.Style | 统一控制表格边框、字体、背景等样式 |
| PdfTable.Draw() | 将表格绘制到指定页面位置 |
| PdfDocument.SaveToFile() | 将 PDF 文档保存为文件 |
| PdfDocument.Dispose() / Close() | 释放资源,结束文档操作 |
通过本文的完整示例,可以看到使用 Free Spire.PDF for .NET 在 C# 中创建 PDF 文档,并不是零散 API 的堆砌,而是一个可系统化设计的文档生成过程。从页面初始化、内容布局,到数据驱动的表格输出,都可以通过清晰、可维护的代码完成。
对于需要长期输出业务报表、系统凭证或归档文档的 .NET 项目而言,这种方式不仅能够提升开发效率,也有助于保持文档风格的一致性和专业性。只要合理规划页面结构和数据来源,就可以将 PDF 生成作为系统中一个稳定、可靠的基础能力来使用。