跳過到頁腳內容
遷移指南

如何用 C# 從 MigraDoc 轉移到 IronPDF

從MigraDoc轉移到 IronPDF:完整的 C# 遷移指南。

從MigraDoc轉換到IronPDF可將您的 .NET PDF 工作流程從需要手動逐個元素建構的冗長程式化文件模型轉換為基於HTML/CSS的現代方法,充分利用現有的 Web 開發技能。 本指南為專業的 .NET 開發人員提供了一個全面、循序漸進的轉換路徑,消除了MigraDoc專屬文件物件模型的陡峭學習曲線。

為什麼要從MigraDoc轉移到 IronPDF?

MigraDoc的挑戰

MigraDoc 雖然在程式化 PDF 產生方面功能強大,但卻有一些基本的限制,會影響現代的開發工作流程:

1.不支援 HTML:MigraDoc 不直接支援 HTML。 您必須使用 DocumentSectionParagraph表格物件,逐一手動建構文件元素 - 您無法利用現有的HTML/CSS設計。

2.專屬文件模型:MigraDoc 需要學習一個獨特的文件模型,其概念包括 AddSection(), AddParagraph(), AddTable(), AddRow(), 和 AddCell(). 這種陡峭的學習曲線對於具有 Web 開發背景的開發人員而言尤其具有挑戰性。

3.有限的樣式選項:雖然MigraDoc提供強大的文件結構管理功能,但與現代的網頁工具相比,它的樣式設計能力並不強大。 與完整的 CSS3 相比,類似 Format.Font.Size, Format.Font.Bold, 和 Format.Alignment 的屬性是有限的。

4.冗長的程式碼:即使是建立簡單的佈局也需要數十行的程式碼。 一個帶標頭的基本表格可能需要 15-20 行MigraDoc程式碼。

5.不支援 JavaScript:MigraDoc 無法呈現動態內容或執行 JavaScript,因此限制了現代圖表及互動元素的選項。

6.Charts Are Basic:與 Chart.js 或 D3 等現代JavaScript圖表程式庫相比,MigraDoc 的圖表功能相當有限。

MigraDoc與IronPDF的比較

特點MigraDocIronPDF
內容定義程式化 (文件/章節/段落)HTML/CSS
學習曲線Steep (專屬 DOM)簡易(網路技能)
造型設計屬性有限完整的 CSS3
JavaScript完整的 Chromium 執行
表格手動定義列/行HTML<table>搭配 CSS
圖表MigraDoc 基本圖表任何JavaScript圖表庫
圖片手冊尺寸/定位標準 HTML <img>
回應式佈局不支援Flexbox、網格
許可證開放原始碼 (MIT)商業的

對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個面向未來的基礎,讓開發人員可以使用熟悉的HTML/CSS技能,而無需學習專屬的文件模型。


遷移複雜性評估

按功能估計的工作量

特點遷移複雜性筆記
簡單文字非常低段落 → HTML 元素
表格表格/行/單元 → HTML <table>
頁首/頁尾Section.Headers → RenderingOptions
風格語言格式屬性 → CSS 類別
圖片AddImage → HTML <img>
圖表語言需要JavaScript函式庫

範式轉移

這次MigraDoc移轉的根本轉變是從 程式化文件建構HTML-first渲染

MigraDoc: Document → AddSection() → AddParagraph() → PdfDocumentRenderer → Save()
IronPDF:   ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()

這種範式的轉變可大幅降低程式碼的複雜度,同時透過 CSS 提供無限的造型能力。


開始之前

先決條件

1..NET 環境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet存取:安裝 NuGet 套件的能力 3.IronPDF 授權:從IronPdf.com取得您的授權金鑰。

NuGet 套件變更

# RemoveMigraDocpackages
dotnet remove package PdfSharp-MigraDoc
dotnet remove package PdfSharp-MigraDoc-GDI
dotnet remove package PDFsharp.MigraDoc.Standard

# Install IronPDF
dotnet add package IronPdf
# RemoveMigraDocpackages
dotnet remove package PdfSharp-MigraDoc
dotnet remove package PdfSharp-MigraDoc-GDI
dotnet remove package PDFsharp.MigraDoc.Standard

# Install IronPDF
dotnet add package IronPdf
SHELL

授權組態

// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

說明MigraDoc的用法

# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .
# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .
SHELL

完整的 API 參考資料

類別對應

