C#에서 CraftMyPDF에서 IronPDF로 마이그레이션하는 방법
CraftMyPDF에서 IronPDF로의 이전 이유는 무엇입니까?
CraftMyPDF와 같은 클라우드 기반 PDF API는 많은 제작 환경에 부적합한 근본적인 문제를 도입합니다.
클라우드 기반 PDF API의 문제
-
데이터가 시스템을 떠납니다: 모든 HTML 템플릿과 JSON 데이터 페이로드가 CraftMyPDF의 서버로 전송됩니다. 송장, 계약서, 의료 기록 또는 다른 민감한 비즈니스 데이터의 경우 이것은 HIPAA, GDPR 및 SOC2 준수 위험을 초래합니다.
-
네트워크 지연: CraftMyPDF의 문서는 PDF당 1.5-30초를 명시합니다. IronPDF는 밀리초 단위로 로컬에서 생성합니다.
-
PDF당 비용 증가: 월 10,000개의 PDF를 구독 요금으로 생성하면 일회성 영구 라이선스에 비해 상당한 반복 비용이 발생합니다.
-
인쇄 최적화 출력: 클라우드 API는 종종 인쇄를 위해 최적화합니다. 배경을 줄이고 색상을 단순화하여 "잉크"를 절약합니다. 결과는 화면상의 HTML과 다르게 보입니다.
- 템플릿 잠금: CraftMyPDF는 그들만의 드래그 앤 드롭 편집기를 요구합니다. 표준 HTML/CSS를 자유롭게 사용할 수 없습니다.
아키텍처 비교
| 측면 | CraftMyPDF | IronPDF |
|---|---|---|
| 데이터 위치 | 클라우드 (데이터가 시스템을 떠남) | 온-프레미스(데이터는 절대 외부로 나가지 않음) |
| 지연 시간 | PDF당 1.5-30초 | 밀리초 |
| 가격 | PDF당 구독 | 일회성 영구 라이선스 |
| 템플릿 시스템 | 독점적 드래그 앤 드롭만 지원 | 모든 HTML/CSS/JavaScript |
| 출력 품질 | 인쇄 최적화 | 픽셀 완벽 화면 렌더링 |
| 오프라인에서 작동 | 아니요(인터넷 필요) | 예 |
| 규정 준수 | 데이터가 조직을 떠남 | SOC2/HIPAA 지원 |
기능 비교
| 기능 | CraftMyPDF | IronPDF |
|---|---|---|
| HTML to PDF | API 템플릿 사용 | ✅ 네이티브 |
| URL을 PDF로 변환 | API를 통해 | ✅ 네이티브 |
| 커스텀 템플릿 | 독점 에디터만 지원 | ✅ 모든 HTML |
| CSS3 지원 | 제한적 | ✅ 전체 |
| JavaScript 렌더링 | 제한적 | ✅ 전체 |
| PDF 병합/분할 | API를 통해 | ✅ 네이티브 |
| 워터마크 | API를 통해 | ✅ 네이티브 |
| 오프라인에서 작동 | ❌ | ✅ |
| 자체 호스팅 | ❌ | ✅ |
이전 준비
필수 조건
환경이 다음 요구 사항을 충족하는지 확인하세요:
- .NET Framework 4.6.2+ 또는 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 또는 VS Code와 C# 확장
- NuGet 패키지 관리자 접근 -IronPDF라이선스 키 (ironpdf.com에서 무료 체험판 제공)
CraftMyPDF사용 감사
이 명령을 솔루션 디렉토리에서 실행하여 모든CraftMyPDF참조를 식별하십시오:
# Find allCraftMyPDFusages 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 allCraftMyPDFusages 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" .
예상해야 할 주요 변경사항
| 변경 | CraftMyPDF | IronPDF | 영향 |
|---|---|---|---|
| 아키텍처 | 클라우드 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
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;
Imports IronPdf
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";
' Add at application startup (Program.vb or Global.asax)
' This replaces all X-API-KEY headers
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
완전한 API 마이그레이션 참조
API 끝점 매핑
| CraftMyPDF | IronPDF |
|---|---|
POST /v1/create |
renderer.RenderHtmlAsPdf(html) |
X-API-KEY 헤더 |
License.LicenseKey = "..." |
template_id |
표준 HTML 문자열 |
{%name%} 자리표시자 |
$"{name}" C# 보간 |
POST /v1/merge |
PdfDocument.Merge(pdfs) |
POST /v1/add-watermark |
pdf.ApplyWatermark(html) |
| 웹훅 콜백 | 필요 없음 |
| 속도 제한 | 적용 안 됨 |
구성 매핑
| CraftMyPDF 옵션 | IronPDF 동등 |
|---|---|
template_id |
HTML 문자열 |
data JSON |
C# 보간 |
page_size: "A4" |
PaperSize = PdfPaperSize.A4 |
orientation: "landscape" |
PaperOrientation = Landscape |
margin_top: 20 |
MarginTop = 20 |
header |
HtmlHeader |
footer |
HtmlFooter |
코드 마이그레이션 예제
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);
}
}
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
request.AddJsonBody(New With {
.template_id = "your-template-id",
.data = New With {
.html = "<h1>Hello World</h1><p>This is a PDF from HTML</p>"
}
})
Dim response = client.Execute(request)
File.WriteAllBytes("output.pdf", response.RawBytes)
End Sub
End Module
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");
}
}
Imports System
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF는 RestClient 설정, API 키 헤더, 템플릿 ID 및 HTTP 응답 처리를 없애면서 15줄의 클라우드 작업을 4줄의 로컬 코드로 줄입니다. 더 많은 옵션을 보려면 HTML to 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);
}
}
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
request.AddJsonBody(New With {
.template_id = "your-template-id",
.data = New With {
.url = "https://example.com"
},
.export_type = "pdf"
})
Dim response = client.Execute(request)
File.WriteAllBytes("webpage.pdf", response.RawBytes)
End Sub
End Module
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");
}
}
Imports System
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
IronPDF의 RenderUrlAsPdf 메서드는 JavaScript로 렌더링된 내용을 포함하여 전체 웹 페이지를 캡처합니다. 더 많은 옵션을 보려면 URL to 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
{
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);
}
}
Imports System
Imports RestSharp
Imports System.IO
Module Program
Sub Main()
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
request.AddJsonBody(New With {
.template_id = "your-template-id",
.data = New With {
.html = "<h1>Document Content</h1>",
.header = "<div>Page Header</div>",
.footer = "<div>Page {page} of {total_pages}</div>"
}
})
Dim response = client.Execute(request)
File.WriteAllBytes("document.pdf", response.RawBytes)
End Sub
End Module
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");
}
}
Imports System
Imports IronPdf
Imports IronPdf.Rendering
Module Program
Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Page Header"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}"
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document Content</h1>")
pdf.SaveAs("document.pdf")
End Sub
End Module
IronPDF는 {page} 및 {total-pages} 같은 플레이스홀더 토큰을 지원하여 동적 페이지 번호 매기기를 제공합니다. 더 많은 옵션은 헤더 및 푸터 문서를 참조하세요.
템플릿 변수 변환
CraftMyPDF는 소유한 템플릿 플레이스홀더를 사용하며, C# 문자열 보간으로 변환해야 합니다:
CraftMyPDF 패턴:
//CraftMyPDFtemplate variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});
//CraftMyPDFtemplate variables
request.AddJsonBody(new
{
template_id = "invoice-template",
data = new
{
customer = "John Doe",
amount = "$1,000",
items = invoiceItems
}
});
'CraftMyPDFtemplate variables
request.AddJsonBody(New With {
.template_id = "invoice-template",
.data = New With {
.customer = "John Doe",
.amount = "$1,000",
.items = invoiceItems
}
})
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);
Dim html As String = $"
<html>
<body>
<h1>Invoice</h1>
<p>Customer: {customerName}</p>
<p>Amount: {amount}</p>
{GenerateItemsTable(invoiceItems)}
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
중요한 마이그레이션 노트
모든 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);
Imports RestSharp
'CraftMyPDF- HTTP required
Dim client As New RestClient("https://api.craftmypdf.com/v1/create")
Dim request As New RestRequest(Method.POST)
request.AddHeader("X-API-KEY", "your-api-key")
Dim response = Await client.ExecuteAsync(request)
'IronPDF- no HTTP
Dim pdf = renderer.RenderHtmlAsPdf(html)
속도 제한 코드 제거
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!
웹훅 핸들러 제거
CraftMyPDF는 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!
'CraftMyPDF- webhook callback required
' POST with webhook_url, wait for callback
'IronPDF- PDF ready immediately
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
' No callback needed!
기본 동기화
HTTP 호출만을 위한 경우에만 필요했던 비동기/대기 패턴을 제거하세요:
//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);
마이그레이션 후 점검 목록
코드 마이그레이션을 완료한 후, 다음을 확인하십시오:
- 모든 PDF 생성 테스트 실행
- 출력 품질 비교 (IronPDF의 Chromium 엔진은 픽셀 정확하게 렌더링함)
- 성능 향상 측정 (밀리초 vs. 초)
- 모든 템플릿이 올바르게 변환되었는지 검증
- 속도 제한 없이 일괄 처리 테스트
- 모든 대상 환경에서 테스트합니다
- CI/CD 파이프라인을 업데이트하세요 -CraftMyPDF구독 취소
- 비밀/구성에서 API 키 제거
PDF 인프라의 미래 대비
.NET 10이 다가오는 시점과 C# 14가 새로운 언어 기능을 도입함에 따라, 로컬 PDF 라이브러리를 선택하면 클라우드 API 폐기 위험과 버전 호환성 우려를 제거할 수 있습니다. IronPDF의 영구 라이선스 모델은 프로젝트가 2025년과 2026년으로 확장되더라도 이주 투자 비용을 일회성으로 지출하게 됩니다—구독 비용 없이 또는 데이터가 인프라를 떠나지 않고.
추가 리소스
CraftMyPDF에서 IronPDF로의 전환은 클라우드 종속성, 네트워크 지연, PDF당 비용, 템플릿 종속성을 없애며 오프라인으로 실행되는 픽셀 완벽한 Chromium 렌더링을 제공합니다. REST API 호출에서 로컬 메서드 호출로의 전환은 코드베이스를 간소화하고 민감한 문서 데이터를 인프라 내에 유지합니다.

