跳至頁尾內容
影片

如何用 C# 用響應式 CSS 將 HTML 轉換為 PDF

雖然ComPDFKit提供穩固的PDF操作功能,但有許多因素使開發團隊考慮更成熟的替代方案。

市場成熟度與生態系統比較

ComPDFKit面臨於新進市場參與者通常會遇到的挑戰:文件空缺、較小的社群,及有限的Stack Overflow涵蓋範圍。 IronPDF經過十年的改進,提供企業專案所需的穩定性和資源。

方面 ComPDFKit IronPDF
HTML到PDF 需要手動HTML解析 原生Chromium渲染
市場成熟度 較新的參與者 10年以上,經過考驗
社群規模 較小,有限的Stack Overflow 大型、活躍的社群
文件 一些空缺 廣泛的教程與指南
下載次數 正在增長 超過1,000萬次NuGet下載
API風格 受到C++影響,冗長 現代的 .NET 流利API
記憶體管理 手動Release()呼叫 自動GC處理

功能對等

兩個程式庫都支援全面的PDF功能:

功能 ComPDFKit IronPDF
HTML轉PDF 基礎/手動 ✅ 原生Chromium
URL到PDF 手動實現 ✅ 內建
從頭建立PDF
PDF編輯
文字提取
合併/分割
數位簽名
表單填寫
浮水印
跨平台 Windows、Linux、macOS Windows、Linux、macOS

主要遷移利益

  1. 更優秀的HTML渲染:IronPDF的Chromium引擎能夠原生處理現代CSS3、JavaScript和響應式佈局
  2. 成熟的生態系統:超過10年的改進,廣泛的文件資料,並經過考驗的穩定性
  3. 更簡單的API:更少樣板程式碼,無需手動記憶體管理與Release()呼叫
  4. 更好的 .NET整合:原生async/await、LINQ支持、流利的介面
  5. 豐富的資源:成千上萬的Stack Overflow答案和社群範例

遷移前準備

前提條件

確保您的環境符合以下要求:

  • .NET Framework 4.6.2+ or .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+或VS Code與C#擴展
  • NuGet包管理器存取 -IronPDF許可證金鑰(免費試用可在 ironpdf.com 獲得)

審核ComPDFKit使用情形

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

# Find allComPDFKitusages in your codebase
grep -r "using ComPDFKit" --include="*.cs" .
grep -r "CPDFDocument\|CPDFPage\|CPDFAnnotation" --include="*.cs" .

# Find NuGet package references
grep -r "ComPDFKit" --include="*.csproj" .
# Find allComPDFKitusages in your codebase
grep -r "using ComPDFKit" --include="*.cs" .
grep -r "CPDFDocument\|CPDFPage\|CPDFAnnotation" --include="*.cs" .

# Find NuGet package references
grep -r "ComPDFKit" --include="*.csproj" .
SHELL

預期的中斷變更

更改 ComPDFKit IronPDF 影響
文件載入 CPDFDocument.InitWithFilePath() PdfDocument.FromFile() 方法名稱變更
保存 document.WriteToFilePath() pdf.SaveAs() 方法名稱變更
記憶體清理 需要document.Release() 自動(GC) 移除手動清理
頁面存取 document.PageAtIndex(i) pdf.Pages[i] 陣列樣式存取
頁面索引 0起始基數 0起始基數 不需要變更
HTML 渲染 手動實現 RenderHtmlAsPdf() 主要簡化
文字提取 textPage.GetText() pdf.ExtractAllText() 簡化的API

逐步遷移過程

步驟1:更新NuGet包

移除ComPDFKit套件並安裝IronPDF:

# RemoveComPDFKitpackages
dotnet remove package ComPDFKit.NetCore
dotnet remove package ComPDFKit.NetFramework

# Install IronPDF
dotnet add package IronPdf
# RemoveComPDFKitpackages
dotnet remove package ComPDFKit.NetCore
dotnet remove package ComPDFKit.NetFramework

# Install IronPDF
dotnet add package IronPdf
SHELL

步驟 2:更新命名空間引用

將ComPDFKit命名空間替換為IronPDF:

// Remove these
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Import;

// Add this
using IronPdf;
// Remove these
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFPage;
using ComPDFKit.PDFAnnotation;
using ComPDFKit.Import;

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

步驟3:配置授權

// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

完整 API 遷移參考

文件操作

任務 ComPDFKit IronPDF
建立空文件 CPDFDocument.CreateDocument() new PdfDocument()
從檔案載入 CPDFDocument.InitWithFilePath(path) PdfDocument.FromFile(path)
從流載入 CPDFDocument.InitWithStream(stream) PdfDocument.FromStream(stream)
保存到檔案 document.WriteToFilePath(path) pdf.SaveAs(path)
獲取頁數 document.PageCount pdf.PageCount
釋放/處置 document.Release() 不需要

