跳至頁尾內容
移民指南

如何在 C# 中將 CraftMyPDF 遷移到 IronPDF

為什麼要從 CraftMyPDF 遷移到 IronPDF?

像 CraftMyPDF 這樣的基於雲端的 PDF API 引入了一些根本性問題,使得它們不適用於許多生產環境。

基於雲端的PDF API存在的問題

1.您的資料離開您的系統:每個 HTML 範本和 JSON 資料有效負載都會傳送到 CraftMyPDF 的伺服器。 對於發票、合約、醫療記錄或任何敏感的商業數據,這會帶來 HIPAA、GDPR 和 SOC2 合規性風險。

2.網路延遲: CraftMyPDF 自己的文件指出,每個 PDF 需要 1.5-30 秒。 IronPDF可在本地以毫秒速度產生。

3.每個 PDF 的成本累積起來:每月 10,000 個 PDF 按訂閱費率計算會產生大量的經常性成本,而一次性永久許可則不然。

4.針對列印最佳化的輸出:雲端 API 通常會針對列印進行最佳化-減少背景並簡化顏色以節省"墨水"。因此,最終輸出結果與螢幕上顯示的 HTML 程式碼看起來截然不同。

5.模板鎖定: CraftMyPDF 需要使用其專有的拖放編輯器。 你不能隨意使用標準的HTML/CSS。

架構比較

方面CraftMyPDFIronPDF
數據位置雲端(您的資料將離開您的系統)本地部署(資料永不離開)
延遲每份PDF文件耗時1.5-30秒。毫秒
定價按PDF訂閱一次永久許可
模板系統僅限專有拖放功能任何 HTML/CSS/JavaScript
輸出品質列印優化像素級精準螢幕渲染
離線工作否(需要聯網)是的
遵守數據離開組織符合 SOC2/HIPAA 標準

功能對比

特徵CraftMyPDFIronPDF
HTML 轉 PDF透過 API 模板✅ 原生
PDF檔案的URL透過 API✅ 原生
自訂模板僅限專有編輯✅ 任何 HTML
CSS3 支持有限的✅ 已完成
JavaScript 渲染有限的✅ 已完成
合併/拆分PDF透過 API✅ 原生
水印透過 API✅ 原生
可離線使用
自託管

遷移前準備

先決條件

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

  • .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+ 或帶有 C# 擴充功能的 VS Code
  • NuGet 套件管理器訪問
  • IronPDF 許可證金鑰(可在ironpdf.com提供免費試用)

審核 CraftMyPDF 使用情況

在解決方案目錄中執行以下命令,以識別所有 CraftMyPDF 引用:

# Find all CraftMyPDF usages in your codebase
grep -r "CraftMyPdf\|craftmypdf\|api.craftmypdf.com" --include="*.cs" .
grep -r "X-API-KEY" --include="*.cs" .

# Find API key references
grep -r "your-api-key\|template-id\|template_id" --include="*.cs" .

# Find NuGet package references
grep -r "CraftMyPdf\|RestSharp" --include="*.csproj" .
# Find all CraftMyPDF usages in your codebase
grep -r "CraftMyPdf\|craftmypdf\|api.craftmypdf.com" --include="*.cs" .
grep -r "X-API-KEY" --include="*.cs" .

# Find API key references
grep -r "your-api-key\|template-id\|template_id" --include="*.cs" .

# Find NuGet package references
grep -r "CraftMyPdf\|RestSharp" --include="*.csproj" .
SHELL

需要預見的重大變化

改變CraftMyPDFIronPDF影響
建築學雲端 REST API本機 .NET 函式庫移除 HTTP 呼叫
範本專有編輯器標準 HTML將模板轉換為 HTML
API金鑰每次通話都需要新創公司取得許可證移除 API 金鑰處理
非同步模式必需(HTTP)選修的如果願意,請移除 await 函數。
錯誤處理HTTP 狀態碼例外情況更改 try/catch 模式
資料綁定JSON 模板字串插值簡化資料綁定

逐步遷移過程

步驟 1:更新 NuGet 套件

移除HTTP客戶端庫並安裝IronPDF:

# Remove RestSharp HTTP client
dotnet remove package RestSharp

# Install IronPDF
dotnet add package IronPdf
# Remove RestSharp HTTP client
dotnet remove package RestSharp

# Install IronPDF
dotnet add package IronPdf
SHELL

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

