跳過到頁腳內容
遷移指南

如何在 C# 中從 DynamicPDF 轉移到 IronPDF

為什麼要從動態 PDF轉移到 IronPDF?

DynamicPDF 的產品分散是遷移的主要動力。 瞭解授權模式對於評估您目前實作的真正成本至關重要。

產品分散的問題

DynamicPDF 以獨立授權的獨立產品形式銷售:

1.動態 PDF 產生器:從零開始建立 PDF

  1. DynamicPDF Merger:合併、分割和處理現有 PDF 檔案(需另外購買)
  2. DynamicPDF核心套件:組合產生器和合併器
  3. DynamicPDF ReportWriter:報表生成
  4. DynamicPDF HTML Converter: HTML 轉 PDF 轉換(獨立外掛程式)
  5. DynamicPDF 列印管理器:以程式方式列印 PDF

完整的 PDF 解決方案需要 3-5 個動態 PDF獨立授權。IronPDF在一個套件中包含了所有內容。

架構比較

範疇 動態 PDF IronPDF
產品模式 零散(5 種以上產品) 多合一程式庫
授權 需要多個授權 單一授權
HTML至PDF 另外購買附加元件 內建、基於 Chromium
CSS 支援 有限 (需要附加元件) 完整的 CSS3 與 Flexbox/Grid
API 風格 基於座標的定位 HTML/CSS + 操作 API
學習曲線 Steep (多種 API) 溫和 (網路技術)
現代 .NET .NET Standard 2.0 .NET 6/7/8/9+ 原生

主要遷移優勢

1.單包:一個 NuGet 套件即可取代 3-5 個動態 PDF包 2.現代渲染: Chromium 引擎與傳統渲染

  1. Web 技術:使用 HTML/CSS 而非基於座標的定位 4.更簡潔的 API:程式碼更少,更易讀,更容易維護 5.無需額外購買: HTML、合併、安全功能全部包含在內

遷移前的準備工作

先決條件

確保您的環境符合這些要求:

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或具有 C# 擴充功能的 VS Code
  • NuGet 套件管理員存取權限 -IronPDF授權金鑰 (可於 ironpdf.com 網站免費試用)

審核動態 PDF使用情況

在您的解決方案目錄中執行這些指令,以識別所有動態 PDF參考資料:

# Find all動態 PDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep -i dynamic
# Find all動態 PDFreferences
grep -r "ceTe.DynamicPDF\|DynamicPDF" --include="*.cs" --include="*.csproj" .

# Check NuGet packages
dotnet list package | grep -i dynamic
SHELL

需要尋找的常見套件:

  • ceTe.DynamicPDF.CoreSuite.NET
  • ceTe.DynamicPDF.Generator.NET
  • ceTe.DynamicPDF.Merger.NET
  • ceTe.DynamicPDF.HtmlConverter.NET

瞭解範式轉移

從動態 PDF轉移到IronPDF時,最顯著的改變是建立文件的基本方法。動態 PDF使用基於座標的定位方式,您可以將元素放置在頁面上特定的 X、Y 座標上。IronPDF使用 HTML/CSS 渲染,在此您可以使用 Web 技術進行設計。

這種範式轉移意味著將 LabelTextAreaTable2 元素轉換為它們的 HTML 等效項——這種變更通常會產生更易讀、更易於維護的程式碼。

逐步遷移的過程

步驟 1:更新 NuGet 套件

移除所有動態 PDF套件並安裝 IronPDF:

# Remove動態 PDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET

# Install IronPDF
dotnet add package IronPdf
# Remove動態 PDFpackages
dotnet remove package ceTe.DynamicPDF.CoreSuite.NET
dotnet remove package ceTe.DynamicPDF.Generator.NET
dotnet remove package ceTe.DynamicPDF.Merger.NET
dotnet remove package ceTe.DynamicPDF.HtmlConverter.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