HTML到PDF轉換

任務 ComPDFKit IronPDF
HTML字串轉PDF 需要手動實現 renderer.RenderHtmlAsPdf(html)
HTML文件轉PDF 需要手動實現 renderer.RenderHtmlFileAsPdf(path)
URL到PDF 需要手動實現 renderer.RenderUrlAsPdf(url)
設定頁面大小 透過頁面建立參數 renderer.RenderingOptions.PaperSize
設定邊距 透過編輯器配置 renderer.RenderingOptions.MarginTop

合併和分割操作

任務 ComPDFKit IronPDF
合併文件 doc1.ImportPagesAtIndex(doc2, range, index) PdfDocument.Merge(pdf1, pdf2)
分割文件 提取頁面到新文件 pdf.CopyPages(start, end)

程式碼遷移範例

HTML到PDF轉換

ComPDFKit與IronPDF之間最大的不同在於HTML渲染。 ComPDFKit需要手動文字放置,而IronPDF利用其Chromium引擎原生進行HTML渲染。

ComPDFKit實現:

// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using System;

class Program
{
    static void Main()
    {
        // ComPDFKit's .NET SDK has no native HTML-to-PDF rendering.
        // The closest equivalent is to create a blank document and lay
        // out primitives manually, or call ComPDFKit's separate cloud
        // Conversion API (a different SKU).
        var document = CPDFDocument.CreateDocument();
        document.InsertPage(0, 595, 842, string.Empty);

        document.WriteToFilePath("output.pdf");
        document.Release();
    }
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using System;

class Program
{
    static void Main()
    {
        // ComPDFKit's .NET SDK has no native HTML-to-PDF rendering.
        // The closest equivalent is to create a blank document and lay
        // out primitives manually, or call ComPDFKit's separate cloud
        // Conversion API (a different SKU).
        var document = CPDFDocument.CreateDocument();
        document.InsertPage(0, 595, 842, string.Empty);

        document.WriteToFilePath("output.pdf");
        document.Release();
    }
}
Imports ComPDFKit.PDFDocument
Imports System

Module Program
    Sub Main()
        ' ComPDFKit's .NET SDK has no native HTML-to-PDF rendering.
        ' The closest equivalent is to create a blank document and lay
        ' out primitives manually, or call ComPDFKit's separate cloud
        ' Conversion API (a different SKU).
        Dim document = CPDFDocument.CreateDocument()
        document.InsertPage(0, 595, 842, String.Empty)

        document.WriteToFilePath("output.pdf")
        document.Release()
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF實現:

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

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>");
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is HTML content.</p>")
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF的ChromePdfRenderer消除了手動文字定位和編輯器管理的需求。 欲了解更多HTML轉換選項,請參閱 HTML到PDF文件

合併多個 PDF

ComPDFKit實現:

// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.Import;
using System;

class Program
{
    static void Main()
    {
        var document1 = CPDFDocument.InitWithFilePath("file1.pdf");
        var document2 = CPDFDocument.InitWithFilePath("file2.pdf");

        // Import pages from document2 into document1
        document1.ImportPagesAtIndex(document2, "0-" + (document2.PageCount - 1), document1.PageCount);

        document1.WriteToFilePath("merged.pdf");
        document1.Release();
        document2.Release();
    }
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.Import;
using System;

class Program
{
    static void Main()
    {
        var document1 = CPDFDocument.InitWithFilePath("file1.pdf");
        var document2 = CPDFDocument.InitWithFilePath("file2.pdf");

        // Import pages from document2 into document1
        document1.ImportPagesAtIndex(document2, "0-" + (document2.PageCount - 1), document1.PageCount);

        document1.WriteToFilePath("merged.pdf");
        document1.Release();
        document2.Release();
    }
}
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.Import
Imports System

Module Program
    Sub Main()
        Dim document1 = CPDFDocument.InitWithFilePath("file1.pdf")
        Dim document2 = CPDFDocument.InitWithFilePath("file2.pdf")

        ' Import pages from document2 into document1
        document1.ImportPagesAtIndex(document2, "0-" & (document2.PageCount - 1), document1.PageCount)

        document1.WriteToFilePath("merged.pdf")
        document1.Release()
        document2.Release()
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF實現:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("file1.pdf");
        var pdf2 = PdfDocument.FromFile("file2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("file1.pdf");
        var pdf2 = PdfDocument.FromFile("file2.pdf");

        var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
        merged.SaveAs("merged.pdf");
    }
}
Imports IronPdf
Imports System
Imports System.Collections.Generic

Module Program
    Sub Main()
        Dim pdf1 = PdfDocument.FromFile("file1.pdf")
        Dim pdf2 = PdfDocument.FromFile("file2.pdf")