將 HTTP 用戶端命名空間替換為 IronPDF:

// Remove these
using RestSharp;
using System.IO;

// Add this
using IronPdf;
// Remove these
using RestSharp;
using System.IO;

// Add this
using IronPdf;
$vbLabelText   $csharpLabel

步驟 3:設定許可證(啟動時一次)

將每個請求的 API 金鑰標頭替換為單一許可證配置:

// Add at application startup (Program.cs or Global.asax)
// This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
// This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

完整的 API 遷移參考

API 端點映射

CraftMyPDFIronPDF筆記
POST /v1/createrenderer.RenderHtmlAsPdf(html)無需呼叫 API
X-API-KEY標頭License.LicenseKey = "..."啟動時設定一次
template_id標準 HTML 字串使用任何 HTML
{%name%}佔位符$"{name}" C# 內插標準 .NET
POST /v1/mergePdfDocument.Merge(pdfs)本地即時
POST /v1/add-watermarkpdf.ApplyWatermark(html)基於HTML
Webhook回調不需要結果同步
限速不適用無限制

配置映射

CraftMyPDF 選項IronPDF當量筆記
template_idHTML字串使用您自己的 HTML
data JSONC# 插值$"Hello {name}"
page_size: "A4"PaperSize = PdfPaperSize.A4
orientation: "landscape"PaperOrientation = Landscape
margin_top: 20MarginTop = 20單位:毫米
headerHtmlHeader完全支援 HTML
footerHtmlFooter完全支援 HTML

程式碼遷移範例

HTML 轉 PDF

最常見的操作體現了從雲端 API 到本地渲染的根本架構轉變。

CraftMyPDF 實作:

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

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
            }
        });

        var response = client.Execute(request);
        File.WriteAllBytes("output.pdf", response.RawBytes);
    }
}
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
            }
        });

        var response = client.Execute(request);
        File.WriteAllBytes("output.pdf", response.RawBytes);
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

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

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>");
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 省去了 RestClient 設定、API 金鑰標頭、範本 ID 和 HTTP 回應處理,將 15 行雲操作簡化為 4 行本機程式碼。 更多選項,請參閱HTML 轉 PDF 文件

URL 轉 PDF

CraftMyPDF 實作:

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

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                url = "https://example.com"
            },
            export_type = "pdf"
        });

        var response = client.Execute(request);
        File.WriteAllBytes("webpage.pdf", response.RawBytes);
    }
}
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                url = "https://example.com"
            },
            export_type = "pdf"
        });

        var response = client.Execute(request);
        File.WriteAllBytes("webpage.pdf", response.RawBytes);
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

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

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

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

IronPDF 的RenderUrlAsPdf方法可以捕捉完整的網頁,包括 JavaScript 渲染的內容。 更多選項請參閱PDF 文件的 URL

頁首和頁尾

CraftMyPDF 實作:

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

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                html = "<h1>Document Content</h1>",
                header = "<div>Page Header</div>",
                footer = "<div>Page {page} of {total_pages}</div>"
            }
        });

        var response = client.Execute(request);
        File.WriteAllBytes("document.pdf", response.RawBytes);
    }
}
// NuGet: Install-Package RestSharp
using System;
using RestSharp;
using System.IO;

class Program
{
    static void Main()
    {
        var client = new RestClient("https://api.craftmypdf.com/v1/create");
        var request = new RestRequest(Method.POST);
        request.AddHeader("X-API-KEY", "your-api-key");
        request.AddJsonBody(new
        {
            template_id = "your-template-id",
            data = new
            {
                html = "<h1>Document Content</h1>",
                header = "<div>Page Header</div>",
                footer = "<div>Page {page} of {total_pages}</div>"
            }
        });

        var response = client.Execute(request);
        File.WriteAllBytes("document.pdf", response.RawBytes);
    }
}
$vbLabelText   $csharpLabel

