跳過到頁腳內容
遷移指南

如何使用 C# 從 PrinceXML 遷移到 IronPDF

從PrinceXML轉換到IronPDF可將您的 PDF 生成工作流程從外部命令行流程轉換為本地 .NET 函式庫。 本指南提供完整的逐步遷移路徑,可消除流程管理的開銷、簡化部署,並提供生成以外的廣泛 PDF 操作功能。

為什麼要從PrinceXML轉移到 IronPDF?

瞭解 PrinceXML

PrinceXML 是一款精密的工具,透過其對CSS 分頁媒體規格的專用支援,可將 HTML 內容轉換成完美印刷的 PDF 文件。 這項專長讓PrinceXML能夠高保真地呈現與預期印刷設計相符的文件 - 這對於需要詳細印刷樣式的產業(如出版或法律文件)來說,是非常有價值的特質。

然而,PrinceXML 並非 .NET 函式庫,而是以獨立的指令列工具運作,對於偏好純 .NET 解決方案的環境而言,這可能會使整合變得複雜。 其對獨立伺服器程序的依賴涉及額外的系統資源管理,並可能增加專案部署的複雜性。

外部流程問題

PrinceXML 以獨立的命令列可執行方式運作,對 .NET 應用程式造成重大的架構挑戰:

1.進程管理開銷:必須產生、監控和終止外部進程。

2.不支援原生 .NET 整合:透過 stdin/stdout 或臨時檔案進行通訊。

3.部署複雜性:需要在每台伺服器上安裝 Prince。

4.按伺服器許可:每次部署都需要單獨的許可證(495 美元以上)。

5.錯誤處理難度:解析文字輸出以進行錯誤偵測。

6.無需 Async/await:無需阻塞呼叫或複雜的非同步包裝器。

7.路徑依賴:必須在 PATH 或絕對路徑中找到 Prince 執行檔。

PrinceXMLvsIronPDF比較。

範疇 PrinceXML IronPDF
架構 外部流程 原生 .NET 函式庫
整合 指令行 直接 API
部署 安裝在每台伺服器上 單一 NuGet 套件
錯誤處理 解析文字輸出 .NET 例外
Async 支援 手冊包裝 原生 async/await
PDF 操作 僅產生 完整的操作(合併、分割、編輯)
授權 每台伺服器 ($495+) 每位開發人員
更新 手動重新安裝 NuGet 更新
除錯 難度 完整的除錯器支援
數位簽名
表格
Docker 支援 複雜的 簡單的
雲端功能 難度 簡易

IronPDF for .NET 以其 .NET 原生功能提供了另一種選擇,不僅僅是 HTML 到 PDF 的轉換,還包括進階的 PDF 操作任務,例如編輯、合併和數位簽署。IronPDF的 API 設計簡單易用,讓開發人員只需使用最少的模板程式碼即可執行轉換和操作。

對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 的無縫部署不需要外部依賴或伺服器程序,因此可以減輕整合到 .NET Framework 的負擔。


開始之前

先決條件

  1. .NET環境: .NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet存取權限:能夠安裝NuGet套件
  3. IronPDF許可證:請從IronPDF取得您的許可證密鑰。

NuGet 套件變更

# Install IronPDF
dotnet add package IronPdf

# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
# Install IronPDF
dotnet add package IronPdf

# Remove Prince wrapper if using one
dotnet remove package PrinceXMLWrapper
SHELL

授權組態

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

搜尋PrinceXML使用方式

# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
# Find Prince process calls
grep -r "prince" --include="*.cs" .
grep -r "Process.Start" --include="*.cs" . | grep -i prince
grep -r "@page" --include="*.css" .
grep -r "prince-" --include="*.css" .
SHELL

完整的 API 參考資料

命名空間變更

// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;

// After: IronPDF
using IronPdf;
// Before: PrinceXML
using PrinceXMLWrapper;
using System.Diagnostics;
using System.IO;

// After: IronPDF
using IronPdf;
' Before: PrinceXML
Imports PrinceXMLWrapper
Imports System.Diagnostics
Imports System.IO