        Dim merged = PdfDocument.Merge(New List(Of PdfDocument) From {pdf1, pdf2})
        merged.SaveAs("merged.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF的靜態ImportPagesAtIndex模式冗長。 欲了解更多選項,請參閱 PDF合併文件

新增水印

浮水印顯示出ComPDFKit的屬性驅動CPDFWatermark配置與IronPDF的基於HTML的樣式的不同。

ComPDFKit實現:

// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFWatermark;
using System;

class Program
{
    static void Main()
    {
        var document = CPDFDocument.InitWithFilePath("input.pdf");

        CPDFWatermark watermark = document.InitWatermark(
            C_Watermark_Type.WATERMARK_TYPE_TEXT);
        watermark.SetText("CONFIDENTIAL");
        watermark.SetFontName("Helvetica");
        watermark.SetFontSize(48);
        watermark.SetTextRGBColor(255, 0, 0);
        watermark.SetRotation(45);
        watermark.SetOpacity(76); // 0..255
        watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_CENTER);
        watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_CENTER);
        watermark.SetPages($"0-{document.PageCount - 1}");
        watermark.SetFront(true);
        watermark.CreateWatermark();

        document.WriteToFilePath("watermarked.pdf");
        document.Release();
    }
}
// NuGet: Install-Package ComPDFKit.NetCore
using ComPDFKit.PDFDocument;
using ComPDFKit.PDFWatermark;
using System;

class Program
{
    static void Main()
    {
        var document = CPDFDocument.InitWithFilePath("input.pdf");

        CPDFWatermark watermark = document.InitWatermark(
            C_Watermark_Type.WATERMARK_TYPE_TEXT);
        watermark.SetText("CONFIDENTIAL");
        watermark.SetFontName("Helvetica");
        watermark.SetFontSize(48);
        watermark.SetTextRGBColor(255, 0, 0);
        watermark.SetRotation(45);
        watermark.SetOpacity(76); // 0..255
        watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_CENTER);
        watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_CENTER);
        watermark.SetPages($"0-{document.PageCount - 1}");
        watermark.SetFront(true);
        watermark.CreateWatermark();

        document.WriteToFilePath("watermarked.pdf");
        document.Release();
    }
}
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.PDFWatermark
Imports System

Class Program
    Shared Sub Main()
        Dim document = CPDFDocument.InitWithFilePath("input.pdf")

        Dim watermark As CPDFWatermark = document.InitWatermark(C_Watermark_Type.WATERMARK_TYPE_TEXT)
        watermark.SetText("CONFIDENTIAL")
        watermark.SetFontName("Helvetica")
        watermark.SetFontSize(48)
        watermark.SetTextRGBColor(255, 0, 0)
        watermark.SetRotation(45)
        watermark.SetOpacity(76) ' 0..255
        watermark.SetVertalign(C_Watermark_Vertalign.WATERMARK_VERTALIGN_CENTER)
        watermark.SetHorizalign(C_Watermark_Horizalign.WATERMARK_HORIZALIGN_CENTER)
        watermark.SetPages($"0-{document.PageCount - 1}")
        watermark.SetFront(True)
        watermark.CreateWatermark()

        document.WriteToFilePath("watermarked.pdf")
        document.Release()
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF實現:

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

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

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

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>",
            rotation: 45,
            verticalAlignment: VerticalAlignment.Middle,
            horizontalAlignment: HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing
Imports System

