C#에서 PDFBolt에서 IronPDF로 마이그레이션하는 방법
PDFBolt에서 IronPDF로의 마이그레이션은 .NET PDF 워크플로우를 클라우드 전용 SaaS REST 서비스에서 로컬 문서 처리와 문서당 할당량이 없는 자체 호스팅 라이브러리로 이동시킵니다. 이 가이드는 PDFBolt가 제공하지 않는 PDF 조작 기능을 추가하면서 네트워크 종속성, 월별 사용 한도 및 외부 데이터 전송을 제거하는 단계별 마이그레이션 경로를 제공합니다.
PDFBolt에서 IronPDF로 이전하는 이유
클라우드 전용 문제
PDFBolt는 REST API로 노출된 클라우드 전용 SaaS 플랫폼입니다; 공식 .NET SDK와 PDFBolt NuGet 패키지가 없습니다. 통합은 https://api.pdfbolt.com/v1/direct에 대한 HttpClient로 손수 롤링됩니다. 빠른 프로토타입을 위해 편리하지만, 이 아키텍처는 프로덕션 애플리케이션에 대한 도전을 야기합니다:
-
클라우드 전용 처리: 모든 문서는 PDFBolt의 서버를 거치며 — 자체 호스팅 옵션이 없기 때문에 데이터 흐름에 대한 더 많은 제어가 필요한 팀에게 장애물이 될 수 있습니다.
-
데이터 개인정보 고려사항: 민감한 문서(계약서, 의료 기록, 금융 데이터)가 외부로 전송됩니다. 규제 데이터를 다루는 회사는 정당한 검토 우려를 가질 것입니다.
-
사용 한도: 무료 계층은 월 100 문서, 분당 20 요청, 동시 요청 1개로 제한되며, 이는 프로덕션 작업 부하에 충분하지 않을 수 있습니다. 유료 계층은 $19/월에서 $249/월까지 확장됩니다 (per pdfbolt.com/pricing).
-
네트워크 의존성: 인터넷 장애나 PDFBolt의 다운타임은 PDF 생성이 완전히 중단됨을 의미합니다.
-
지연 시간: 네트워크 왕복으로 인해 로컬 처리에 비해 변환 시 몇 초가 추가됩니다.
-
컴플라이언스 검토: GDPR, HIPAA 및 SOC2 감사는 외부 문서 처리가 포함될 때 추가 문서를 일반적으로 요구합니다.
-
API 키 보안: 유출된 API 키는 계정에 요금 부과를 초래할 수 있습니다.
- 벤더 종속: PDFBolt가 약관을 변경하거나 종료하면 애플리케이션이 작동을 멈춥니다.
PDFBolt대IronPDF비교
| 문제 | PDFBolt | IronPDF |
|---|---|---|
| 데이터 위치 | 외부 서버 | 귀하의 서버만 |
| 사용 제한 | 100개 무료/월, 이후 계층형 구독 | 무제한 |
| 인터넷 필수 | 항상 필요 | 아니요 |
| 지연 시간 | 네트워크 왕복 | 로컬 |
| 규정 준수 | 복잡함 (외부 처리) | 간단함 (로컬 처리) |
| 비용 모델 | 월간 구독 계층 ($19–$249/월) | 일회성 또는 연간 |
| 오프라인 작동 | 불가능 | 완전히 지원 |
| API 키 위험 | 유출됨 = 요금 부과 | 라이선스 키, 요금 부과 위험 없음 |
IronPDF는 문서 처리를 로컬로 유지하고 외부 클라우드 서비스에 대한 종속성을 제거하는 현대적인 .NET 기반의 자체 호스팅 기초를 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
PDFBolt에는 공식 .NET SDK와 PDFBolt NuGet 패키지가 없어서 제거할 것이 없습니다.PDFBolt측의 정리는 손수 롤링된 HttpClient 래퍼와 요청/응답 DTOs를 삭제하는 것입니다. 그런 다음 IronPDF를 설치하십시오:
# Install IronPDF(replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
# Install IronPDF(replaces the hand-rolled HttpClient wrapper)
dotnet add package IronPdf
라이선스 구성
// 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"
PDFBolt사용 알아보기
# Find allPDFBoltREST calls
grep -rE "api\.pdfbolt\.com|API-KEY|/v1/direct" --include="*.cs" .
# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
# Find allPDFBoltREST calls
grep -rE "api\.pdfbolt\.com|API-KEY|/v1/direct" --include="*.cs" .
# Find API key references
grep -r "PDFBOLT\|ApiKey" --include="*.cs" --include="*.json" --include="*.config" .
완전한 API 참조
핵심 개념 매핑
| PDFBolt (REST) | IronPDF |
|---|---|
HttpClient + API-KEY 헤더 |
new ChromePdfRenderer() |
| JSON 요청 본문 | renderer.RenderingOptions |
POST https://api.pdfbolt.com/v1/direct |
renderer.RenderHtmlAsPdf(...) / RenderUrlAsPdf(...) |
응답 byte[] |
PdfDocument |
변환 방법 매핑
| PDFBolt (REST) | IronPDF |
|---|---|
POST /v1/direct { "html": <base64> }와 함께 |
renderer.RenderHtmlAsPdf(html) |
POST /v1/direct { "url": "..." }와 함께 |
renderer.RenderUrlAsPdf(url) |
출력 방법 매핑
| PDFBolt (REST) | IronPDF |
|---|---|
await response.Content.ReadAsByteArrayAsync() 그 다음 File.WriteAllBytes |
pdf.SaveAs(path) |
await response.Content.ReadAsByteArrayAsync() |
pdf.BinaryData |
페이지 구성 매핑
| PDFBolt JSON | IronPDF |
|---|---|
"format": "A4" |
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 |
"margin": { "top": "20mm" } |
renderer.RenderingOptions.MarginTop = 20 |
"margin": { "bottom": "20mm" } |
renderer.RenderingOptions.MarginBottom = 20 |
"margin": { "left": "15mm" } |
renderer.RenderingOptions.MarginLeft = 15 |
"margin": { "right": "15mm" } |
renderer.RenderingOptions.MarginRight = 15 |
헤더/푸터 플레이스홀더 매핑
PDFBolt(베이스64 인코딩된 headerTemplate / footerTemplate 안에) |
IronPDF(HtmlFragment 토큰) |
|---|---|
<span class="pageNumber"></span> |
{page} |
<span class="totalPages"></span> |
{total-pages} |
<span class="date"></span> |
{date} |
<span class="title"></span> |
{html-title} |
코드 마이그레이션 예제
예제 1: 기본 HTML에서 PDF로
이전 (PDFBolt — HttpClient를 통한 REST):
// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var html = "<html><body><h1>Hello World</h1></body></html>";
var payload = JsonSerializer.Serialize(new
{
html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
});
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
using var content = new StringContent(payload, Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
response.EnsureSuccessStatusCode();
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
}
}
// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var html = "<html><body><h1>Hello World</h1></body></html>";
var payload = JsonSerializer.Serialize(new
{
html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
});
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
using var content = new StringContent(payload, Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
response.EnsureSuccessStatusCode();
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html As String = "<html><body><h1>Hello World</h1></body></html>"
Dim payload As String = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html))
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module
이후 (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
구조적 차이는 통합 모델입니다. PDFBolt에서는 HTML을 베이스64 인코딩하고, JSON 페이로드를 빌드하며, API-KEY 헤더를 설정하고, POST을 https://api.pdfbolt.com/v1/direct에 보내고, 응답을 대기하고, 반환된 바이트를 스스로 디스크에 써야 합니다.
IronPDF의 ChromePdfRenderer.RenderHtmlAsPdf()는 내장된 SaveAs() 메서드가 있는 PdfDocument 객체를 반환합니다. 객체 지향 모델은 저장하기 전에 PDF를 조작(워터마크 추가, 문서 병합, 보안 적용)할 수 있게 합니다. 기존 코드와의 호환성을 위해 원시 바이트가 필요하면 pdf.BinaryData를 사용하세요. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.
예제 2: URL에서 PDF로 변환
이전 (PDFBolt — HttpClient를 통한 REST):
// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var payload = JsonSerializer.Serialize(new { url = "https://www.example.com" });
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
using var content = new StringContent(payload, Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
response.EnsureSuccessStatusCode();
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
}
}
// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/quick-start-guide/csharp
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var payload = JsonSerializer.Serialize(new { url = "https://www.example.com" });
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
using var content = new StringContent(payload, Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
response.EnsureSuccessStatusCode();
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("webpage.pdf", pdfBytes);
}
}
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim payload = JsonSerializer.Serialize(New With {.url = "https://www.example.com"})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes As Byte() = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("webpage.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module
이후 (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
PDFBolt 쪽에서, URL 변환은 여전히 전체 REST 왕복이 필요합니다: JSON 본문을 작성하고, API 키 헤더를 설정하고, POST를 대기하여 응답 바이트를 기록합니다. 이미 공개 URL을 가리키고 있더라도, 가져오기 및 렌더링은 모두PDFBolt서버에서 이루어집니다.
IronPDF의 RenderUrlAsPdf()는 내장된 SaveAs() 메서드가 있는 PdfDocument를 반환합니다. 주요 이점은 IronPDF가 URL 가져오기 및 PDF 렌더링을 로컬에서 수행한다는 것입니다 — 문서 데이터가 인프라를 벗어나지 않습니다. URL에서 PDF로 변환에 대해 더 알아보세요.
예제 3: 사용자 정의 페이지 설정이 있는 HTML 파일
이전 (PDFBolt — HttpClient를 통한 REST):
// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/parameters
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var html = await File.ReadAllTextAsync("input.html");
var payload = JsonSerializer.Serialize(new
{
html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
format = "A4",
margin = new { top = "20mm", bottom = "20mm" },
printBackground = true
});
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
using var content = new StringContent(payload, Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
response.EnsureSuccessStatusCode();
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
}
}
// REST API — no official .NET SDK; integrate via HttpClient.
// Docs: https://pdfbolt.com/docs/parameters
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var html = await File.ReadAllTextAsync("input.html");
var payload = JsonSerializer.Serialize(new
{
html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
format = "A4",
margin = new { top = "20mm", bottom = "20mm" },
printBackground = true
});
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
using var content = new StringContent(payload, Encoding.UTF8, "application/json");
using var response = await http.PostAsync("https://api.pdfbolt.com/v1/direct", content);
response.EnsureSuccessStatusCode();
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
}
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Dim html = Await File.ReadAllTextAsync("input.html")
Dim payload = JsonSerializer.Serialize(New With {
.html = Convert.ToBase64String(Encoding.UTF8.GetBytes(html)),
.format = "A4",
.margin = New With {.top = "20mm", .bottom = "20mm"},
.printBackground = True
})
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
Using content As New StringContent(payload, Encoding.UTF8, "application/json")
Using response As HttpResponseMessage = Await http.PostAsync("https://api.pdfbolt.com/v1/direct", content)
response.EnsureSuccessStatusCode()
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
End Using
End Using
End Using
End Function
End Module
이후 (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
이 예시는 페이지 구성 매핑을 보여줍니다. PDFBolt는 CSS 스타일 문자열(values)인 중첩된 margin 객체와 함께 최상위 format를 수락합니다 ("20mm"). IronPDF는 강력한 유형의 속성이 있는 렌더러의 RenderingOptions 객체를 사용합니다.
주요 매핑:
"format": "A4"→PdfPaperSize.A4(강력한 유형의 열거형)"margin": { "top": "20mm" }→RenderingOptions.MarginTop = 20(숫자 mm)
IronPDF 여백은 항상 숫자 밀리미터이므로PDFBoltCSS 단위 문자열인 "20mm"가 직접적으로 매핑됩니다. PdfPaperSize 열거형에 접근하려면 IronPdf.Rendering 네임스페이스가 필요합니다. 추가 페이지 구성을 위해서는 렌더링 옵션 문서를 참조하십시오.
중요한 마이그레이션 노트
반환 타입 변경
PDFBolt의 /v1/direct 엔드포인트는 HTTP 응답 본문으로 원시 PDF를 반환합니다; IronPDF는 PdfDocument을 반환합니다:
//PDFBoltpattern:
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
//PDFBoltpattern:
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("output.pdf", pdfBytes);
//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;
Imports System.IO
Imports System.Net.Http
'PDFBolt pattern:
Dim pdfBytes = Await response.Content.ReadAsByteArrayAsync()
Await File.WriteAllBytesAsync("output.pdf", pdfBytes)
'IronPDF pattern:
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' Or if you need bytes:
Dim pdfBytes As Byte() = renderer.RenderHtmlAsPdf(html).BinaryData
통합 모델 변경
통합 모양이 REST 클라이언트에서 인프로세스 라이브러리로 변경됩니다:
// PDFBolt
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
// ... build JSON, POST to https://api.pdfbolt.com/v1/direct
// IronPDF
var renderer = new ChromePdfRenderer();
// PDFBolt
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY");
// ... build JSON, POST to https://api.pdfbolt.com/v1/direct
// IronPDF
var renderer = new ChromePdfRenderer();
Imports System.Net.Http
' PDFBolt
Using http As New HttpClient()
http.DefaultRequestHeaders.Add("API-KEY", "YOUR-PDFBOLT-API-KEY")
' ... build JSON, POST to https://api.pdfbolt.com/v1/direct
End Using
' IronPDF
Dim renderer As New ChromePdfRenderer()
구성 패턴 변경
PDFBolt 구성은 요청 본문에서 JSON 필드입니다; IronPDF는 RenderingOptions를 사용합니다:
// PDFBolt: JSON request fields
new { format = "A4", margin = new { top = "20mm" } }
// IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
// PDFBolt: JSON request fields
new { format = "A4", margin = new { top = "20mm" } }
// IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
' PDFBolt: JSON request fields
New With {Key .format = "A4", Key .margin = New With {Key .top = "20mm"}}
' IronPDF: RenderingOptions properties
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
API 키 제거
PDFBolt는 모든 요청에 API-KEY 헤더가 필요하며; IronPDF는 일회성 라이선스 키를 사용합니다:
// PDFBolt: API key per HTTP call (security risk if leaked)
http.DefaultRequestHeaders.Add("API-KEY", config["PDFBolt:ApiKey"]);
// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
// PDFBolt: API key per HTTP call (security risk if leaked)
http.DefaultRequestHeaders.Add("API-KEY", config["PDFBolt:ApiKey"]);
// IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
' PDFBolt: API key per HTTP call (security risk if leaked)
http.DefaultRequestHeaders.Add("API-KEY", config("PDFBolt:ApiKey"))
' IronPDF: License key once at startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
네트워크 오류 처리 제거
로컬 처리는 처리할 네트워크 오류가 없음을 의미합니다:
// 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
새로운 기능 제공
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")
문제 해결
문제 1: NuGet에 PDFBolt 패키지가 없습니다
문제: IronPDF에서 using PDFBolt; / new HtmlToPdfConverter()을 찾고 있습니다.
해결책: PDFBolt에는 .NET SDK가 없으며 — 통합은 https://api.pdfbolt.com/v1/direct에 대한 HttpClient으로 되어 있습니다. IronPDF는 그것의 래퍼를 완전히 ChromePdfRenderer로 대체합니다.
// IronPDF
var renderer = new ChromePdfRenderer();
// IronPDF
var renderer = new ChromePdfRenderer();
' IronPDF
Dim renderer As New ChromePdfRenderer()
문제 2: ConvertHtmlString는 어디에 갔습니까?
문제: ConvertHtmlString(html) 메서드를 공개한 사내PDFBolt래퍼를 마이그레이션합니다.
해결책: RenderHtmlAsPdf()를 사용하세요:
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
문제 3: ConvertUrl는 어디에 갔습니까?
문제: ConvertUrl(url) 메서드를 공개한 사내PDFBolt래퍼를 마이그레이션합니다.
해결책: RenderUrlAsPdf()를 사용하세요:
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);
// IronPDF
var pdf = renderer.RenderUrlAsPdf(url);
문제 4: format JSON 필드 → 열거형
문제: PDFBolt의 "format": "A4" JSON 필드를 번역합니다.
해결책: IronPdf.Rendering에서 PdfPaperSize를 사용하세요:
// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
// IronPDF
using IronPdf.Rendering;
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
Imports IronPdf.Rendering
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
문제 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>")
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에서PDFBoltREST 호출을 모두 목록화하세요 (
api.pdfbolt.com) - 현재 JSON 요청 필드를 문서화하세요 (
format,margin,printBackground,headerTemplate등) - 제거할 API 키 관리 코드 식별
- 429 / 쿼터 재시도 처리를 삭제 -IronPDF라이센스 키를 받으세요
패키지 변경 사항
- 손수 롤링된PDFBolt
HttpClient래퍼 및 DTOs를 삭제하세요 (제거할 NuGet 패키지가 없음) IronPdfNuGet Install-Package:dotnet add package IronPdfusing IronPdf;네임스페이스 추가- 종이 크기 열거형을 위한
using IronPdf.Rendering;추가
코드 변경 사항
- 시작 시 라이선스 키 구성 추가
HttpClient+API-KEY통합을ChromePdfRenderer로 교체POST /v1/direct을RenderHtmlAsPdf()/RenderUrlAsPdf()로 교체await response.Content.ReadAsByteArrayAsync()+File.WriteAllBytes()을pdf.SaveAs()으로 교체 (또는 바이트가 여전히 필요하면pdf.BinaryData)"format"/"margin"JSON 필드를RenderingOptions.PaperSize/RenderingOptions.MarginTop등으로 매핑- API 키 관리 코드 제거
- 429 / 속도 제한 처리 제거
- 네트워크 오류 처리 제거
마이그레이션 이후
- 구성 파일에서 API 키 삭제
- 비밀 관리자에서 API 키 제거
- PDF 출력 비교 모든 테스트 실행
- 페이지 크기와 여백이 정확하게 렌더링 되는지 확인
- 새로운 기능 추가 고려 (워터마크, 보안, 병합)

