Gotenberg vs IronPDF:技術比較指南
高登堡vs IronPDF:Docker 微服務 vs 進程中的 .NET 函式庫。
當 .NET 開發人員評估 PDF 製作解決方案時,Gotenberg 以基於 Docker 的微服務形式出現,可透過 REST API 呼叫將 HTML 轉換為 PDF。 Gotenberg雖然對於多語言架構而言相當靈活,但卻引進了大量的基礎架構開銷-Docker containers、網路延遲以及作業複雜性。 IronPdf 提供了一種不同的方法:一個進程中的 NuGet 套件,提供相同的基於 Chromium 的渲染,而不需要容器、網路呼叫或基礎架構管理。
本比較針對技術上相關的層面檢視這兩種解決方案,以協助專業開發人員和架構人員針對其 .NET PDF 需求做出明智的決策。
瞭解 Gotenberg
Gotenberg 是基於 Docker 的 PDF 生成微服務架構。 它會以獨立容器的方式執行,公開 REST API 端點,以便將 HTML、URL 及其他格式轉換為 PDF。 每個 PDF 作業都需要 HTTP 呼叫至高登堡服務。
Gotenberg 使用端點如POST /forms/chromium/convert/html來進行 HTML 至 PDF 的轉換,以及POST /forms/chromium/convert/url來進行 URL 至 PDF 的轉換。 組態是透過 multipart/form-data 傳遞,並包含以字串為基礎的參數,例如 paperWidth, paperHeight, marginTop, 和 marginBottom (以英吋為單位)。 該服務需要 Docker 部署、容器協調 (Kubernetes/Docker Compose) 以及網路基礎架構。
架構要求:
- Docker 容器部署和管理
- 每個 PDF 請求的網路通訊 (10-100ms+ 延遲)
- 容器冷啟動處理 (2-5 秒的首次請求)
- 健康檢查端點與服務監控
- 針對每個要求的 Multipart/form-data 結構
了解 IronPDF
IronPDF 是一個原生的 .NET 函式庫,以 NuGet 套件的方式在程序中執行。 它提供基於 Chromium 的 HTML 渲染,無需外部服務、網路呼叫或容器基礎架構。
IronPDF 使用 ChromePdfRenderer 作為其主要的渲染類別,其方法包括 RenderHtmlAsPdf() 和 RenderUrlAsPdf() 等。 配置使用 RenderingOptions 上的類型化 C# 屬性,包括 PaperSize, MarginTop, MarginBottom (以毫米為單位)。 文件以 SaveAs() 保存,或以 BinaryData 存取。
圖書館只需要
- 安裝 NuGet 套件 (
dotnet add package IronPdf) - 授權金鑰組態
- 標準 .NET 專案設定
架構與基礎結構比較
這些解決方案的根本差異在於其部署和執行時架構。
| 因素 | 高登堡 | IronPDF |
|---|---|---|
| 部署 | Docker 容器 + 協調 | 單一 NuGet 套件 |
| 架構 | 微服務 (REST API) | 處理中的資料庫 |
| 每次請求的延遲時間 | 10-100ms+ (網路往返) | < 1ms 開銷 |
| 冷開始 | 2-5 秒 (容器啟動) | 1-2 秒 (僅限第一次渲染) |
| 基礎架構 | Docker、Kubernetes、負載平衡器 | 無要求 |
| 網路依賴性 | 要求 | 無 |
| 失敗模式 | 網路、容器、服務故障 | 標準的 .NET 例外情況 |
| API 風格 | REST multipart/form-data | 原生 C# 方法呼叫 |
| 擴充性 | 橫向(更多容器) | 垂直 (處理中) |
| 除錯 | 分散式追蹤 | 標準除錯器 |
| 記憶體管理 | 獨立容器 (512MB-2GB) | 共用應用程式記憶體 |
| 版本控制。 | 容器影像標籤 | NuGet 套件版本 |
| 健康檢查 | 所需的 HTTP 端點 | 不需要 (處理中) |
| CI/CD複雜性 | 容器建立、註冊表推送 | 建立 .NET Standard |
Gotenberg 基於 Docker 的方法需要容器部署、健康監控和網路基礎架構管理。IronPDF透過在過程中執行,完全消除了這個基礎架構層。
程式碼比較:常見的 PDF 作業
基本 HTML 到 PDF 的轉換
最基本的操作清楚地展示了架構上的差異。
Gotenberg:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergExample
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
}
}using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergExample
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Hello from Gotenberg</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
Console.WriteLine("PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfExample
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfExample
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var html = "<html><body><h1>Hello from IronPDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGotenberg 要求創建一個 HttpClient, 建構 MultipartFormDataContent, 加入 HTML 作為一個有特定檔案名稱 (index.html) 的檔案附件, 做一個 async HTTP POST 到高登堡服務端點, 讀取回應的位元組, 並寫入磁碟。 每個請求都會經過網路,並帶來相關的延遲和故障模式。
IronPDF 創建一個 ChromePdfRenderer, 使用 HTML 字串呼叫 RenderHtmlAsPdf(), 並使用 SaveAs() 儲存。 操作是同步的、進程中的,並使用類型化的方法,而非基於字串的表單資料。
如需進階的 HTML 呈現選項,請探索 HTML 至 PDF 轉換指南。
URL 轉 PDF
將即時網頁轉換為 PDF 顯示出類似的架構模式。
Gotenberg:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergUrlToPdf
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
content.Add(new StringContent("https://example.com"), "url");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL generated successfully");
}
}using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergUrlToPdf
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/url";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
content.Add(new StringContent("https://example.com"), "url");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfUrlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL generated successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
class IronPdfUrlToPdf
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGotenberg 使用 /forms/chromium/convert/url 端點,並傳送 URL 作為表單資料。IronPDF使用 URL 字串直接呼叫 RenderUrlAsPdf() - 單一方法呼叫取代 HTTP 基礎架構。
自訂頁面大小與邊界
配置處理揭示 API 設計的差異。
Gotenberg:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergCustomSize
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
content.Add(new StringContent("8.5"), "paperWidth");
content.Add(new StringContent("11"), "paperHeight");
content.Add(new StringContent("0.5"), "marginTop");
content.Add(new StringContent("0.5"), "marginBottom");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
Console.WriteLine("Custom size PDF generated successfully");
}
}using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
class GotenbergCustomSize
{
static async Task Main()
{
var gotenbergUrl = "http://localhost:3000/forms/chromium/convert/html";
using var client = new HttpClient();
using var content = new MultipartFormDataContent();
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
content.Add(new StringContent(html), "files", "index.html");
content.Add(new StringContent("8.5"), "paperWidth");
content.Add(new StringContent("11"), "paperHeight");
content.Add(new StringContent("0.5"), "marginTop");
content.Add(new StringContent("0.5"), "marginBottom");
var response = await client.PostAsync(gotenbergUrl, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("custom-size.pdf", pdfBytes);
Console.WriteLine("Custom size PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;
class IronPdfCustomSize
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-size.pdf");
Console.WriteLine("Custom size PDF generated successfully");
}
}// NuGet: Install-Package IronPdf
using System;
using IronPdf;
using IronPdf.Rendering;
class IronPdfCustomSize
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;
var html = "<html><body><h1>Custom Size PDF</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("custom-size.pdf");
Console.WriteLine("Custom size PDF generated successfully");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comGotenberg 使用基於字串的參數 ("8.5"、"11"、"0.5") 新增至多部分表單資料。 紙張尺寸以英吋為單位。 每個參數都是單獨的 Add() 呼叫,沒有類型檢查或 IntelliSense 支援。
IronPDF 在 RenderingOptions 上使用類型化的屬性。 PaperSize 接受一個枚數 (PdfPaperSize.Letter),頁邊距離是以毫米為單位的數值。 類型化 API 提供編譯時檢查和 IDE 支援。
在IronPDF教學中了解更多關於渲染配置的資訊。
API 對應參考。
對於評估高登堡轉移或比較功能的開發人員而言,此對應表顯示等效的操作:
端點到方法映射
| 哥登堡路線 | IronPdf 同等級產品 | 筆記 |
|---|---|---|
POST /forms/chromium/convert/html | <代碼>ChromePdfRenderer.RenderHtmlAsPdf()</代碼 | HTML 字串至 PDF |
POST /forms/chromium/convert/url | <代碼>ChromePdfRenderer.RenderUrlAsPdf()</代碼 | URL 至 PDF |
POST /forms/chromium/convert/markdown | 先將 Markdown 渲染成 HTML | 使用 Markdig 函式庫 |
POST /forms/pdfengines/merge | <代碼>PdfDocument.Merge()</代碼 | 合併多個 PDF |
POST /forms/pdfengines/metadata/read | <編碼>pdf.MetaData</編碼 | 閱讀元資料 |
POST /forms/pdfengines/metadata/write | pdf.MetaData.Author="..."。 | 撰寫元資料 |
GET /health | 不適用 | 不需要外部服務 |
表單參數至 RenderingOptions 對應
| 高登堡參數 | IronPdf 特性 | 轉換注意事項 |
|---|---|---|
paperWidth (英吋) | RenderingOptions.SetCustomPaperSizeInInches()渲染選項。 | 使用方法為自訂 |
paperHeight (英吋) | RenderingOptions.SetCustomPaperSizeInInches()渲染選項。 | 使用方法為自訂 |
marginTop (英吋) | RenderingOptions.MarginTop | 毫米數乘以 25.4 |
marginBottom (英吋) | RenderingOptions.MarginBottom | 毫米數乘以 25.4 |
marginLeft (英吋) | RenderingOptions.MarginLeft | 毫米數乘以 25.4 |
marginRight (英吋) | <編碼>RenderingOptions.MarginRight</編碼 | 毫米數乘以 25.4 |
列印背景 | <編碼>RenderingOptions.PrintHtmlBackgrounds</編碼 | 布林 |
landscape | <編碼>RenderingOptions.PaperOrientation</編碼 | Landscape 枚舉 |
scale | <編碼>RenderingOptions.Zoom</編碼 | 百分比 (100 = 1.0) |
等待延遲 | RenderingOptions.RenderDelay | 轉換為毫秒 |
模擬媒體類型 | <編碼>RenderingOptions.CssMediaType</編碼 | <編碼>螢幕</編碼>或<編碼>列印</編碼 |
請注意單位轉換:Gotenberg 使用英寸作為頁邊(例如,"0.5" = 0.5 英寸 = 12.7mm),而IronPDF則使用毫米。
基礎架構比較
高登堡Docker Compose
Gotenberg 需要容器基礎架構:
#高登堡requires container management
version: '3.8'
services:
app:
depends_on:
- gotenberg
environment:
- GOTENBERG_URL=http://gotenberg:3000
gotenberg:
image: gotenberg/gotenberg:8
ports:
- "3000:3000"
deploy:
resources:
limits:
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s#高登堡requires container management
version: '3.8'
services:
app:
depends_on:
- gotenberg
environment:
- GOTENBERG_URL=http://gotenberg:3000
gotenberg:
image: gotenberg/gotenberg:8
ports:
- "3000:3000"
deploy:
resources:
limits:
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30sIronPDF配置
IronPdf 不需要額外的服務:
#IronPDF- No additional services needed
version: '3.8'
services:
app:
environment:
- IRONPDF_LICENSE_KEY=${IRONPDF_LICENSE_KEY}
# No高登堡service. No health checks. No resource limits.#IronPDF- No additional services needed
version: '3.8'
services:
app:
environment:
- IRONPDF_LICENSE_KEY=${IRONPDF_LICENSE_KEY}
# No高登堡service. No health checks. No resource limits.基礎架構的差異很大:Gotenberg 需要容器部署、健康監控、資源分配和服務依賴性。 IronPdf 與應用程式一起在流程中執行。
效能特性
| 手術 | 高登堡 (暖櫃) | 高登堡(冷啟動) | IronPdf (首次渲染) | IronPdf (後續) |
|---|---|---|---|---|
| 簡單的 HTML | 150-300 毫秒 | 2-5 秒 | 1-2 秒 | 50-150ms |
| 複雜的 HTML | 500-1500ms | 3-7 秒 | 1.5-3 秒 | 200-800ms |
| URL 渲染 | 1-5 秒 | 3-10 秒 | 1-5 秒 | 500ms-3s |
| PDF 合併 | 200-500 毫秒 | 2-5 秒 | 100-300 毫秒 | 100-300 毫秒 |
Gotenberg 每次請求的網路往返時間會增加 10-100ms 以上。容器冷啟動增加 2-5 秒。 IronPdf 的首次渲染會產生 Chromium 初始化(1-2 秒),但後續渲染的開銷極小。
當團隊考慮從高登堡轉移到IronPDF時。
開發團隊評估從高登堡過渡到IronPDF有幾個原因:
基礎架構開銷:Gotenberg 需要 Docker、容器協調 (Kubernetes/Docker Compose)、服務發現和負載平衡。 尋求更簡單部署的團隊發現IronPDF的 NuGet-only 方法消除了這些基礎架構的顧慮。
網路延遲:每個高登堡PDF 作業都需要 HTTP 呼叫到單獨的服務 - 每個請求增加 10-100 毫秒以上。對於高容量的應用程式,此開銷將會累積。IronPDF的流程中方法在初始化後的開銷可以忽略不计。
冷啟動問題:容器啟動可能會增加 2-5 秒的首次請求時間。 即使是溫暖的容器也有網路開銷。 每個 pod 重新啟動、擴充事件或部署都會觸發冷啟動。IronPDF的冷啟動會在每個應用程式生命週期中發生一次。
作業複雜性:Gotenberg 要求將容器健康、縮放、日誌和監控作為獨立的關注事項來管理。 網路超時、服務無法使用以及容器當機會成為應用程式的疑慮。 IronPdf 使用標準的 .NET 異常處理。
Multipart Form Data API:每個高登堡請求都需要建構具有字串式參數的 multipart/form-data 有效負載 - 頻繁且無編譯時類型檢查。 IronPdf 提供具 IntelliSense 支援的 C# 屬性類型。
版本管理:Gotenberg 圖片與您的應用程式分開更新。 API 變更可能會破壞整合。IronPDF版本透過 NuGet 與標準 .NET 相依性管理進行管理。
優勢和考慮因素
高登堡的優勢
- Polyglot 架構:適用於任何可進行 HTTP 呼叫的語言
- Language Agnostic:與 .NET 生態系統無關。
- MIT 授權條款:免費且開放原始碼
- Microservices Pattern:適合容器化架構
哥頓堡考慮因素
- 基礎架構開銷:需要 Docker、Kubernetes、負載平衡器
- 網路延遲:每次請求 10-100ms+
- 冷啟動:2-5 秒容器初始化
- 基於字串的 API:無類型安全或 IntelliSense
- 分散式除錯:需要分散式追蹤
- 健康監控:管理其他端點
IronPDF的優勢
IronPDF注意事項
- .NET Specific:專為 .NET 生態系統設計
- 商業授權:必須用於生產用途
結論
Gotenberg 和IronPDF代表了在 .NET 應用程式中生成 PDF 的基本不同方法。高登堡基於 Docker 的微服務架構引入了容器管理、網路延遲和操作複雜性。 每個 PDF 作業都需要 HTTP 通訊與相關的失敗模式和冷啟動罰則。
IronPDF 同樣提供基於 Chromium 的渲染功能,作為一個進程中的函式庫。 NuGet 套件消除了 Docker 容器、網路呼叫和基礎架構管理。 類型化的 C# API 取代了以字串為基礎的多部分表單資料。 標準的 .NET 異常處理取代了 HTTP 狀態碼和網路故障模式。
在組織規劃 .NET 10、C# 14 以及到 2026 年的應用程式開發時,在微服務基礎架構開銷與流程內程式庫簡化之間的選擇,會顯著影響部署與作業的複雜性。 尋求減輕基礎架構負擔,同時保持 HTML/CSS/JavaScript 渲染保真度的團隊會發現 IronPdf 能有效滿足這些需求。