' After: IronPDF
Imports IronPdf
$vbLabelText   $csharpLabel

指令行至方法映射

王子指令 IronPDF 同等級產品
prince input.html -o output.pdf renderer.RenderHtmlFileAsPdf("input.html").SaveAs("output.pdf")
prince --style=custom.css input.html 在 HTML 中包含 CSS 或使用 RenderingOptions
prince --javascript renderer.RenderingOptions.EnableJavaScript = true
prince --no-javascript renderer.RenderingOptions.EnableJavaScript = false
prince --page-size=Letter renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
prince --page-margin=1in renderer.RenderingOptions.MarginTop = 72 (72 點 = 1 吋)
prince --encrypt pdf.SecuritySettings.OwnerPassword = "..."
prince --user-password=pw pdf.SecuritySettings.UserPassword = "pw"
prince --disallow-print pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint
prince --disallow-copy pdf.SecuritySettings.AllowUserCopyPasteContent = false
prince --baseurl=http://... renderer.RenderingOptions.BaseUrl = new Uri("http://...")
prince --media=print renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
prince --media=screen renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Screen

CSS @page 至 RenderingOptions 對應。

CSS @page 屬性 IronPDF 同等級產品
size: A4 PaperSize = PdfPaperSize.A4
size: Letter PaperSize = PdfPaperSize.Letter
size:A4landscape PaperSize = PdfPaperSize.A4 + PaperOrientation = Landscape
margin: 2cm MarginTop/Bottom/Left/Right = 56
margin-top: 1in MarginTop = 72
@top-center { content: "..." } HtmlHeader 帶有居中 div
@bottom-right { content: counter(page) } HtmlFooter{page} 佔位符

頁面大小轉換

大小 要點 毫米
信件 612 x 792 216 x 279
A4 595 x 842 210 x 297
法律條款 612 x 1008 216 x 356
1 英吋 72 25.4
1 cm 28.35 10

程式碼遷移範例

範例 1:HTML 檔案轉換為 PDF 檔案