步驟 2:更新命名空間參考資料

用IronPDF取代動態 PDF命名空間:

// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;

// Add this
using IronPdf;
// Remove these
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;
using ceTe.DynamicPDF.Conversion;

// Add this
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

步驟 3:配置授權

// 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";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

完整的 API 遷移參考。

核心類映射

DynamicPDF 類別 IronPDF 同等級產品
Document ChromePdfRenderer
Document PdfDocument
Page HTML <div> 帶分頁符
MergeDocument PdfDocument.Merge()
HtmlConverter ChromePdfRenderer

頁面元素至 HTML 對應

DynamicPDF 頁面元素 IronPDF/HTML 同等級版本
Label <p>, <span>, <div>
TextArea <div><p> 帶 CSS
Image <img> 標籤
Table2 HTML <table>
PageNumberingLabel {page} / {total-pages} 佔位符

關鍵 API 對應

動態 PDF IronPDF
Document + Page ChromePdfRenderer
Label, TextArea HTML <p>, <div>
Table2 HTML <table>
MergeDocument PdfDocument.Merge()
HtmlConverter ChromePdfRenderer
document.Draw() pdf.SaveAs() / pdf.BinaryData
PageNumberingLabel %%CP%% {page}佔位符

程式碼遷移範例

HTML 至 PDF 轉換

HTML 到 PDF 的轉換顯示動態 PDF需要一個單獨的 HtmlConverter 插件,而IronPDF則內建了 Chromium 渲染功能。

DynamicPDF 實作:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        HtmlConverter converter = new HtmlConverter(html);
        converter.Convert("output.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Conversion;

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        HtmlConverter converter = new HtmlConverter(html);
        converter.Convert("output.pdf");
    }
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Conversion

