跳至页脚内容
迁移指南

如何用 C# 从 PDFBolt 迁移到 IronPDF

从PDFBolt迁移到IronPDF可将您的 .NET PDF 工作流程从仅支持云的外部文档处理 SaaS 服务迁移到具有完全数据隐私和无限本地生成功能的自托管库。 本指南提供了一个全面、逐步的迁移路径,可消除网络依赖性、使用限制和外部数据传输,同时获得PDFBolt无法提供的 PDF 操作功能。

为什么要从PDFBolt迁移到 IronPDF.

仅限云的问题

PDFBolt 是一个纯云 SaaS 平台,可在外部服务器上处理您的文档。 这种架构虽然方便快速制作原型,但却给生产应用带来了巨大挑战:

1.仅云端处理:每个文档都通过外部服务器处理——没有自托管选项,这可能会阻碍那些需要更多控制其数据和流程的企业。

2.数据隐私风险:敏感文件(合同、医疗记录、财务数据)必须向外传输。 处理敏感信息的公司会有合理的顾虑。

3.使用限制:免费套餐每月最多只能处理 100 个文档,这对于规模较大的企业来说可能不够用。 按文档付费的价格对于生产工作量来说会很快增加。

4.网络依赖性:互联网中断或PDFBolt服务中断意味着您的 PDF 生成将完全停止。

5.延迟:与本地处理相比,网络往返会使每次转换增加几秒钟。

6.合规性问题: GDPR、HIPAA 和 SOC2 审计因外部文档处理而变得复杂。

  1. API 密钥安全:泄露的 API 密钥可能导致未经授权的使用,并被计入您的帐户。

8.供应商锁定:如果PDFBolt更改条款或关闭,您的应用程序将无法运行。

PDFBolt与IronPDF对比

关注 PDFBolt IronPDF
数据位置 外部服务器 仅限您的服务器
使用限制 100 次免费,然后按文档收费 无限制
需要互联网 是的,始终
延迟 网络往返 毫秒
合规性 复杂(外部处理) 简单(本地处理)
成本模式 按文档 一次性或年度
离线操作 不可能 完全支持
API 关键风险 泄露 = 计费 许可证密钥,无计费风险

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 提供了一个自托管基础,可确保完全的数据隐私并消除对外部云服务的依赖。


开始之前

前提条件

  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 PDFBolt
dotnet remove package PDFBolt

# Install IronPDF
dotnet add package IronPdf
# Remove PDFBolt
dotnet remove package PDFBolt

# Install IronPDF
dotnet add package IronPdf
SHELL

许可配置

// 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

确定PDFBolt的用法

# Find allPDFBoltreferences
grep -r "PDFBolt\|HtmlToPdfConverter\|ConvertHtmlString\|ConvertUrl" --include="*.cs" .

# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
# Find allPDFBoltreferences
grep -r "PDFBolt\|HtmlToPdfConverter\|ConvertHtmlString\|ConvertUrl" --include="*.cs" .

# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
SHELL

完整的 API 参考

核心类映射

PDFBolt IronPDF
new HtmlToPdfConverter() new ChromePdfRenderer()
PageSize PdfPaperSize
(返回字节[]) PdfDocument

转换方法映射

PDFBolt IronPDF
converter.ConvertHtmlString(html) renderer.RenderHtmlAsPdf(html)
converter.ConvertUrl(url) renderer.RenderUrlAsPdf(url)

输出方法映射

PDFBolt IronPDF
File.WriteAllBytes(path, pdf) pdf.SaveAs(path)
(pdf是字节[]) pdf.BinaryData
(手动流) pdf.Stream

页面配置映射

PDFBolt IronPDF
converter.PageSize = PageSize.A4 renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
converter.MarginTop = 20 renderer.RenderingOptions.MarginTop = 20
converter.MarginBottom = 20 renderer.RenderingOptions.MarginBottom = 20
converter.MarginLeft = 15 renderer.RenderingOptions.MarginLeft = 15
converter.MarginRight = 15 renderer.RenderingOptions.MarginRight = 15

