跳過到頁腳內容
遷移指南

如何用 C# 從 QuestPDF 轉移到 IronPDF

從QuestPDF移轉至 IronPDF:完整的 C# 遷移指南。

從QuestPDF轉移到 IronPDF,可將您的 PDF 生成工作流程從專有的 C# 流暢 API 轉換為基於 HTML/CSS 的標準方法,並具有全面的 PDF 操作功能。 本指南提供了一個完整的、循序漸進的轉換路徑,使您能夠利用現有的網路技能、重複使用 HTML 模板,並獲得QuestPDF根本無法提供的功能。

為什麼要從QuestPDF轉移到 IronPDF?

瞭解 QuestPDF。

QuestPDF 是一個現代化、流暢的 API,專門用於以 C# 程式化方式產生 PDF。 與某些提供 HTML 至 PDF 全面轉換功能的同業不同,QuestPDF 僅限於程式化排版 API 功能。QuestPDF在開發人員需要使用 C# 程式碼從零開始生成文件,而不依賴 HTML 的情況下表現出色。

收入低於 100 萬美元的企業可免費使用該資料庫,但需要證明該收入水平,這對某些企業而言可能是合規性的負擔。 超過這個門檻的使用者需要購買授權,因此在評估QuestPDF作為潛在解決方案時,必須將此因素列入長期規劃。

核心問題:不支援 HTML

QuestPDF 通常被推薦用於 HTML 到 PDF 的轉換,但它完全不支援 HTML。 儘管QuestPDF在開發者論壇上大肆宣傳,但它使用自己專屬的排版語言,需要學習全新的 DSL,而不是利用現有的網路技能。

特點QuestPDFIronPDF
HTML轉PDF不支援全面支援
CSS 風格設計不支援完整的 CSS3
現有範本必須從頭重建重複使用 HTML/CSS 資產
設計工具相容性任何網頁設計工具
學習曲線新的專屬 DSL網路技能轉移
版面預覽需要 IDE 外掛程式在任何瀏覽器中預覽
PDF 操作合併、分割、編輯

IronPDF 提供QuestPDF完全缺乏的原生 HTML 至 PDF 渲染功能,省去了以 C# 程式碼手動重構文件的麻煩。 它包括QuestPDF無法執行的全面 PDF 操作功能(合併、分割、編輯、安全)。

QuestPDF授權模式

QuestPDF 的"社群授權"只有在您的公司年總營收低於 100 萬美元時才是免費的。 如果您的客戶(不只是身為開發者的您)的收入超過門檻,他們可能需要購買授權。 與簡單的按開發人員商業授權不同,QuestPDF 的模式要求收入披露和合規追蹤。

IronPdf 提供簡單的授權方式:每個開發者只需一個授權,無收入稽核、無客戶授權要求,以及明確、可預測的成本。

對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的 Team,IronPDF 提供了透明的 License,無需根據收入進行審核,並採用標準的 HTML/CSS 方法,充分利用現有的 Web 開發技能。


開始之前

先決條件

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 套件變更

# Remove QuestPDF
dotnet remove package QuestPDF

# Add IronPDF
dotnet add package IronPdf
# Remove QuestPDF
dotnet remove package QuestPDF

# Add IronPDF
dotnet add package IronPdf
SHELL

授權組態

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

尋找QuestPDF使用方式

# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
# Find allQuestPDFusages in your codebase
grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" .
SHELL

完整的 API 參考資料

命名空間變更

// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

// After: IronPDF
using IronPdf;
// Before: QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

// After: IronPDF
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

核心 API 對應

QuestPDF 概念IronPdf 同等級產品筆記
<編碼>Document.Create()</編碼新的 ChromePdfRenderer()建立渲染器
.Page()<代碼>RenderHtmlAsPdf()</代碼將 HTML 渲染成 PDF
<編碼>.Text()</編碼HTML <p>, <h1>, <span>標準 HTML 標籤
.Bold()CSS font-weight: bold標準 CSS
.FontSize(24)CSS font-size: 24px標準 CSS
.Image()HTML <img src="...">標準 HTML
<編碼>.Table()</編碼HTML <table>標準 HTML
.Column()CSS display: flex; flex-direction: columnCSS Flexbox
.Row()CSS display: flex; flex-direction: rowCSS Flexbox
PageSizes.A4RenderingOptions.PaperSize紙張尺寸
.Margin()RenderingOptions.Margin*頁邊距離
.GeneratePdf()<代碼>pdf.SaveAs()</代碼檔案輸出
不適用<代碼>PdfDocument.Merge()</代碼合併 PDF
不適用<代碼>PdfDocument.FromFile()</代碼載入現有的 PDF
不適用<編碼>pdf.SecuritySettings</編碼PDF 加密