Class Program
    Shared Sub Main()
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
        Dim converter As New HtmlConverter(html)
        converter.Convert("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 實作:

// NuGet: Install-Package IronPdf
using IronPdf;

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

class Program
{
    static void Main()
    {
        string html = "<html><body><h1>Hello World</h1></body></html>";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 的 ChromePdfRenderer 提供基於 Chromium 的渲染,並完全支援 CSS3——無需單獨購買外掛程式。 如需更多選項,請參閱 HTML to PDF 文件

合併多個 PDF 文件

PDF 合併示範了動態 PDF的 MergeDocument 類別(需要 Merger 產品授權)與IronPDF的內建靜態 Merge 方法之間的差異。

DynamicPDF 實作:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;

class Program
{
    static void Main()
    {
        MergeDocument document = new MergeDocument("document1.pdf");
        document.Append("document2.pdf");
        document.Draw("merged.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.Merger;

class Program
{
    static void Main()
    {
        MergeDocument document = new MergeDocument("document1.pdf");
        document.Append("document2.pdf");
        document.Draw("merged.pdf");
    }
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.Merger

Class Program
    Shared Sub Main()
        Dim document As New MergeDocument("document1.pdf")
        document.Append("document2.pdf")
        document.Draw("merged.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 實作:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");
        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim pdf1 = PdfDocument.FromFile("document1.pdf")
        Dim pdf2 = PdfDocument.FromFile("document2.pdf")
        Dim merged = PdfDocument.Merge(pdf1, pdf2)
        merged.SaveAs("merged.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 的靜態方法可以直接接受多個物件。 更多選項請參閱PDF 合併文件

在 PDF 中加入文字

文字放置體現了從動態 PDF基於座標的 Label 元素到IronPDF基於 HTML 的 TextStamper 元素的範式轉移。

DynamicPDF 實作:

// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Page page = new Page(PageSize.Letter);
        Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
        page.Elements.Add(label);
        document.Pages.Add(page);
        document.Draw("output.pdf");
    }
}
// NuGet: Install-Package ceTe.DynamicPDF.CoreSuite.NET
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;

class Program
{
    static void Main()
    {
        Document document = new Document();
        Page page = new Page(PageSize.Letter);
        Label label = new Label("Hello from DynamicPDF!", 0, 0, 504, 100);
        page.Elements.Add(label);
        document.Pages.Add(page);
        document.Draw("output.pdf");
    }
}
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements

Class Program
    Shared Sub Main()
        Dim document As New Document()
        Dim page As New Page(PageSize.Letter)
        Dim label As New Label("Hello from DynamicPDF!", 0, 0, 504, 100)
        page.Elements.Add(label)
        document.Pages.Add(page)
        document.Draw("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 實作:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };
        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>");
        var textStamper = new TextStamper()
        {
            Text = "Hello from IronPDF!",
            FontSize = 20,
            VerticalAlignment = VerticalAlignment.Top
        };
        pdf.ApplyStamp(textStamper);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<html><body></body></html>")
        Dim textStamper As New TextStamper() With {
            .Text = "Hello from IronPDF!",
            .FontSize = 20,
            .VerticalAlignment = VerticalAlignment.Top
        }
        pdf.ApplyStamp(textStamper)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF 的 TextStamper 提供基於對齊的定位,而不是基於座標的放置,使佈局更能適應不同的頁面尺寸。 如需更多選項,請參閱 水印和戳記文件

完整的文件生成範例

這個綜合範例展示了將具有多種元素的動態 PDF文件轉換為IronPDF的 HTML 方式。

DynamicPDF 實作:

using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;

// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);

Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");

// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
using ceTe.DynamicPDF;
using ceTe.DynamicPDF.PageElements;
using ceTe.DynamicPDF.Merger;

// Generation (requires Generator license)
Document document = new Document();
Page page = new Page(PageSize.A4);
Label title = new Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18);
title.Align = TextAlign.Center;
page.Elements.Add(title);

Table2 table = new Table2(40, 60, 515, 500);
// ... complex table setup with columns, rows, cells...
page.Elements.Add(table);
document.Pages.Add(page);
document.Draw("invoice.pdf");

// Merging (requires Merger license)
MergeDocument mergeDoc = new MergeDocument("cover.pdf");
mergeDoc.Append("invoice.pdf");
mergeDoc.Draw("final.pdf");
Imports ceTe.DynamicPDF
Imports ceTe.DynamicPDF.PageElements
Imports ceTe.DynamicPDF.Merger

' Generation (requires Generator license)
Dim document As New Document()
Dim page As New Page(PageSize.A4)
Dim title As New Label("Invoice Report", 0, 0, 595, 30, Font.HelveticaBold, 18)
title.Align = TextAlign.Center
page.Elements.Add(title)

Dim table As New Table2(40, 60, 515, 500)
' ... complex table setup with columns, rows, cells...
page.Elements.Add(table)
document.Pages.Add(page)
document.Draw("invoice.pdf")

' Merging (requires Merger license)
Dim mergeDoc As New MergeDocument("cover.pdf")
mergeDoc.Append("invoice.pdf")
mergeDoc.Draw("final.pdf")
$vbLabelText   $csharpLabel

IronPDF 實作:

using IronPdf;

var renderer = new ChromePdfRenderer();

// All features in one library
var html = @"
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>";

var invoice = renderer.RenderHtmlAsPdf(html);

// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

// All features in one library
var html = @"
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>";

var invoice = renderer.RenderHtmlAsPdf(html);

// Merging included - no separate license
var cover = PdfDocument.FromFile("cover.pdf");
var final = PdfDocument.Merge(cover, invoice);
final.SaveAs("final.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' All features in one library
Dim html As String = "
<html>
<head>
    <style>
        body { font-family: Helvetica, sans-serif; padding: 40px; }
        h1 { text-align: center; font-size: 18pt; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th, td { border: 1px solid #ccc; padding: 8px; }
    </style>
</head>
<body>
    <h1>Invoice Report</h1>
    <table>
        <tr><th>Product</th><th>Qty</th><th>Price</th></tr>
        <tr><td>Widget</td><td>10</td><td>$99.99</td></tr>
    </table>
</body>
</html>"

Dim invoice As PdfDocument = renderer.RenderHtmlAsPdf(html)

' Merging included - no separate license
Dim cover As PdfDocument = PdfDocument.FromFile("cover.pdf")
Dim final As PdfDocument = PdfDocument.Merge(cover, invoice)
final.SaveAs("final.pdf")
$vbLabelText   $csharpLabel

關鍵遷移注意事項

基於座標的 HTML/CSS 定位

基本模式的轉換需要將 X,Y 座標定位轉換為基於 CSS 的佈局:

//動態 PDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);

//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";

//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
//動態 PDF- coordinate-based
var label = new Label("Hello World", 100, 200, 300, 50);

//IronPDF- CSS positioning (if absolute positioning needed)
var html = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>";

//IronPDF- preferred approach (flow-based)
var html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>";
'動態 PDF- coordinate-based
Dim label As New Label("Hello World", 100, 200, 300, 50)

'IronPDF- CSS positioning (if absolute positioning needed)
Dim html As String = "<div style='position:absolute; left:100px; top:200px; width:300px;'>Hello World</div>"

'IronPDF- preferred approach (flow-based)
html = "<div style='margin-left:100px; margin-top:200px;'>Hello World</div>"
$vbLabelText   $csharpLabel

頁面編號語法

DynamicPDF 和IronPDF使用不同的頁碼占位符語法:

//動態 PDFplaceholders
"Page %%CP%% of %%TP%%"

//IronPDFplaceholders
"Page {page} of {total-pages}"
//動態 PDFplaceholders
"Page %%CP%% of %%TP%%"

//IronPDFplaceholders
"Page {page} of {total-pages}"
'動態 PDFplaceholders
"Page %%CP%% of %%TP%%"

'IronPDFplaceholders
"Page {page} of {total-pages}"
$vbLabelText   $csharpLabel

頁首和頁尾

將動態 PDF元素轉換為IronPDF元素:

//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
//IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
    HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
'IronPDFheader/footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
    .HtmlFragment = "<div style='text-align:center;'>Page {page} of {total-pages}</div>",
    .MaxHeight = 25
}
$vbLabelText   $csharpLabel

如需更多標頭/頁尾選項,請參閱 標頭和頁尾文件

安全設定

//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
//IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.UserPassword = "userPassword";
'IronPDFsecurity
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.UserPassword = "userPassword"
$vbLabelText   $csharpLabel

有關全面的安全性選項,請參閱加密文件

遷移後檢查清單

完成程式碼遷移後,請驗證下列事項:

  • 產生PDF檔案的可視化比較
  • 檢查文字位置和版面
  • 測試表格渲染和溢出
  • 檢查所有頁面的頁首/頁腳
  • 測試表單填寫功能
  • 驗證安全性/加密
  • 性能基準測試
  • 刪除未使用的動態 PDF授權文件
  • 更新文件

讓您的 PDF 基礎架構面向未來

由於 .NET 10 即將面世,而 C# 14 也將引進新的語言功能,因此選擇一個能接受現代 .NET 模式的 PDF 函式庫,可確保長期的相容性。IronPDF對 .NET 6/7/8/9+ 的原生支援,為專案延伸至 2025 年和 2026 年提供了明確的發展路徑--免除了管理多個產品授權或瀏覽零散 API 的複雜性。

其他資源


從動態 PDF遷移到IronPDF可消除管理多個產品授權的複雜性,同時提供基於 Chromium 的現代化渲染和完整的 CSS3 支援。 從基於座標的定位轉換到 HTML/CSS 設計,通常會產生更易維護的程式碼,並利用熟悉的網頁技術。

Curtis Chau
技術作家

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

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

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我