MigraDoc 類別IronPdf 同等級產品筆記
文件<代碼>ChromePdfRenderer</代碼使用呈現器,而非文件
<編碼>部分</編碼HTML <body><div>結構容器
段落HTML <p>, <h1> 等。文字元素
格式化文字HTML <span>, <strong> 等。內嵌格式
表格HTML <table>使用 CSS 設計
HTML <tr>表列
<編碼>欄位</編碼HTML <col> 或 CSS欄位造型
CellHTML <td>, <th>表格單元
<代碼>PdfDocumentRenderer</代碼<代碼>ChromePdfRenderer</代碼主要呈現器

方法對應

MigraDoc 方法IronPdf 同等級產品筆記
<編碼>document.AddSection()</編碼HTML 結構使用 <div><section>
section.AddParagraph(text)<p>text</p>HTML 段落
section.AddTable()<table>HTML 表格
table.AddColumn(width)CSS width 屬性<th><td> 上的樣式
<編碼>table.AddRow()</編碼<tr>HTML 行
row.Cells[n].AddParagraph()<td>內容</td>HTML 單元
<編碼>renderer.RenderDocument()</編碼RenderHtmlAsPdf(html)渲染為 PDF
<代碼>pdfDocument.Save(路徑)</代碼<代碼>pdf.SaveAs(路徑)</代碼儲存檔案

占位符對應(頁首/頁腳)

MigraDoc 方法IronPdf 占位符筆記
新增頁面欄位(){page}目前頁數
AddNumPagesField(){總頁數}總頁數
新增日期欄位()<編碼>{日期}</編碼目前日期

程式碼遷移範例

範例 1:基本 HTML 到 PDF(基本差異)

之前 (MigraDoc):

// NuGet: Install-Package PdfSharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        //MigraDocdoesn't support HTML directly
        // Must manually create document structure
        Document document = new Document();
        Section section = document.AddSection();

        Paragraph paragraph = section.AddParagraph();
        paragraph.AddFormattedText("Hello World", TextFormat.Bold);
        paragraph.Format.Font.Size = 16;

        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("output.pdf");
    }
}
// NuGet: Install-Package PdfSharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        //MigraDocdoesn't support HTML directly
        // Must manually create document structure
        Document document = new Document();
        Section section = document.AddSection();

        Paragraph paragraph = section.AddParagraph();
        paragraph.AddFormattedText("Hello World", TextFormat.Bold);
        paragraph.Format.Font.Size = 16;

        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本範例說明MigraDoc與IronPDF的基本差異。MigraDoc要求創建一個 Document, 加入一個 Section, 加入一個 Paragraph, 使用 AddFormattedText()TextFormat.Bold, 設定 Format.Font.Size, 建立一個 PdfDocumentRenderer, 指定文件, 呼叫 RenderDocument(), 最後儲存。 這是 10 行以上的程式碼,包含多個物件。

IronPDF 只需 3 行即可達成相同的結果:建立渲染器、渲染 HTML 並儲存。 HTML <h1> 標籤自然提供粗體、大標題的樣式。 請參閱 HTML to PDF 文件,以瞭解其他渲染選項。

範例 2:建立表格

之前 (MigraDoc):