页眉/页脚占位符映射

PDFBolt IronPDF
{pageNumber} {page}
{totalPages} {total-pages}
{date} {date}
{title} {html-title}

代码迁移示例

示例 1:将基本 HTML 转换为 PDF.

之前 (PDFBolt):

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var html = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports PDFBolt
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter = New HtmlToPdfConverter()
        Dim html = "<html><body><h1>Hello World</h1></body></html>"
        Dim pdf = converter.ConvertHtmlString(html)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

After (IronPDF):

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

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

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

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

这里的根本区别在于返回类型和保存模式。PDFBolt的 HtmlToPdfConverter.ConvertHtmlString() 返回一个 byte[],您必须使用 File.WriteAllBytes() 手动将其写入磁盘。 这需要导入 System.IO 并自行处理文件操作。

IronPDF 的 ChromePdfRenderer.RenderHtmlAsPdf() 返回一个 PdfDocument 对象,该对象具有内置的 SaveAs() 方法。 这种面向对象的方法还有其他好处:您可以在保存之前对 PDF 进行操作(添加水印、合并文档、添加安全性)。 如果您需要原始字节以与现有代码兼容,请使用 pdf.BinaryData。 有关其他渲染选项,请参阅 HTML to PDF 文档

示例 2:URL 到 PDF 的转换

