跳至页脚内容
迁移指南

如何用 C# 从 ZetPDF 迁移到 IronPDF

ZetPDF 是一个用于 C# 应用程序的商业授权 PDF 库,建立在广泛使用的开源 PDFSharp 库的基础之上。 虽然ZetPDF提供了商业支持和基本的 PDF 操作功能,但它继承了 PDFSharp 基础的重大局限性。 最值得注意的是,该库依赖于基于坐标的图形编程,与现代替代工具相比,其 HTML 到 PDF 的转换能力有限。

本指南提供了从ZetPDF到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。

为什么要从ZetPDF迁移

ZetPDF 作为 PDFSharp 的一个分叉,继承了同样的架构限制,这限制了其在现代文档生成工作流中的有效性。 开发团队考虑迁移的主要原因包括

基于坐标的 API:ZetPDF强制开发者使用精确坐标定位每个元素。 随着需求的变化,每个元素的复杂手动定位给维护带来了挑战。

CSS 支持有限:没有样式系统,意味着每个元素都需要手动管理字体和颜色。

不支持 JavaScript 渲染:在生成 PDF 期间无法渲染动态网页内容或执行 JavaScript。

独特功能有限:与直接免费使用 PDFSharp 相比,ZetPDF 几乎没有提供任何令人信服的理由来证明其商业许可的必要性。

手动分页:必须手动计算和管理页面溢出,而不是依赖自动分页。

需要进行文本测量:手动计算文本换行会增加额外的开发成本。

基本问题

ZetPDF 和 PDFSharp 迫使您以精确的坐标定位每个元素:

// ZetPDF: 手册 positioning nightmare
graphics.DrawString("Name:", font, brush, new XPoint(50, 100));
graphics.DrawString("John Doe", font, brush, new XPoint(100, 100));
graphics.DrawString("Address:", font, brush, new XPoint(50, 120));
graphics.DrawString("123 Main St", font, brush, new XPoint(100, 120));
// ... hundreds of lines for a simple form
// ZetPDF: 手册 positioning nightmare
graphics.DrawString("Name:", font, brush, new XPoint(50, 100));
graphics.DrawString("John Doe", font, brush, new XPoint(100, 100));
graphics.DrawString("Address:", font, brush, new XPoint(50, 120));
graphics.DrawString("123 Main St", font, brush, new XPoint(100, 120));
// ... hundreds of lines for a simple form
' ZetPDF: 手册 positioning nightmare
graphics.DrawString("Name:", font, brush, New XPoint(50, 100))
graphics.DrawString("John Doe", font, brush, New XPoint(100, 100))
graphics.DrawString("Address:", font, brush, New XPoint(50, 120))
graphics.DrawString("123 Main St", font, brush, New XPoint(100, 120))
' ... hundreds of lines for a simple form
$vbLabelText   $csharpLabel

IronPDF 使用 HTML/CSS--布局引擎处理一切:

// IronPDF: Simple HTML
var html = @"
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF: Simple HTML
var html = @"
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>";
var pdf = renderer.RenderHtmlAsPdf(html);
' IronPDF: Simple HTML
Dim html As String = "
<p><strong>Name:</strong> John Doe</p>
<p><strong>Address:</strong> 123 Main St</p>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

IronPDF与 ZetPDF:功能比较

了解架构差异有助于技术决策者评估迁移投资:

特征 ZetPDF IronPDF
基于 PDFSharp
HTML-PDF 转换 有限的 是(全 Chromium)
商业许可 是,永久
开源基金会 PDFSharp(MIT 许可) 基于 Chromium
CSS支持 完整的 CSS3
JavaScript语言 完整的 ES2024
自动排版
自动分页
表格 手工绘图 HTML <table>
页眉/页脚 手册 HTML/CSS
水印 手册代码 内置
合并 PDF 文件 有限的
拆分 PDF 文件 有限的
数字签名
PDF/A
简单易用 缓和 高的