程式碼遷移範例

範例 1:基本文件建立 (HTML-to-PDF)

之前 (QuestPDF):

// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

class Program
{
    static void Main()
    {
        QuestPDF.Settings.License = LicenseType.Community;

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(2, Unit.Centimetre);
                page.Content().Column(column =>
                {
                    column.Item().Text("Hello World").FontSize(20).Bold();
                    column.Item().Text("This is a paragraph of text.");
                });
            });
        }).GeneratePdf("output.pdf");
    }
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

class Program
{
    static void Main()
    {
        QuestPDF.Settings.License = LicenseType.Community;

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(2, Unit.Centimetre);
                page.Content().Column(column =>
                {
                    column.Item().Text("Hello World").FontSize(20).Bold();
                    column.Item().Text("This is a paragraph of text.");
                });
            });
        }).GeneratePdf("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><p>This is a paragraph of text.</p>");
        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><p>This is a paragraph of text.</p>");
        pdf.SaveAs("output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本範例展示了基本的範式差異。QuestPDF需要學習其流暢的 API:Document.Create()container.Page()page.Content().Column()column.Item().Text(),並透過方法鏈如 .FontSize(20).Bold() 設定樣式。 您還必須使用 QuestPDF.Settings.License = LicenseType.Community 設定授權類型。

IronPdf 使用任何 Web 開發人員都知道的標準 HTML:<h1> 表示標題,<p> 表示段落。不需要學習專屬的 DSL。IronPDF的方法提供了更簡潔的語法,並能更好地與現代 .NET 應用程式整合。 請參閱 HTML to PDF 文件,以瞭解全面的範例。

範例 2:發票產生

之前 (QuestPDF):

// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

class Program
{
    static void Main()
    {
        QuestPDF.Settings.License = LicenseType.Community;

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(2, Unit.Centimetre);
                page.Content().Column(column =>
                {
                    column.Item().Text("INVOICE").FontSize(24).Bold();
                    column.Item().Text("Invoice #: 12345").FontSize(12);
                    column.Item().PaddingTop(20);
                    column.Item().Text("Customer: John Doe");
                    column.Item().Text("Total: $100.00").Bold();
                });
            });
        }).GeneratePdf("invoice.pdf");
    }
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

class Program
{
    static void Main()
    {
        QuestPDF.Settings.License = LicenseType.Community;

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(2, Unit.Centimetre);
                page.Content().Column(column =>
                {
                    column.Item().Text("INVOICE").FontSize(24).Bold();
                    column.Item().Text("Invoice #: 12345").FontSize(12);
                    column.Item().PaddingTop(20);
                    column.Item().Text("Customer: John Doe");
                    column.Item().Text("Total: $100.00").Bold();
                });
            });
        }).GeneratePdf("invoice.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = @"
            <h1>INVOICE</h1>
            <p>Invoice #: 12345</p>
            <br/>
            <p>Customer: John Doe</p>
            <p><strong>Total: $100.00</strong></p>
        ";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("invoice.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = @"
            <h1>INVOICE</h1>
            <p>Invoice #: 12345</p>
            <br/>
            <p>Customer: John Doe</p>
            <p><strong>Total: $100.00</strong></p>
        ";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("invoice.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

QuestPDF 使用.Column().Item() 進行佈局,並使用.PaddingTop(20)。進行間距。 IronPdf 使用標準的 HTML:<h1> 表示標題,<p> 表示段落,<br/> 表示間距,<strong> 表示粗體文字。

真正的優勢:使用 IronPDF,設計人員可以獨立建立和修改 HTML 模板。 使用 QuestPDF,每次設計變更都需要 C# 開發人員修改程式碼。 請參閱我們的 教學,瞭解更多資訊。

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

之前 (QuestPDF):

// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

class Program
{
    static void Main()
    {
        QuestPDF.Settings.License = LicenseType.Community;

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(2, Unit.Centimetre);

                page.Header().Text("Document Header").FontSize(14).Bold();

                page.Content().Text("Main content of the document.");

                page.Footer().AlignCenter().Text(text =>
                {
                    text.Span("Page ");
                    text.CurrentPageNumber();
                });
            });
        }).GeneratePdf("document.pdf");
    }
}
// NuGet: Install-Package QuestPDF
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