// NuGet: Install-Package PdfSharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();

        Table table = section.AddTable();
        table.Borders.Width = 0.75;

        Column column1 = table.AddColumn("3cm");
        Column column2 = table.AddColumn("3cm");

        Row row1 = table.AddRow();
        row1.Cells[0].AddParagraph("Name");
        row1.Cells[1].AddParagraph("Age");

        Row row2 = table.AddRow();
        row2.Cells[0].AddParagraph("John");
        row2.Cells[1].AddParagraph("30");

        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("table.pdf");
    }
}
// NuGet: Install-Package PdfSharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();

        Table table = section.AddTable();
        table.Borders.Width = 0.75;

        Column column1 = table.AddColumn("3cm");
        Column column2 = table.AddColumn("3cm");

        Row row1 = table.AddRow();
        row1.Cells[0].AddParagraph("Name");
        row1.Cells[1].AddParagraph("Age");

        Row row2 = table.AddRow();
        row2.Cells[0].AddParagraph("John");
        row2.Cells[1].AddParagraph("30");

        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("table.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlTable = @"
            <table border='1'>
                <tr><th>Name</th><th>Age</th></tr>
                <tr><td>John</td><td>30</td></tr>
            </table>";

        var pdf = renderer.RenderHtmlAsPdf(htmlTable);
        pdf.SaveAs("table.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        string htmlTable = @"
            <table border='1'>
                <tr><th>Name</th><th>Age</th></tr>
                <tr><td>John</td><td>30</td></tr>
            </table>";

        var pdf = renderer.RenderHtmlAsPdf(htmlTable);
        pdf.SaveAs("table.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

MigraDoc 表格的建立需要了解 Table, Column, Row, 和Cell的層級結構。 您必須使用 AddColumn() 明確地新增列,使用 AddRow() 建立行,使用 Cells[n] 透過索引存取儲存格,以及使用 AddParagraph() 新增內容。 邊框透過 table.Borders.Width 設定。

IronPdf 使用任何網頁開發人員都知道的標準 HTML 表格語法。 border='1' 屬性提供邊框,<th> 元素建立標題儲存格,而 <td> 元素建立資料儲存格。 可加入 CSS 以進行進階造型,例如斑馬紋、懸浮效果或回應式佈局。 進一步了解 在 PDF 中建立表格

範例 3:帶有頁碼的頁首和頁尾

之前 (MigraDoc):

// NuGet: Install-Package PdfSharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();

        // Add header
        Paragraph headerPara = section.Headers.Primary.AddParagraph();
        headerPara.AddText("Document Header");
        headerPara.Format.Font.Size = 12;
        headerPara.Format.Alignment = ParagraphAlignment.Center;

        // Add footer
        Paragraph footerPara = section.Footers.Primary.AddParagraph();
        footerPara.AddText("Page ");
        footerPara.AddPageField();
        footerPara.Format.Alignment = ParagraphAlignment.Center;

        // Add content
        section.AddParagraph("Main content of the document");

        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("header-footer.pdf");
    }
}
// NuGet: Install-Package PdfSharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Section section = document.AddSection();

        // Add header
        Paragraph headerPara = section.Headers.Primary.AddParagraph();
        headerPara.AddText("Document Header");
        headerPara.Format.Font.Size = 12;
        headerPara.Format.Alignment = ParagraphAlignment.Center;

        // Add footer
        Paragraph footerPara = section.Footers.Primary.AddParagraph();
        footerPara.AddText("Page ");
        footerPara.AddPageField();
        footerPara.Format.Alignment = ParagraphAlignment.Center;

        // Add content
        section.AddParagraph("Main content of the document");

        PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
        pdfRenderer.Document = document;
        pdfRenderer.RenderDocument();
        pdfRenderer.PdfDocument.Save("header-footer.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");

        pdf.AddTextHeader("Document Header");
        pdf.AddTextFooter("Page {page}");

        pdf.SaveAs("header-footer.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");

        pdf.AddTextHeader("Document Header");
        pdf.AddTextFooter("Page {page}");

        pdf.SaveAs("header-footer.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

MigraDoc 的頁首和頁尾需要存取 section.Headers.Primarysection.Footers.Primary ,在其中建立段落,使用 AddText() 加入文字,並使用特殊方法如新增頁面欄位()。來處理動態內容。 對齊需要設定 Format.Alignment.

IronPDF 在 PdfDocument 物件上提供了簡單的 AddTextHeader()AddTextFooter() 方法。{page}占位符會自動插入目前的頁碼。 對於更複雜的標題,您可以使用具有完整HTML/CSS支援的 HtmlHeaderFooter 。 有關進階選項,請參閱 headers and footers 文件


關鍵遷移注意事項

頁碼占位符語法

頁首和頁尾最重要的改變是佔位符語法:

//MigraDocfield methods:
footerPara.AddPageField();       // Current page
footerPara.AddNumPagesField();   // Total pages

//IronPDFplaceholders:
"Page {page} of {total-pages}"
//MigraDocfield methods:
footerPara.AddPageField();       // Current page
footerPara.AddNumPagesField();   // Total pages

//IronPDFplaceholders:
"Page {page} of {total-pages}"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

格式屬性轉換為 CSS

MigraDoc 的 Format 屬性對應到 CSS:

// MigraDoc:
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Alignment = ParagraphAlignment.Center;

//IronPDF(CSS):
<p style="font-size: 16pt; font-weight: bold; text-align: center;">
// MigraDoc:
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Alignment = ParagraphAlignment.Center;

//IronPDF(CSS):
<p style="font-size: 16pt; font-weight: bold; text-align: center;">
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

單位轉換

MigraDoc 使用各種單位; IronPdf 頁邊使用毫米:

  • "1cm" = 10mm
  • "1in" = 25.4mm
  • "72pt" = 25.4mm
// MigraDoc:
table.AddColumn("3cm");

//IronPDF(CSS):
<th style="width: 3cm;">
// MigraDoc:
table.AddColumn("3cm");

//IronPDF(CSS):
<th style="width: 3cm;">
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

渲染模式變更

整個呈現模式會改變:

//MigraDocpattern (DELETE):
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("output.pdf");

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
//MigraDocpattern (DELETE):
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("output.pdf");

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

疑難排解

問題 1:找不到文件/章節

問題Document 和<編碼>部分</編碼類別在IronPDF中並不存在。

解決方案:以 HTML 結構取代:

// MigraDoc
Document document = new Document();
Section section = document.AddSection();

// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
// MigraDoc
Document document = new Document();
Section section = document.AddSection();

// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 2:未找到 AddParagraph。

問題AddParagraph() 方法不存在。

解決方案:使用 HTML 元素:

// MigraDoc
section.AddParagraph("Hello World");

// IronPDF
"<p>Hello World</p>"
// MigraDoc
section.AddParagraph("Hello World");

// IronPDF
"<p>Hello World</p>"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 3:PdfDocumentRenderer 未找到

問題PdfDocumentRenderer 類不存在。

解決方案:使用ChromePdfRenderer

// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();

// IronPDF
var renderer = new ChromePdfRenderer();
// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();

// IronPDF
var renderer = new ChromePdfRenderer();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 4:AddPageField 無法運作

問題AddPageField() 方法不存在。

解決方案:使用 IronPdf 占位符語法:

// MigraDoc
footerPara.AddPageField();

// IronPDF
pdf.AddTextFooter("Page {page}");
// MigraDoc
footerPara.AddPageField();

// IronPDF
pdf.AddTextFooter("Page {page}");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

遷移清單

預遷移

  • [ ] 識別所有MigraDocusing 語句
  • [ ] 文件表格結構(列、行、樣式設定)
  • [ ] 注意頁首/頁尾內容和頁面欄位的用法
  • [ ] 列出使用 document.Styles 定義的自訂樣式
  • [ ] 獲得 IronPdf 授權金鑰

套件變更

  • [移除 PdfSharp-MigraDoc 套件
  • [移除 PdfSharp-MigraDoc-GDI 套件
  • [ ] 安裝 IronPDF NuGet 套件:dotnet add package IronPdf
  • [ ] 更新命名空間匯入

程式碼變更

  • [ ] 在啟動時加入授權金鑰組態
  • [ ] 將 Document/Section 替換為 HTML 結構
  • [ ] 將 AddParagraph() 轉換為 HTML <p> 元件
  • [ ] 將 Table/Row/Cell 轉換為HTML <table>結構
  • [ ] 將新增頁面欄位()。替換為{page}占位符
  • [ ] 將AddNumPagesField()替換為{總頁數}占位符
  • [ ] 將 Format 屬性轉換為 CSS 樣式
  • [ ] 將<代碼>PdfDocumentRenderer</代碼替換為 ChromePdfRenderer

測試

  • [ ] 比較新舊 PDF 的視覺輸出
  • [ ] 確認分頁符工作正常
  • [ ] 檢查頁首/頁尾渲染和頁碼
  • [驗證表格格式和邊界
  • [ ] 以複雜的多頁文件進行測試

後遷移

  • [ ] 移除MigraDoc相關文件
  • [ ] 更新團隊訓練材料
  • [ ] 文件新 HTML 模板位置

結論

從MigraDoc轉換到 IronPDF,可以消除MigraDoc專有文件物件模型的陡峭學習曲線,同時提供完整的 CSS3 造型功能。 從程式化的文件建構模式轉變為 HTML 為先的渲染模式,大幅降低了程式碼的複雜度,對於複雜的佈局而言,複雜度通常可降低 80% 或更多。

本次轉換的主要變更如下 1.內容模型Document/Section/Paragraph → HTML 元素 2.樣式Format 屬性 → CSS 3.表格AddTable()/AddRow()/AddColumn() → HTML <table> 4.PlaceholdersAddPageField(){page} 5.渲染器PdfDocumentRenderer →<代碼>ChromePdfRenderer</代碼。

探索完整的IronPDF文件教程API參考,加速您的MigraDoc遷移。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。