快速入门:ZetPDF 向IronPDF迁移。

迁移工作可以通过以下基本步骤立即开始。

步骤 1:替换 NuGet 软件包

移除 ZetPDF:

# Remove ZetPDF
dotnet remove package ZetPDF
# Remove ZetPDF
dotnet remove package ZetPDF
SHELL

安装 IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

步骤 2:更新命名空间

用IronPDF命名空间替换ZetPDF命名空间:

// Before (ZetPDF)
using ZetPdf;
using ZetPdf.Drawing;
using ZetPdf.Fonts;

// After (IronPDF)
using IronPdf;
// Before (ZetPDF)
using ZetPdf;
using ZetPdf.Drawing;
using ZetPdf.Fonts;

// After (IronPDF)
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

代码迁移示例

将HTML转换为PDF

HTML 转 PDF 操作演示了这些 .NET PDF 库之间的 API 差异。

ZetPDF方法:

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        converter.ConvertHtmlToPdf(htmlContent, "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        converter.ConvertHtmlToPdf(htmlContent, "output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
Imports ZetPDF
Imports System

Module Program
    Sub Main()
        Dim converter As New HtmlToPdfConverter()
        Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
        converter.ConvertHtmlToPdf(htmlContent, "output.pdf")
        Console.WriteLine("PDF created successfully")
    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 htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        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 htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim htmlContent = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
        pdf.SaveAs("output.pdf")
        Console.WriteLine("PDF created successfully")
    End Sub
End Class
$vbLabelText   $csharpLabel

ZetPDF 使用 HtmlToPdfConverterConvertHtmlToPdf(),直接写入文件路径。IronPDF提供 ChromePdfRendererRenderHtmlAsPdf(),返回一个 PdfDocument 对象,让您在输出方面拥有更大的灵活性——您可以保存到文件、获取二进制数据或在保存之前执行其他操作。

有关 HTML 转 PDF 的高级应用场景,请参阅 HTML 转 PDF 指南

将 URL 转换为 PDF

URL 到 PDF 的转换清楚地显示了模式差异。

ZetPDF方法:

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var url = "https://www.example.com";
        converter.ConvertUrlToPdf(url, "webpage.pdf");
        Console.WriteLine("PDF from URL created successfully");
    }
}
// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var url = "https://www.example.com";
        converter.ConvertUrlToPdf(url, "webpage.pdf");
        Console.WriteLine("PDF from URL created successfully");
    }
}
Imports ZetPDF
Imports System

Module Program
    Sub Main()
        Dim converter As New HtmlToPdfConverter()
        Dim url As String = "https://www.example.com"
        converter.ConvertUrlToPdf(url, "webpage.pdf")
        Console.WriteLine("PDF from URL created successfully")
    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 url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF from URL created successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF from URL created successfully");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        Dim url = "https://www.example.com"
        Dim pdf = renderer.RenderUrlAsPdf(url)
        pdf.SaveAs("webpage.pdf")
        Console.WriteLine("PDF from URL created successfully")
    End Sub
End Class
$vbLabelText   $csharpLabel

ZetPDF 使用与 HtmlToPdfConverter 相同的 ConvertUrlToPdf() 类。IronPDF提供 RenderUrlAsPdf() on ChromePdfRenderer,它利用完整的 Chromium 渲染引擎来精确捕获网页,包括 JavaScript 执行和现代 CSS。

请浏览 URL to PDF 文档,了解身份验证和自定义页眉选项。

合并多个 PDF 文件

PDF 合并显示了文档处理方式上的重大 API 差异。

ZetPDF方法:

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