class Program
{
    static void Main()
    {
        QuestPDF.Settings.License = LicenseType.Community;

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4);
                page.Margin(2, Unit.Centimetre);

                page.Header().Text("Document Header").FontSize(14).Bold();

                page.Content().Text("Main content of the document.");

                page.Footer().AlignCenter().Text(text =>
                {
                    text.Span("Page ");
                    text.CurrentPageNumber();
                });
            });
        }).GeneratePdf("document.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = "<p>Main content of the document.</p>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        pdf.Header = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            FontSize = 14
        };

        pdf.Footer = new TextHeaderFooter()
        {
            CenterText = "Page {page}"
        };

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

class Program
{
    static void Main()
    {
        var htmlContent = "<p>Main content of the document.</p>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);

        pdf.Header = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            FontSize = 14
        };

        pdf.Footer = new TextHeaderFooter()
        {
            CenterText = "Page {page}"
        };

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

QuestPDF 使用 page.Header()page.Footer() 以及.AlignCenter().和 .CurrentPageNumber() 等流暢的方法。 IronPdf 使用具有 CenterTextFontSize 等屬性的 TextHeaderFooter 物件。 {page} 占位符會自動插入目前的頁碼。


關鍵遷移注意事項

範式轉換

根本的改變是從專屬的 C# DSL 轉換成標準的 HTML/CSS:

// QuestPDF: Proprietary fluent API
container.Page(page =>
{
    page.Content().Column(column =>
    {
        column.Item().Text("Invoice").Bold().FontSize(24);
        column.Item().Row(row =>
        {
            row.RelativeItem().Text("Customer:");
            row.RelativeItem().Text("Acme Corp");
        });
    });
});

// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
    <h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
    <div style='display: flex; justify-content: space-between;'>
        <span>Customer:</span>
        <span>Acme Corp</span>
    </div>
</div>";

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
// QuestPDF: Proprietary fluent API
container.Page(page =>
{
    page.Content().Column(column =>
    {
        column.Item().Text("Invoice").Bold().FontSize(24);
        column.Item().Row(row =>
        {
            row.RelativeItem().Text("Customer:");
            row.RelativeItem().Text("Acme Corp");
        });
    });
});

// IronPDF: Standard HTML/CSS
var html = @"
<div style='font-family: Arial; padding: 40px;'>
    <h1 style='font-weight: bold; font-size: 24px;'>Invoice</h1>
    <div style='display: flex; justify-content: space-between;'>
        <span>Customer:</span>
        <span>Acme Corp</span>
    </div>
</div>";

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

佈局模式轉換

QuestPDF 模式HTML/CSS 對應
.Column()顯示:flex; flex-direction: column
.Row()顯示:flex; flex-direction: row
.RelativeItem()flex: 1
<編碼>.Table()</編碼<table> 元件
.PaddingTop(20)padding-top:20px<br/>
.AlignCenter().text-align:居中
.FontSize(24)字型大小:24px
.Bold()font-weight: bold<strong>

頁面設定轉換

// QuestPDF
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);

// IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;    // mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
// QuestPDF
page.Size(PageSizes.A4);
page.Margin(2, Unit.Centimetre);

// IronPDF
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;    // mm (2cm = 20mm)
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

遷移後的新功能

轉移到IronPDF之後,您將獲得QuestPDF無法提供的功能:

PDF 合併

var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");

var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>");
var content = renderer.RenderHtmlAsPdf(reportHtml);
var existing = PdfDocument.FromFile("appendix.pdf");