Module Program
    Sub Main()
        Dim pdf = PdfDocument.FromFile("input.pdf")

        pdf.ApplyWatermark("<h1 style='color:rgba(255,0,0,0.3);'>CONFIDENTIAL</h1>", 
                           rotation:=45, 
                           verticalAlignment:=VerticalAlignment.Middle, 
                           horizontalAlignment:=HorizontalAlignment.Center)

        pdf.SaveAs("watermarked.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF將多步CPDFWatermark配置簡化為單一方法呼叫與HTML/CSS樣式。 如需更多選項,請參見浮水印文件

文字提取

ComPDFKit實現:

using ComPDFKit.PDFDocument;
using System.Text;

var document = CPDFDocument.InitWithFilePath("document.pdf");

// Extract text (verbose)
var allText = new StringBuilder();
for (int i = 0; i < document.PageCount; i++)
{
    var page = document.PageAtIndex(i);
    var textPage = page.GetTextPage();
    allText.AppendLine(textPage.GetText(0, textPage.CountChars()));
    textPage.Release();
    page.Release();
}

document.WriteToFilePath("output.pdf");
document.Release(); // Must remember to release!
using ComPDFKit.PDFDocument;
using System.Text;

var document = CPDFDocument.InitWithFilePath("document.pdf");

// Extract text (verbose)
var allText = new StringBuilder();
for (int i = 0; i < document.PageCount; i++)
{
    var page = document.PageAtIndex(i);
    var textPage = page.GetTextPage();
    allText.AppendLine(textPage.GetText(0, textPage.CountChars()));
    textPage.Release();
    page.Release();
}

document.WriteToFilePath("output.pdf");
document.Release(); // Must remember to release!
Imports ComPDFKit.PDFDocument
Imports System.Text

Dim document = CPDFDocument.InitWithFilePath("document.pdf")

' Extract text (verbose)
Dim allText As New StringBuilder()
For i As Integer = 0 To document.PageCount - 1
    Dim page = document.PageAtIndex(i)
    Dim textPage = page.GetTextPage()
    allText.AppendLine(textPage.GetText(0, textPage.CountChars()))
    textPage.Release()
    page.Release()
Next

document.WriteToFilePath("output.pdf")
document.Release() ' Must remember to release!
$vbLabelText   $csharpLabel

IronPDF實現:

using IronPdf;

var pdf = PdfDocument.FromFile("document.pdf");

// Extract text (one-liner)
string allText = pdf.ExtractAllText();

pdf.SaveAs("output.pdf");
// No Release() needed - GC handles cleanup
using IronPdf;

var pdf = PdfDocument.FromFile("document.pdf");

// Extract text (one-liner)
string allText = pdf.ExtractAllText();

pdf.SaveAs("output.pdf");
// No Release() needed - GC handles cleanup
Imports IronPdf

Dim pdf = PdfDocument.FromFile("document.pdf")

' Extract text (one-liner)
Dim allText As String = pdf.ExtractAllText()

pdf.SaveAs("output.pdf")
' No Release() needed - GC handles cleanup
$vbLabelText   $csharpLabel

IronPDF將多行文字提取與手動Release()呼叫減至單一方法。 更多的提取選項,請參閱 文字提取文件

密碼保護

IronPDF實現:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

pdf.SaveAs("protected.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "userPassword";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

pdf.SaveAs("protected.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Document</h1>")

' Set security
pdf.SecuritySettings.UserPassword = "userPassword"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
pdf.SecuritySettings.AllowUserCopyPasteContent = False

pdf.SaveAs("protected.pdf")
$vbLabelText   $csharpLabel

欲了解全面的安全選項,請參閱 加密文件

關鍵遷移注意事項

移除所有Release()呼叫

最有影響的改變是去除手動記憶體管理。 ComPDFKit需要在文件、頁面、文字頁面上顯式進行Release()呼叫。 IronPDF透過.NET垃圾回收自動處理這些操作。

//ComPDFKit- manual cleanup required
document.Release();
page.Release();
textPage.Release();

//IronPDF- no equivalent needed
// GC handles cleanup automatically
//ComPDFKit- manual cleanup required
document.Release();
page.Release();
textPage.Release();

//IronPDF- no equivalent needed
// GC handles cleanup automatically
'ComPDFKit- manual cleanup required
document.Release()
page.Release()
textPage.Release()

'IronPDF- no equivalent needed
' GC handles cleanup automatically
$vbLabelText   $csharpLabel

原生HTML渲染

ComPDFKit需透過編輯器API來手動文字放置,而IronPDF用其Chromium引擎原生渲染HTML/CSS,支持現代CSS3、JavaScript和響應式佈局。

相同的頁面索引

兩個程式庫都使用0起始索引(Pages[0]是第一頁)—頁面存取程式碼不需要更改。

簡化的文字提取

用一個單一的GetTextPage() + GetText() + Release()模式。

流利的合併API

用簡單的ImportPagesAtIndex(doc2, "0-9", pageCount)

後遷移檢查清單

完成程式碼遷移後,請驗證以下內容:

  • 運行所有單元測試以驗證PDF生成是否正常工作
  • 比較PDF輸出品質(IronPDF的Chromium引擎可能產生不同的效果——通常較好)
  • 測試具有複雜CSS和JavaScript的HTML渲染
  • 驗證文字提取的準確性
  • 測試表單功能
  • 性能測試批量操作
  • 在所有目標環境中測試
  • 更新 CI/CD 管道
  • 移除ComPDFKit的授權檔案

其他資源


從ComPDFKit遷移到IronPDF消除了手動記憶體管理與Release()呼叫,並提供ComPDFKit欠缺的原生HTML到PDF渲染。 向IronPDF的成熟生態系統的過渡提供了文件深度、社群支持和經過驗證的穩定性,這些都是企業專案所需的。

請注意ComPDFKit是其各自所有者的註冊商標。 本站與ComPDFKit沒有關聯、不是其授權或其贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

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