class Program
{
    static void Main()
    {
        var merger = new PdfMerger();
        var files = new List<string> { "document1.pdf", "document2.pdf" };
        merger.MergeFiles(files, "merged.pdf");
        Console.WriteLine("PDFs merged successfully");
    }
}
// NuGet: Install-Package ZetPDF
using ZetPDF;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var merger = new PdfMerger();
        var files = new List<string> { "document1.pdf", "document2.pdf" };
        merger.MergeFiles(files, "merged.pdf");
        Console.WriteLine("PDFs merged successfully");
    }
}
Imports ZetPDF
Imports System
Imports System.Collections.Generic

Module Program
    Sub Main()
        Dim merger As New PdfMerger()
        Dim files As New List(Of String) From {"document1.pdf", "document2.pdf"}
        merger.MergeFiles(files, "merged.pdf")
        Console.WriteLine("PDFs merged successfully")
    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 pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("document1.pdf"),
            PdfDocument.FromFile("document2.pdf")
        };
        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
        Console.WriteLine("PDFs merged successfully");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("document1.pdf"),
            PdfDocument.FromFile("document2.pdf")
        };
        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
        Console.WriteLine("PDFs merged successfully");
    }
}
Imports IronPdf
Imports System
Imports System.Collections.Generic

Module Program
    Sub Main()
        Dim pdfs As New List(Of PdfDocument) From {
            PdfDocument.FromFile("document1.pdf"),
            PdfDocument.FromFile("document2.pdf")
        }
        Dim merged = PdfDocument.Merge(pdfs)
        merged.SaveAs("merged.pdf")
        Console.WriteLine("PDFs merged successfully")
    End Sub
End Module
$vbLabelText   $csharpLabel

ZetPDF 使用专用的 PdfMerger 类,该类对带有 MergeFiles() 的文件路径进行操作。IronPDF使用 PdfDocument.FromFile() 将文档加载为 PdfDocument 对象,然后使用静态 PdfDocument.Merge() 方法将它们合并。 这种面向对象的方法可以在保存之前对合并后的文档进行其他操作。

探索 IronPDF合并文档,了解更多合并选项。

基于坐标的绘图与 HTML 的对比

对于使用基于坐标图形的现有ZetPDF代码的开发人员,迁移路径包括将绘图命令转换为 HTML/CSS。

基于坐标的ZetPDF方法:

using ZetPdf;
using ZetPdf.Drawing;

var document = new PdfDocument();
var page = document.AddPage();
page.Width = XUnit.FromMillimeter(210);
page.Height = XUnit.FromMillimeter(297);

var graphics = XGraphics.FromPdfPage(page);
var titleFont = new XFont("Arial", 24, XFontStyle.Bold);
var bodyFont = new XFont("Arial", 12);

graphics.DrawString("Company Report", titleFont, XBrushes.Navy,
    new XPoint(50, 50));
graphics.DrawString("This is the introduction paragraph.", bodyFont, XBrushes.Black,
    new XPoint(50, 80));
graphics.DrawString("Generated: " + DateTime.Now.ToString(), bodyFont, XBrushes.Gray,
    new XPoint(50, 100));

document.Save("report.pdf");
using ZetPdf;
using ZetPdf.Drawing;

var document = new PdfDocument();
var page = document.AddPage();
page.Width = XUnit.FromMillimeter(210);
page.Height = XUnit.FromMillimeter(297);

var graphics = XGraphics.FromPdfPage(page);
var titleFont = new XFont("Arial", 24, XFontStyle.Bold);
var bodyFont = new XFont("Arial", 12);

graphics.DrawString("Company Report", titleFont, XBrushes.Navy,
    new XPoint(50, 50));
graphics.DrawString("This is the introduction paragraph.", bodyFont, XBrushes.Black,
    new XPoint(50, 80));
graphics.DrawString("Generated: " + DateTime.Now.ToString(), bodyFont, XBrushes.Gray,
    new XPoint(50, 100));

document.Save("report.pdf");
Imports ZetPdf
Imports ZetPdf.Drawing

Dim document As New PdfDocument()
Dim page = document.AddPage()
page.Width = XUnit.FromMillimeter(210)
page.Height = XUnit.FromMillimeter(297)