之前 (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("input.html", "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("input.html", "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
Imports PrinceXMLWrapper
Imports System

Module Program
    Sub Main()
        Dim prince As New Prince("C:\Program Files\Prince\engine\bin\prince.exe")
        prince.Convert("input.html", "output.pdf")
        Console.WriteLine("PDF created successfully")
    End Sub
End Module
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlFileAsPdf("input.html")
        pdf.SaveAs("output.pdf")
        Console.WriteLine("PDF created successfully")
    End Sub
End Class
$vbLabelText   $csharpLabel

本範例展示了基本的架構差異。PrinceXML需要實例化一個 Prince 對象,並傳入可執行檔的完整路徑 ("C:\\Program Files\\Prince\\engine\\bin\\prince.exe"),然後呼叫 Convert() 並傳入輸入和輸出路徑。

IronPDF 完全消除了路徑依賴:建立一個 ChromePdfRenderer,使用 HTML 檔案路徑呼叫 RenderHtmlFileAsPdf(),然後使用 SaveAs() 寫入結果。 無可執行路徑、無流程管理、無路徑依賴。 請參閱 HTML to PDF 文件,以瞭解全面的範例。

範例 2:URL 至 PDF 轉換選項

之前 (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.SetJavaScript(true);
        prince.SetEncrypt(true);
        prince.SetPDFTitle("Website Export");
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;

class Program
{
    static void Main()
    {
        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.SetJavaScript(true);
        prince.SetEncrypt(true);
        prince.SetPDFTitle("Website Export");
        prince.Convert("https://example.com", "webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
Imports PrinceXMLWrapper
Imports System

Class Program
    Shared Sub Main()
        Dim prince As New Prince("C:\Program Files\Prince\engine\bin\prince.exe")
        prince.SetJavaScript(True)
        prince.SetEncrypt(True)
        prince.SetPDFTitle("Website Export")
        prince.Convert("https://example.com", "webpage.pdf")
        Console.WriteLine("URL converted to PDF")
    End Sub
End Class
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.PdfTitle = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.Encrypt("password");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.EnableJavaScript = true;
        renderer.RenderingOptions.PdfTitle = "Website Export";

        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.Encrypt("password");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("URL converted to PDF");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.EnableJavaScript = True
        renderer.RenderingOptions.PdfTitle = "Website Export"

        Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
        pdf.Encrypt("password")
        pdf.SaveAs("webpage.pdf")
        Console.WriteLine("URL converted to PDF")
    End Sub
End Class
$vbLabelText   $csharpLabel

本範例展示了PrinceXML選項如何映射到IronPDF屬性。PrinceXML在轉換前使用 setter 方法(SetJavaScript()SetEncrypt()SetPDFTitle())。IronPDF使用 RenderingOptions 屬性進行預渲染設置,以及 Encrypt() 物件上的後渲染方法。

關鍵對應:

  • prince.SetJavaScript(true)renderer.RenderingOptions.EnableJavaScript = true
  • prince.SetPDFTitle("...")renderer.RenderingOptions.PdfTitle = "..."
  • prince.SetEncrypt(true)pdf.Encrypt("password") (IronPDF 需要密碼)

請參閱我們的 教學,瞭解更多資訊。

範例 3:HTML 字串至 PDF 的轉換

之前 (PrinceXML):

// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
        File.WriteAllText("temp.html", html);

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("temp.html", "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
// NuGet: Install-Package PrinceXMLWrapper
using PrinceXMLWrapper;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";
        File.WriteAllText("temp.html", html);

        Prince prince = new Prince("C:\\Program Files\\Prince\\engine\\bin\\prince.exe");
        prince.Convert("temp.html", "styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
Imports PrinceXMLWrapper
Imports System
Imports System.IO

Module Program
    Sub Main()
        Dim html As String = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>"
        File.WriteAllText("temp.html", html)

        Dim prince As New Prince("C:\Program Files\Prince\engine\bin\prince.exe")
        prince.Convert("temp.html", "styled-output.pdf")
        Console.WriteLine("Styled PDF created")
    End Sub
End Module
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        string html = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("styled-output.pdf");
        Console.WriteLine("Styled PDF created");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim html As String = "<html><head><style>body { font-family: Arial; color: blue; }</style></head><body><h1>Hello World</h1></body></html>"

        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("styled-output.pdf")
        Console.WriteLine("Styled PDF created")
    End Sub
End Class
$vbLabelText   $csharpLabel

此範例突顯了一個關鍵區別:PrinceXML 需要檔案輸入,因此在轉換之前必須建立一個臨時檔案(File.WriteAllText("temp.html", html))。IronPDF的 RenderHtmlAsPdf() 直接接受 HTML 字串-沒有臨時文件,沒有清理程式碼,沒有磁碟 I/O 開銷。


遷移 CSS 分頁媒體

雖然PrinceXML的CSS 分頁媒體支援功能強大,但卻會造成供應商鎖定 Prince 專屬的 CSS,無法在其他地方使用:

PrinceXML CSS:

@page {
    size: A4;
    margin: 2cm;
    @top-center {
        content: "Document Title";
    }
    @bottom-right {
        content: counter(page);
    }
}

/* Prince-specific extensions */
prince-pdf-page-label: "Chapter " counter(chapter);
prince-pdf-destination: attr(id);

IronPDF C#(等同):

renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56;    // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    MaxHeight = 40
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 56;    // ~2cm
renderer.RenderingOptions.MarginBottom = 56;
renderer.RenderingOptions.MarginLeft = 56;
renderer.RenderingOptions.MarginRight = 56;

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    MaxHeight = 40
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 56    ' ~2cm
renderer.RenderingOptions.MarginBottom = 56
renderer.RenderingOptions.MarginLeft = 56
renderer.RenderingOptions.MarginRight = 56

renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
    .HtmlFragment = "<div style='text-align:center;'>Document Title</div>",
    .MaxHeight = 40
}

renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
    .HtmlFragment = "<div style='text-align:right;'>Page {page} of {total-pages}</div>",
    .MaxHeight = 25
}
$vbLabelText   $csharpLabel

常見的 CSS 移轉問題

問題 1:CSS @page 無法運作

IronPDF 使用 Chromium,對 @page 的支援有限。 將 CSS 規則轉換為 RenderingOptions。

問題 2:頁邊框遺失

CSS 邊距框(@top-center@bottom-right)是 Prince 特有的。 請改用 HtmlHeader/HtmlFooter

問題 3:string-set/content 無法運作

string-set CSS 屬性是 Prince 特有的。 使用來自 <title> 標籤的 {html-title} 佔位符:

<title>Chapter 1: Introduction</title>
<title>Chapter 1: Introduction</title>
HTML
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div>{html-title}</div>"
};
$vbLabelText   $csharpLabel

問題 4:計數器(頁面)不正確

使用IronPDF的 {total-pages} 佔位符取代 CSS 計數器。


效能比較

手術 PrinceXML IronPDF
簡單的 HTML ~400ms ~300ms
複雜的 CSS ~600ms ~400ms
JavaScript 頁面 限額 ~500ms
大型文件 ~1500ms ~1000ms
並發 (10) ~4000ms ~1500ms
啟動費用 ~200ms ~50ms

遷移後的新功能

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

PDF 合併

var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
var pdf1 = PdfDocument.FromFile("chapter1.pdf");
var pdf2 = PdfDocument.FromFile("chapter2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("complete_book.pdf");
Dim pdf1 = PdfDocument.FromFile("chapter1.pdf")
Dim pdf2 = PdfDocument.FromFile("chapter2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("complete_book.pdf")
$vbLabelText   $csharpLabel

水印。

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

數位簽名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
$vbLabelText   $csharpLabel

表格填寫

var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
var pdf = PdfDocument.FromFile("form.pdf");
pdf.Form.GetFieldByName("Name").Value = "John Doe";
pdf.SaveAs("filled_form.pdf");
Dim pdf = PdfDocument.FromFile("form.pdf")
pdf.Form.GetFieldByName("Name").Value = "John Doe"
pdf.SaveAs("filled_form.pdf")
$vbLabelText   $csharpLabel

功能比較摘要

特點 PrinceXML IronPDF
原生 .NET
外部流程 要求
同步支援 手冊包裝 原生 async/await
CSS 分頁媒體 支援 透過 RenderingOptions
CSS 網格
Flexbox
JavaScript 限額 完整的 ES2024
世代
合併
分割
編輯
水印 僅限 CSS HTML/CSS + API
數位簽名
PDF/A
加密
格式
NuGet 套件
伺服器安裝 要求

遷移清單

預遷移

  • 識別所有 Prince 命令列調用
  • 使用的文件 CSS @page 規則
  • 列出 Prince 特有的 CSS 屬性(prince-*, string-set
  • 注意任何 PrinceJavaScript函數
  • 辨識所使用的PDF功能(加密、元資料)
  • ironpdf.com取得IronPDF許可證金鑰

程式碼變更

  • 刪除 PrinceXMLWrapper NuGet 套件 安裝 IronPdf NuGet 套件
  • 更新命名空間匯入
  • Prince 實例化替換為 ChromePdfRenderer
  • prince.Convert() 替換為 RenderHtmlFileAsPdf()RenderHtmlAsPdf()
  • 將 setter 方法轉換為 RenderingOptions 屬性
  • 將 @page CSS 遷移到 RenderingOptions
  • 將邊距框替換為 HtmlHeader/HtmlFooter
  • 將 CSS 計數器轉換為 {page}/{total-pages} 佔位符
  • 移除 HTML 字串的臨時檔案處理。
  • 在應用程式啟動時新增許可證初始化

後遷移

  • 測試 HTML 檔案轉換
  • 測試 HTML 字串轉換
  • 測試 URL 轉換
  • 核實頁面大小是否匹配
  • 核對邊距是否匹配
  • 測試頁首和頁尾
  • 核對頁碼
  • 測試加密/安全性
  • 從伺服器移除 Prince 安裝
  • 更新部署腳本

Curtis Chau
技術作家

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

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

鋼鐵支援團隊

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