var merged = PdfDocument.Merge(cover, content, existing);
merged.SaveAs("complete.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF安全性

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "reader";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("protected.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

URL 至 PDF

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;

var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;

var pdf = renderer.RenderUrlAsPdf("https://example.com/report");
pdf.SaveAs("webpage.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

載入和編輯現有的 PDF 文件

var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
var pdf = PdfDocument.FromFile("existing.pdf");
// Modify, merge, add security, etc.
pdf.SaveAs("modified.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

功能比較摘要

特點QuestPDFIronPDF
HTML轉PDF不支援主要功能
學習曲線專屬 DSL標準的網路技能
範本預覽需要外掛程式任何瀏覽器
設計協作僅限開發人員設計師 + 開發人員
現有資產必須重建重複使用 HTML/CSS
PDF 操作不支援全面支援
安全性/簽名不支援全面支援
授權模式以收入為基礎每位開發人員
客戶影響力可能需要授權
Bootstrap/Tailwind不支援全面支援
URL轉PDF不支援全面支援

遷移清單

預遷移

  • [ ] 識別所有QuestPDF文件範本 (Document.Create, .GeneratePdf)
  • [ ] 記錄使用的 DSL 模式 (.Column().Row().Table().Text())
  • [ ] 將造型方法映射至 CSS 對應項目
  • [ ] 從 ironpdf.com 獲得IronPDF授權金鑰

套件變更

  • [ ] 移除 QuestPDF NuGet 套件
  • [ ] 安裝 IronPDF NuGet 套件:dotnet add package IronPdf

程式碼變更

  • [ ] 更新命名空間匯入
  • [ ] 移除 QuestPDF.Settings.License = LicenseType.Community
  • [ ] 將<編碼>Document.Create()</編碼模式轉換為 ChromePdfRenderer + HTML
  • [ ] 將.Column()/.Row()替換為 CSS Flexbox
  • [ ] 將<編碼>.Table()</編碼替換為HTML <table>元素
  • [ ] 將 .Text().Bold().FontSize(24) 轉換為 <h1> style="...">
  • [ ] 將 page.Header() / page.Footer() 替換為 TextHeaderFooter
  • [ ] 將 .CurrentPageNumber() 替換為 {page} 占位符
  • [ ] 將.GeneratePdf()。轉換為 pdf.SaveAs()
  • [ ] 在應用程式啟動時加入授權初始化

後遷移

  • [ ] PDF 輸出的視覺比較
  • [ ] 測試多頁文件的分頁是否正確
  • [ ] 必要時增加新功能(安全性、合併、URL-to-PDF)。

結論

QuestPDF 和IronPDF在 PDF 生成和操作領域中具有不同的用途。QuestPDF在 PDF 的設計需要以程式化的方式精雕細琢的情況下大放異彩。 對於偏好高保真而非即時 HTML 轉換的使用者而言,其流利的 API 是一大優勢。

另一方面,IronPDF 為需要全方位 PDF 解決方案(包括 HTML 轉換和進階操作功能)的開發人員提供強大的套件,並採用透明的授權模式。

本次轉換的主要變更如下 1.Paradigm:專屬 C# 流暢 API → 標準 HTML/CSS 2.範本建立:僅限 C# 程式碼 → 設計人員可提供 HTML/CSS 3.預覽: 需要 IDE 外掛程式 → 任何網頁瀏覽器 4.初始化QuestPDF.Settings.License = LicenseType.CommunityIronPdf.License.LicenseKey. 5.佈局.Column() /.Row()→ CSS Flexbox 6.樣式:方法鏈 (.Bold().FontSize(24)) → CSS 屬性 7.頁首/頁腳page.Header() / page.Footer()TextHeaderFooter 物件 8.頁面編號.CurrentPageNumber(){page} 占位符 9.儲存.GeneratePdf("file.pdf")pdf.SaveAs("file.pdf") 10.新功能:PDF 合併、分割、安全性、數位簽署、URL-to-PDF

最終,QuestPDF 和IronPDF之間的選擇取決於您專案的特定需求。 如果無縫的 HTML 整合和廣泛的 PDF 操作是關鍵,IronPDF 是上佳的選擇。

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

Curtis Chau
技術作家

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

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