博客 / 詳情

返回

使用 C# 創建 PDF 文檔:文本、圖片、形狀與表格插入

在企業級應用和信息系統中,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 文檔:

使用C#繪製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();
        }
    }
}

生成文檔示例:

使用C#插入圖片

通過 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 文檔:

使用C#繪製圖形元素

這些基礎圖形雖然簡單,但在實際報表中可以用於突出重點數據區域或增強整體排版層次。


四、生成支持分頁和樣式控制的業務數據表格

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 文檔如下:

使用C#生成支持分頁和樣式控制的業務數據表格

在這個場景中,即使數據行數超過一頁,表格也會自動分頁,並在每一頁頂部重複顯示錶頭,非常適合正式業務報表的生成需求。


關鍵類、屬性與方法總結

類 / 屬性 / 方法 説明
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 生成作為系統中一個穩定、可靠的基礎能力來使用。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.