IronPDF實現:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Page Header"
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}"
        };

        var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Page Header"
        };
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}"
        };

        var pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>");
        pdf.SaveAs("document.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDF 支援使用{page}{total-pages}等佔位符號標記進行動態頁碼編號。 更多選項請參閱頁首和頁尾文件

模板變數轉換

CraftMyPDF 使用專有的範本佔位符,必須將其轉換為 C# 字串插值:

CraftMyPDF 圖案:

// CraftMyPDF template variables
request.AddJsonBody(new
{
    template_id = "invoice-template",
    data = new
    {
        customer = "John Doe",
        amount = "$1,000",
        items = invoiceItems
    }
});
// CraftMyPDF template variables
request.AddJsonBody(new
{
    template_id = "invoice-template",
    data = new
    {
        customer = "John Doe",
        amount = "$1,000",
        items = invoiceItems
    }
});
$vbLabelText   $csharpLabel

IronPDF 圖案:

// C# string interpolation
var html = $@"
<html>
<body>
    <h1>Invoice</h1>
    <p>Customer: {customerName}</p>
    <p>Amount: {amount}</p>
    {GenerateItemsTable(invoiceItems)}
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
// C# string interpolation
var html = $@"
<html>
<body>
    <h1>Invoice</h1>
    <p>Customer: {customerName}</p>
    <p>Amount: {amount}</p>
    {GenerateItemsTable(invoiceItems)}
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

關鍵遷移說明

移除所有 HTTP 程式碼

最顯著的變化是消除了對網路的依賴。 IronPDF 運行在本地端——無需 RestClient,無需 API 調用,無需回應處理:

// CraftMyPDF - HTTP required
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
var response = await client.ExecuteAsync(request);

// IronPDF - no HTTP
var pdf = renderer.RenderHtmlAsPdf(html);
// CraftMyPDF - HTTP required
var client = new RestClient("https://api.craftmypdf.com/v1/create");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "your-api-key");
var response = await client.ExecuteAsync(request);

// IronPDF - no HTTP
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

移除速率限制代碼

CraftMyPDF 會限制 API 呼叫頻率,並要求啟用重試機制。 IronPDF 沒有限制:

// CraftMyPDF - needed to avoid 429 errors
await Task.Delay(100);
if (response.StatusCode == TooManyRequests) { /* retry */ }

// IronPDF - no limits, just generate
var pdf = renderer.RenderHtmlAsPdf(html);
// Remove all rate limit code!
// CraftMyPDF - needed to avoid 429 errors
await Task.Delay(100);
if (response.StatusCode == TooManyRequests) { /* retry */ }

// IronPDF - no limits, just generate
var pdf = renderer.RenderHtmlAsPdf(html);
// Remove all rate limit code!
$vbLabelText   $csharpLabel

移除 Webhook 處理程序

CraftMyPDF 使用非同步 webhook 實現 PDF 自動完成。 IronPDF是同步的-PDF檔案立即即可產生:

// CraftMyPDF - webhook callback required
// POST with webhook_url, wait for callback

// IronPDF - PDF ready immediately
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No callback needed!
// CraftMyPDF - webhook callback required
// POST with webhook_url, wait for callback

// IronPDF - PDF ready immediately
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No callback needed!
$vbLabelText   $csharpLabel

預設同步

如果僅在 HTTP 呼叫中需要使用 async/await 模式,則應將其移除:

// CraftMyPDF - async required
var response = await client.ExecuteAsync(request);

// IronPDF - sync by default (async available if needed)
var pdf = renderer.RenderHtmlAsPdf(html);
// CraftMyPDF - async required
var response = await client.ExecuteAsync(request);

// IronPDF - sync by default (async available if needed)
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

遷移後檢查清單

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

  • 執行所有 PDF 生成測試
  • 比較輸出品質(IronPDF 的 Chromium 引擎可實現像素級完美渲染)
  • 衡量效能提升(毫秒與秒)
  • 驗證所有範本是否已正確轉換
  • 測試無速率限制的批量處理
  • 在所有目標環境中進行測試
  • 更新 CI/CD 管線 取消 CraftMyPDF 訂閱
  • 從 secrets/config 移除 API 金鑰

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

隨著 .NET 10 即將發布,C# 14 也引入了新的語言特性,選擇本地 PDF 庫可以消除雲端 API 棄用風險和版本相容性問題。 IronPDF 的永久許可模式意味著,隨著專案延續到 2025 年和 2026 年,您的遷移投資將無限期地獲得回報——無需支付持續的訂閱費用,資料也不會離開您的基礎設施。

其他資源

IronPDF 文件


從 CraftMyPDF 遷移到 IronPDF 可以消除對雲端的依賴、網路延遲、單一 PDF 的成本以及模板鎖定,同時提供可離線運行的像素級 Chromium 渲染效果。從 REST API 呼叫到本機方法呼叫的轉變簡化了您的程式碼庫,並將敏感文件資料保留在您的基礎架構內。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。