Dim graphics = XGraphics.FromPdfPage(page)
Dim titleFont As New XFont("Arial", 24, XFontStyle.Bold)
Dim bodyFont As New XFont("Arial", 12)

graphics.DrawString("Company Report", titleFont, XBrushes.Navy, New XPoint(50, 50))
graphics.DrawString("This is the introduction paragraph.", bodyFont, XBrushes.Black, New XPoint(50, 80))
graphics.DrawString("Generated: " & DateTime.Now.ToString(), bodyFont, XBrushes.Gray, New XPoint(50, 100))

document.Save("report.pdf")
$vbLabelText   $csharpLabel

IronPDF HTML 方法:

using IronPdf;

var html = $@"
<html>
<head>
    <style>
        body {{ font-family: Arial, sans-serif; padding: 50px; }}
        h1 {{ color: navy; }}
        .date {{ color: gray; }}
    </style>
</head>
<body>
    <h1>Company Report</h1>
    <p>This is the introduction paragraph.</p>
    <p class='date'>Generated: {DateTime.Now}</p>
</body>
</html>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
using IronPdf;

var html = $@"
<html>
<head>
    <style>
        body {{ font-family: Arial, sans-serif; padding: 50px; }}
        h1 {{ color: navy; }}
        .date {{ color: gray; }}
    </style>
</head>
<body>
    <h1>Company Report</h1>
    <p>This is the introduction paragraph.</p>
    <p class='date'>Generated: {DateTime.Now}</p>
</body>
</html>";

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
Imports IronPdf

Dim html As String = $"
<html>
<head>
    <style>
        body {{ font-family: Arial, sans-serif; padding: 50px; }}
        h1 {{ color: navy; }}
        .date {{ color: gray; }}
    </style>
</head>
<body>
    <h1>Company Report</h1>
    <p>This is the introduction paragraph.</p>
    <p class='date'>Generated: {DateTime.Now}</p>
</body>
</html>"

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

ZetPDF 方法需要创建字体对象、计算精确的像素位置并手动管理图形上下文。IronPDF的方法使用网络开发人员已经熟悉的标准 HTML 和 CSS--字体、颜色和布局都通过熟悉的 CSS 属性来处理。

ZetPDFAPI 到IronPDF映射参考

这种映射通过显示直接的 API 对应关系来加速迁移:

ZetPDF IronPDF
new PdfDocument() new ChromePdfRenderer()
document.AddPage() 自动翻译
XGraphics.FromPdfPage(page) 不适用
graphics.DrawString() HTML 文本元素
graphics.DrawImage() <img> 标签
graphics.DrawLine() CSS 边框
graphics.DrawRectangle() CSS border + div
new XFont() CSS font-family
XBrushes.Black CSS color
document.Save() pdf.SaveAs()
PdfReader.Open() PdfDocument.FromFile()
HtmlToPdfConverter ChromePdfRenderer
ConvertHtmlToPdf() RenderHtmlAsPdf()
ConvertUrlToPdf() RenderUrlAsPdf()
PdfMerger PdfDocument.Merge()

常见迁移问题和解决方案

问题 1:基于坐标的布局

ZetPDF:所有内容都需要精确的 X、Y 坐标和手动定位。

解决方案: 使用HTML/CSS流程布局。 需要绝对定位时,请使用 CSS:

.positioned-element {
    position: absolute;
    top: 100px;
    left: 50px;
}

问题 2:字体对象管理

ZetPDF:为每种字体变体创建 XFont 对象。

解决方案:使用 CSS 字体-family-字体自动处理:

<style>
    body { font-family: Arial, sans-serif; }
    h1 { font-family: 'Times New Roman', serif; font-size: 24px; font-weight: bold; }
</style>
<style>
    body { font-family: Arial, sans-serif; }
    h1 { font-family: 'Times New Roman', serif; font-size: 24px; font-weight: bold; }