之前 (PDFBolt):

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://www.example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        var pdf = converter.ConvertUrl("https://www.example.com");
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
Imports PDFBolt
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter = New HtmlToPdfConverter()
        Dim pdf = converter.ConvertUrl("https://www.example.com")
        File.WriteAllBytes("webpage.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PDFBolt 的 URL 转换模式与 HTML 转换遵循相同的方法:ConvertUrl() 返回 byte[],需要 File.WriteAllBytes() 才能保存。 请注意,即使您已经从 URL 获取数据,PDFBolt 仍然需要通过网络往返其服务器。

IronPDF 的 RenderUrlAsPdf() 方法返回一个 PdfDocument,其中包含内置的 SaveAs() 方法。 这里的关键优势在于IronPDF在本地执行 URL 抓取和 PDF 渲染--数据不会离开您的基础架构。 请注意,对于这种简单的情况,IronPDF 版本甚至不需要 using System.IO;。 了解有关 URL 至 PDF 转换的更多信息。

示例 3:带有自定义页面设置的 HTML 文件

之前 (PDFBolt):

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

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.MarginTop = 20;
        converter.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package PDFBolt
using PDFBolt;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new HtmlToPdfConverter();
        converter.PageSize = PageSize.A4;
        converter.MarginTop = 20;
        converter.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = converter.ConvertHtmlString(html);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
Imports PDFBolt
Imports System.IO

Class Program
    Shared Sub Main()
        Dim converter As New HtmlToPdfConverter()
        converter.PageSize = PageSize.A4
        converter.MarginTop = 20
        converter.MarginBottom = 20
        Dim html As String = File.ReadAllText("input.html")
        Dim pdf As Byte() = converter.ConvertHtmlString(html)
        File.WriteAllBytes("output.pdf", pdf)
    End Sub
End Class
$vbLabelText   $csharpLabel

After (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System.IO;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        var html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System.IO

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.MarginTop = 20
        renderer.RenderingOptions.MarginBottom = 20
        Dim html = File.ReadAllText("input.html")
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

本示例展示了页面配置差异。PDFBolt直接在转换器对象上设置属性(converter.PageSizeconverter.MarginTop)。IronPDF在渲染器上使用 RenderingOptions 对象(renderer.RenderingOptions.PaperSizerenderer.RenderingOptions.MarginTop)。

关键映射:

  • PageSize.A4PdfPaperSize.A4(不同的枚举名称)
  • MarginTop = 20RenderingOptions.MarginTop = 20(通过 RenderingOptions)

两者都使用毫米作为边距值,因此您现有的边距值应该可以直接转换。 需要 IronPdf.Rendering 命名空间才能访问 PdfPaperSize 枚举。 有关其他页面配置选项,请参阅 渲染选项文档


关键迁移说明

返回类型更改

PDFBolt 直接返回 byte[];IronPDF返回 PdfDocument:

//PDFBoltpattern:
byte[] pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
//PDFBoltpattern:
byte[] pdf = converter.ConvertHtmlString(html);
File.WriteAllBytes("output.pdf", pdf);

//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
'PDFBoltpattern:
Dim pdf As Byte() = converter.ConvertHtmlString(html)
File.WriteAllBytes("output.pdf", pdf)

'IronPDFpattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")

' Or if you need bytes:
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
$vbLabelText   $csharpLabel

类命名更改

主类名称从以转换器为中心改为以呈现器为中心:

// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
' PDFBolt
Dim converter As New HtmlToPdfConverter()

' IronPDF
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

配置模式更改

PDFBolt 使用直接属性;IronPDF使用 RenderingOptions:

// PDFBolt: Direct properties
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;

// IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
// PDFBolt: Direct properties
converter.PageSize = PageSize.A4;
converter.MarginTop = 20;

// IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
' PDFBolt: Direct properties
converter.PageSize = PageSize.A4
converter.MarginTop = 20

' IronPDF: Via RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
$vbLabelText   $csharpLabel

消除API 关键字

PDFBolt 需要按请求进行 API 密钥管理;IronPDF使用一次性许可证密钥:

// PDFBolt: API key per client (security risk if leaked)
var apiKey = config["PDFBolt:ApiKey"];
var client = new Client(apiKey);

// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// PDFBolt: API key per client (security risk if leaked)
var apiKey = config["PDFBolt:ApiKey"];
var client = new Client(apiKey);

// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
' PDFBolt: API key per client (security risk if leaked)
Dim apiKey = config("PDFBolt:ApiKey")
Dim client = New Client(apiKey)

' IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer = New ChromePdfRenderer()
$vbLabelText   $csharpLabel

删除网络错误处理

本地处理意味着无需处理网络错误:

// PDFBolt: Network error handling required
catch (HttpRequestException ex)
catch (TaskCanceledException)
catch (TimeoutException)

// IronPDF: Remove network-specific catches entirely
// PDFBolt: Network error handling required
catch (HttpRequestException ex)
catch (TaskCanceledException)
catch (TimeoutException)

// IronPDF: Remove network-specific catches entirely
$vbLabelText   $csharpLabel

可用的新功能

迁移到IronPDF后,您将获得PDFBolt无法提供的功能:

// PDF Merging (not available in PDFBolt)
var merged = PdfDocument.Merge(pdf1, pdf2);

// Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>");

// Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret";

// Text Extraction (not available in PDFBolt)
string text = pdf.ExtractAllText();

// PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png");
// PDF Merging (not available in PDFBolt)
var merged = PdfDocument.Merge(pdf1, pdf2);

// Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>");

// Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret";

// Text Extraction (not available in PDFBolt)
string text = pdf.ExtractAllText();

// PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png");
' PDF Merging (not available in PDFBolt)
Dim merged = PdfDocument.Merge(pdf1, pdf2)

' Watermarks (not available in PDFBolt)
pdf.ApplyWatermark("<h1 style='opacity:0.3;'>DRAFT</h1>")

' Password Protection (not available in PDFBolt)
pdf.SecuritySettings.UserPassword = "secret"

' Text Extraction (not available in PDFBolt)
Dim text As String = pdf.ExtractAllText()

' PDF to Images (not available in PDFBolt)
pdf.RasterizeToImageFiles("page_*.png")
$vbLabelText   $csharpLabel

故障排除

问题 1:HtmlToPdfConverter 未找到

问题:IronPDF中不存在 HtmlToPdfConverter 类。

解决方案:使用 ChromePdfRenderer:

// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
// PDFBolt
var converter = new HtmlToPdfConverter();

// IronPDF
var renderer = new ChromePdfRenderer();
' PDFBolt
Dim converter As New HtmlToPdfConverter()

' IronPDF
Dim renderer As New ChromePdfRenderer()
$vbLabelText   $csharpLabel

问题 2:未找到 ConvertHtmlString

问题: ConvertHtmlString() 方法不存在。

解决方案:使用 RenderHtmlAsPdf():

// PDFBolt
var pdf = converter.ConvertHtmlString(html);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
// PDFBolt
var pdf = converter.ConvertHtmlString(html);

// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
' PDFBolt
Dim pdf = converter.ConvertHtmlString(html)

' IronPDF
Dim pdf = renderer.RenderHtmlAsPdf(html)
$vbLabelText   $csharpLabel

问题 3:未找到 ConvertUrl

问题: ConvertUrl() 方法不存在。

解决方案:使用 RenderUrlAsPdf():

// PDFBolt
var pdf = converter.ConvertUrl(url);

// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);
// PDFBolt
var pdf = converter.ConvertUrl(url);

// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);
' PDFBolt
Dim pdf = converter.ConvertUrl(url)

' IronPDF
Dim pdf = renderer.RenderUrlAsPdf(url)
$vbLabelText   $csharpLabel

问题 4:未找到 PageSize 枚举

问题: PageSize 枚举不存在。

解决方案:使用来自 IronPdf.RenderingPdfPaperSize

// PDFBolt
converter.PageSize = PageSize.A4;

// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// PDFBolt
converter.PageSize = PageSize.A4;

// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
' PDFBolt
converter.PageSize = PageSize.A4

' IronPDF
Imports IronPdf.Rendering
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
$vbLabelText   $csharpLabel

问题 5:首次生成 PDF 的速度很慢

问题:初始渲染时间比预期长。

解决方案: Chromium 引擎在首次使用时进行初始化。 如有需要,可进行预热:

// Warm up during application startup
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf("<html><body></body></html>");
// Warm up during application startup
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf("<html><body></body></html>");
' Warm up during application startup
Dim renderer As New ChromePdfRenderer()
renderer.RenderHtmlAsPdf("<html><body></body></html>")
$vbLabelText   $csharpLabel

迁移清单

迁移前

  • 清点代码库中所有PDFBolt的使用情况
  • 记录当前页面配置设置(页面大小、边距)
  • 识别要移除的 API 密钥管理代码
  • 列出任何要删除的速率限制或网络错误处理程序
  • 获取IronPDF许可证密钥

软件包变更

  • 删除 PDFBolt NuGet 包 安装 IronPdf NuGet 包:dotnet add package IronPdf
  • 添加 using IronPdf; 命名空间
  • 添加 using IronPdf.Rendering; 以表示纸张尺寸枚举

代码更改

  • 在启动时添加许可证密钥配置
  • HtmlToPdfConverter 替换为 ChromePdfRenderer
  • ConvertHtmlString() 替换为 RenderHtmlAsPdf()
  • ConvertUrl() 替换为 RenderUrlAsPdf()
  • File.WriteAllBytes() 替换为 pdf.SaveAs()
  • PageSize 更新为 RenderingOptions.PaperSize
  • 将边距属性更新为 RenderingOptions.MarginTop 等。
  • 移除 API 密钥管理代码
  • 移除速率限制处理代码
  • 移除网络错误处理

后迁移

  • 从配置文件中删除 API 密钥
  • 从密钥管理器中移除 API 密钥
  • 运行所有测试,比较 PDF 输出
  • 验证页面尺寸和边距是否正确显示。
  • 考虑添加新功能(水印、安全、合并)

Curtis Chau
技术作家

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

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

钢铁支援团队

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