在企業級應用和信息系統中,PDF 一直是最常見、也是最穩定的文檔輸出格式之一。無論是財務報表、合同文檔、業務統計報告,還是系統自動生成的通知文件,PDF 都具備版式固定、跨平台一致、不可隨意修改等優勢。因此,在後端代碼中動態生成 PDF 文檔,幾乎是每一個 .NET 項目都會涉及的需求。
相比於依賴 Office 環境或手工拼接 PDF,使用專業的 PDF 組件可以顯著降低開發複雜度。本文將圍繞 Free Spire.PDF for .NET,系統地介紹如何在 C# 中創建 PDF 文檔,並逐步實現以下常見功能:
從零創建 PDF 頁面、繪製結構化文本內容、插入業務相關圖片、繪製圖形元素,以及生成支持分頁和樣式控制的複雜表格。通過完整示例,你可以快速將這些能力應用到實際項目中。
一、創建 PDF 文檔並繪製結構化文本內容
在實際業務中,PDF 的第一頁通常用於展示標題、説明性文字或報告概覽,因此文本排版能力尤為重要。Free Spire.PDF 提供了靈活的文本繪製 API,可以同時控制字體、顏色、對齊方式以及行距等樣式。
下面的示例演示瞭如何創建一個 PDF 文檔,並在頁面中繪製標題與正文説明。
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 中插入圖片並作為頁面視覺元素或水印
除了文本內容,圖片在 PDF 中同樣扮演着重要角色。例如企業 Logo、產品示意圖、審批章或背景水印,都會頻繁出現在正式文檔中。
下面的代碼展示了三種常見圖片使用方式:普通插入、縮放展示以及半透明水印。
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+ 類似的繪圖接口,使用起來非常直觀。
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 表格是業務系統中最常見、也是最複雜的輸出形式之一。下面的示例模擬了一個“產品銷售明細表”,並演示如何設置表頭樣式、隔行背景以及跨頁重複表頭。
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() |
釋放資源,結束文檔操作 |
更多 PDF 文檔操作技巧請前往 Spire.PDF for .NET 官方文檔查看。
總結
通過本文的完整示例,可以看到使用 Free Spire.PDF for .NET 在 C# 中創建 PDF 文檔,並不是零散 API 的堆砌,而是一個可系統化設計的文檔生成過程。從頁面初始化、內容佈局,到數據驅動的表格輸出,都可以通過清晰、可維護的代碼完成。
對於需要長期輸出業務報表、系統憑證或歸檔文檔的 .NET 項目而言,這種方式不僅能夠提升開發效率,也有助於保持文檔風格的一致性和專業性。只要合理規劃頁面結構和數據來源,就可以將 PDF 生成作為系統中一個穩定、可靠的基礎能力來使用。