</style>
HTML

问题 3:颜色处理

ZetPDF:使用 XBrushes 和着色对象。

解决方案:使用标准 CSS 颜色:

.header { color: navy; background-color: #f5f5f5; }
.warning { color: rgb(255, 0, 0); }

问题 4:手动分页

ZetPDF: 跟踪 Y 位置并在内容溢出时手动创建新页面。

解决方案:IronPDF可处理自动分页。 如需明确控制,请使用 CSS:

.section { page-break-after: always; }
.keep-together { page-break-inside: avoid; }

问题 5:表格创建

ZetPDF: 需要手动绘制矩形、线条和文本定位。

解决方案:使用标准的 HTML 表格和 CSS 样式:

<table style="border-collapse: collapse; width: 100%;">
    <tr>
        <th style="border: 1px solid black; padding: 8px;">Header</th>
    </tr>
    <tr>
        <td style="border: 1px solid black; padding: 8px;">Data</td>
    </tr>
</table>
<table style="border-collapse: collapse; width: 100%;">
    <tr>
        <th style="border: 1px solid black; padding: 8px;">Header</th>
    </tr>
    <tr>
        <td style="border: 1px solid black; padding: 8px;">Data</td>
    </tr>
</table>
HTML

ZetPDF迁移清单

迁移前任务

审核您的代码库,确定所有ZetPDF使用情况:

grep -r "using ZetPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|PdfMerger\|XGraphics" --include="*.cs" .
grep -r "using ZetPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|PdfMerger\|XGraphics" --include="*.cs" .
SHELL

需要转换为 HTML 的基于坐标的绘图代码文档。 注意字体和颜色的使用模式。 将布局结构映射为 HTML 对应内容。

代码更新任务

1.删除ZetPDFNuGet 软件包 2.安装IronPDFNuGet 软件包

  1. 将命名空间导入从 ZetPDF 更新为 IronPdf
  2. HtmlToPdfConverter 替换为 ChromePdfRenderer
  3. ConvertHtmlToPdf() 调用转换为 RenderHtmlAsPdf() + SaveAs()
  4. ConvertUrlToPdf() 调用转换为 RenderUrlAsPdf() + SaveAs()
  5. PdfMerger.MergeFiles() 替换为 PdfDocument.Merge()
  6. DrawString() 调用转换为 HTML 文本元素
  7. XFont 转换为 CSS font-family
  8. XBrushes 替换为 CSS 颜色 11.在启动时添加IronPDF许可证初始化功能

迁移后测试

迁移后,验证这些方面:

  • 比较可视化输出,确保外观匹配或改进
  • 通过 CSS 样式验证字体是否达到预期效果
  • 测试自动分页是否正确分页
  • 验证图片的位置和显示是否正确
  • 测试 PDF 合并操作产生正确的输出
  • 确认所有现有功能都能在新实施中使用

迁移到IronPDF的主要优势

从ZetPDF迁移到IronPDF有几个关键优势:

现代 Chromium 渲染引擎:IronPDF使用 Chromium 进行 HTML 到 PDF 的转换,确保完全支持 CSS3 和 ES2024 JavaScript。 正确呈现现代框架和响应式设计。

基于 HTML 的内容创建: Web 开发人员可以利用现有的 HTML 和 CSS 技能。 无需学习基于坐标的绘图 API 或管理字体对象。

自动布局和分页:文本换行、分页符和流式布局自动完成。 无需手动计算元素位置。

简化 API:常用操作只需调用一个方法即可完成。 PdfDocument.Merge() 替换了复杂的文件路径处理模式。

积极开发:随着 .NET 10 和 C# 14 的普及,IronPDF 将持续更新,确保与当前和未来的 .NET 版本兼容。

功能齐全:内置水印、数字签名、PDF/A 合规性以及ZetPDF所缺乏的高级 PDF 操作功能。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我