C#에서 pdforge에서 IronPDF로 마이그레이션하는 방법
pdforge에서 IronPDF로 이동하는 이유
pdforge 이해하기
pdforge (2026년에 'pdf noodle'로 리브랜딩됨 — pdfnoodle.com; 301 리디렉트를 통해 2026년 말까지 api.pdforge.com 호스트 이름이 계속 작동합니다) 이는 클라우드 기반, 템플릿 주도의 PDF 생성 API로, HTTP 호출을 통해 애플리케이션과 통합하여 PDF 파일을 생성하는 간단한 방법을 제공합니다. NuGet에는 공식적인 .NET SDK가 없으므로 문서화된 REST 엔드포인트에 대해 HttpClient를 사용하여 통합을 수행합니다. PDF 생성 작업을 외부 API로 오프로드함으로써 개발자는 개발 과정을 단순화할 수 있습니다. 그러나 pdforge는 외부 종속성, 제한된 사용자 지정 옵션, 그리고 지속적인 구독 비용과 같은 단점을 제공하며, 개발자는 이에 유의해야 합니다.
클라우드 API 종속 문제
pdforge는 모든 문서를 외부 클라우드 서버에서 처리합니다. 이 아키텍처는 생산 응용 프로그램에 상당한 우려를 야기합니다:
-
외부 서버 처리: 생성하는 모든 PDF는 HTML/데이터를 pdforge의 서버로 보내야 하며—문서는 기반 시설을 떠납니다.
-
개인정보 보호 및 준수 위험: 민감한 데이터는 인터넷을 통해 제3자 서버로 이동합니다. pdforge를 사용할 때, 개발자는 외부 API로 보내지는 데이터와 관련된 보안 문제를 수용해야 합니다. PDF 내용에 민감한 정보가 포함된 경우, 이는 중요한 고려 사항이 될 수 있습니다.
-
지속적인 구독 비용: 월간 요금은 자산 소유 없이 무기한 누적됩니다. pdforge의 SaaS 모델은 지속적인 운영 비용을 도입하여 시간이 지남에 따라 누적될 수 있습니다.
-
인터넷 의존성: 네트워크가 사용할 수 없는 경우 PDF 생성이 이루어지지 않습니다.
-
속도 제한: API 사용 한도가 대량 응용 프로그램을 제약할 수 있습니다.
- 네트워크 지연: 왕복 시간은 각 PDF 생성에 초 단위의 시간이 추가됩니다.
pdforge 대IronPDF비교
| 기능 | pdforge | IronPDF |
|---|---|---|
| 배포 유형 | 클라우드 기반 API | 로컬 라이브러리 |
| 종속성 | 인터넷과 API 인증 필요 | 외부 종속성 없음 |
| 커스터마이제이션 | PDF 생성에 대한 제한된 통제 | 사용자 정의에 대한 완전한 통제 |
| 비용 구조 | 지속 구독 | 일회성 구매 옵션 |
| 보안 | 웹을 통해 전송된 데이터와 관련된 잠재적 우려 | 데이터 처리를 전적으로 로컬 환경에서 유지 |
| 설치 복잡성 | 외부 처리를 통해 초기 설정 더 쉬움 | 더 많은 초기 설정 및 구성 필요 |
IronPDF는 개발자가 PDF 생성 과정에 완전한 통제를 가질 수 있는 완전한 로컬 라이브러리를 제공함으로써 자신을 차별화합니다. 이는 파일의 내부 처리가 더 선호되는 응용 프로그램이나 외부 API 호출이 보안 문제를 초래하는 경우 특히 유리합니다. IronPDF는 이러한 위험을 최소화하면서 모든 것을 로컬에서 처리합니다.
.NET 10 및 C# 14 도입을 계획하는 팀들에게 IronPDF는 클라우드 의존성을 제거하면서 포괄적인 PDF 조작 기능을 추가하는 로컬 처리기반을 제공합니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# pdforge has no official .NET SDK on NuGet — integration is HttpClient + JSON.
# If your project depends only on built-in System.Net.Http, there is no
# competitor package to remove. Just install IronPDF:
dotnet add package IronPdf
# pdforge has no official .NET SDK on NuGet — integration is HttpClient + JSON.
# If your project depends only on built-in System.Net.Http, there is no
# competitor package to remove. Just install IronPDF:
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"
pdforge 사용 식별하기
# Find pdforge / pdf noodle endpoint usage
grep -r "api\.pdforge\.com\|api\.pdfnoodle\.com" --include="*.cs" .
# Find API key / Bearer token references
grep -r "pdfnoodle_api_\|pdforge_api_" --include="*.cs" --include="*.json" --include="*.config" .
# Find Chromium header/footer templates that need migrating
grep -r "totalPages\|pageNumber\|footerTemplate\|headerTemplate" --include="*.cs" .
# Find pdforge / pdf noodle endpoint usage
grep -r "api\.pdforge\.com\|api\.pdfnoodle\.com" --include="*.cs" .
# Find API key / Bearer token references
grep -r "pdfnoodle_api_\|pdforge_api_" --include="*.cs" --include="*.json" --include="*.config" .
# Find Chromium header/footer templates that need migrating
grep -r "totalPages\|pageNumber\|footerTemplate\|headerTemplate" --include="*.cs" .
완전한 API 참조
네임스페이스 변경
// Before: pdforge — raw HttpClient against api.pdfnoodle.com
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: pdforge — raw HttpClient against api.pdfnoodle.com
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports IronPdf
Imports IronPdf.Rendering
핵심 개념 매핑
| pdforge (REST) | IronPDF |
|---|---|
HttpClient + Authorization: Bearer pdfnoodle_api_... |
new ChromePdfRenderer() |
POST https://api.pdfnoodle.com/v1/html-to-pdf/sync |
renderer.RenderHtmlAsPdf(html) |
JSON 본문 { html, pdfParams } |
ChromePdfRenderer + RenderingOptions |
응답: JSON 봉투와 signedUrl |
PdfDocument |
반환: byte[] ( signedUrl 가져온 후) |
pdf.BinaryData |
작업 매핑
| pdforge | IronPDF |
|---|---|
POST /v1/html-to-pdf/sync 와 { html } |
renderer.RenderHtmlAsPdf(html) |
| URL을 가져와, HTML을 POST (전용 URL 엔드포인트 없음) | renderer.RenderUrlAsPdf(url) |
signedUrl 다운로드 후 File.WriteAllBytes(path, bytes) |
pdf.SaveAs(path) |
await http.GetByteArrayAsync(signedUrl) |
pdf.BinaryData |
구성 매핑
pdforge pdfParams |
IronPDF (RenderingOptions) |
|---|---|
format: "A4" |
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 |
landscape: true |
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
margin: { top: "20px" } |
renderer.RenderingOptions.MarginTop = 20 |
footerTemplate 와 <span class="pageNumber"> / <span class="totalPages"> |
TextFooter = new TextHeaderFooter { CenterText = "Page {page} of {total-pages}" } |
pdforge에서 사용할 수 없는 새로운 기능
| IronPDF기능 | 설명 |
|---|---|
PdfDocument.Merge() |
여러 개의 PDF 결합 |
pdf.ExtractAllText() |
PDF에서 텍스트 추출 |
pdf.ApplyWatermark() |
워터마크 추가 |
pdf.SecuritySettings |
암호 보호 |
pdf.Form |
양식 채우기 |
pdf.SignWithDigitalSignature() |
디지털 서명 |
코드 마이그레이션 예제
예제 1: HTML 문자열을 PDF로 변환
이전 (pdforge):
// REST API — no .NET SDK on NuGet. Integration is HttpClient + JSON POST.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
var body = new { html = "<html><body><h1>Hello World</h1></body></html>" };
var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
// REST API — no .NET SDK on NuGet. Integration is HttpClient + JSON POST.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
var body = new { html = "<html><body><h1>Hello World</h1></body></html>" };
var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Using http As New HttpClient()
http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")
Dim body = New With {.html = "<html><body><h1>Hello World</h1></body></html>"}
Dim json As New StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")
Dim resp = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
resp.EnsureSuccessStatusCode()
Using doc = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
Dim pdfBytes = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
File.WriteAllBytes("output.pdf", pdfBytes)
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 html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
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
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
여기서 기본적인 차이는 처리 모델과 반환 유형입니다. pdforge는 인증된 HttpClient POST를 https://api.pdfnoodle.com/v1/html-to-pdf/sync로 보내야 하며, 이는 서명된 S3 URL을 포함하는 JSON 봉투를 반환합니다 — 그런 다음 해당 URL에서 PDF 바이트를 가져와 File.WriteAllBytes()로 씁니다.
IronPDF는 ChromePdfRenderer 와 RenderHtmlAsPdf()를 사용하여 PdfDocument 객체를 반환합니다. 이 객체는 SaveAs()로 직접 저장할 수 있으며, 원시 바이트가 필요하다면 pdf.BinaryData에 접근할 수 있습니다. PdfDocument 는 저장하기 전에 조작(워터마크 추가, 다른 PDF와 병합, 보안 추가)을 허용합니다. HTML에서 PDF로의 문서에서 포괄적인 예제를 참조하세요.
예제 2: URL에서 PDF로 변환
이전 (pdforge):
// REST API — no .NET SDK on NuGet. pdforge has no dedicated URL endpoint;
// fetch the page yourself and POST its HTML to /v1/html-to-pdf/sync.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
var sourceHtml = await http.GetStringAsync("https://example.com");
var body = new { html = sourceHtml };
var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}
// REST API — no .NET SDK on NuGet. pdforge has no dedicated URL endpoint;
// fetch the page yourself and POST its HTML to /v1/html-to-pdf/sync.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
var sourceHtml = await http.GetStringAsync("https://example.com");
var body = new { html = sourceHtml };
var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}
Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Using http As New HttpClient()
http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")
Dim sourceHtml As String = Await http.GetStringAsync("https://example.com")
Dim body = New With {Key .html = sourceHtml}
Dim json As New StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")
Dim resp As HttpResponseMessage = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
resp.EnsureSuccessStatusCode()
Using doc As JsonDocument = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
Dim pdfBytes As Byte() = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
File.WriteAllBytes("webpage.pdf", pdfBytes)
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://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://example.com");
pdf.SaveAs("webpage.pdf");
}
}
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
pdforge는 전용 URL-to-PDF 엔드포인트가 없습니다 — 페이지를 직접 가져온 다음, HTML을 동기화 엔드포인트에 게시하고 반환된 서명된 URL에서 결과를 다운로드합니다. IronPDF는 RenderUrlAsPdf() 와 ChromePdfRenderer를 사용하여 내장된 SaveAs() 메서드와 함께 PdfDocument를 반환합니다.
IronPDF의 주요 이점은 URL이 외부 서버에 데이터가 전송되지 않고 Chrominium 엔진을 사용하여 로컬에서 가져와 렌더링된다는 것입니다. IronPDF는 로컬 라이브러리로서 웹 요청에 왕복 시간이 없는 만큼 더 나은 성능을 제공할 수 있습니다. URL에서 PDF로 변환에 대해 더 알아보세요.
예제 3: 사용자 정의 설정으로 HTML 파일을 PDF로 변환
이전 (pdforge):
// REST API — no .NET SDK on NuGet. Page size / orientation flow through the
// optional `pdfParams` object using Chromium/Puppeteer-style names.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
var htmlContent = File.ReadAllText("input.html");
var body = new { html = htmlContent, pdfParams = new { format = "A4", landscape = true } };
var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
// REST API — no .NET SDK on NuGet. Page size / orientation flow through the
// optional `pdfParams` object using Chromium/Puppeteer-style names.
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
var htmlContent = File.ReadAllText("input.html");
var body = new { html = htmlContent, pdfParams = new { format = "A4", landscape = true } };
var json = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
resp.EnsureSuccessStatusCode();
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);
}
}
Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Using http As New HttpClient()
http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")
Dim htmlContent As String = File.ReadAllText("input.html")
Dim body = New With {
.html = htmlContent,
.pdfParams = New With {
.format = "A4",
.landscape = True
}
}
Dim json As New StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")
Dim resp As HttpResponseMessage = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
resp.EnsureSuccessStatusCode()
Using doc As JsonDocument = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
Dim pdfBytes As Byte() = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
File.WriteAllBytes("output.pdf", pdfBytes)
End Using
End Using
End Function
End Module
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
var htmlContent = System.IO.File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
var htmlContent = System.IO.File.ReadAllText("input.html");
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Dim htmlContent = System.IO.File.ReadAllText("input.html")
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
이 예제는 구성 패턴 차이를 보여 줍니다. pdforge는 Chromium/Puppeteer 명명 규칙에 따라 POST 바디에서 pdfParams 객체 내부의 JSON 필드로 옵션을 전달합니다 ( format = "A4", landscape = true).
IronPDF는 RenderingOptions 속성을 강력한 형식화된 열거형과 함께 사용합니다: renderer.RenderingOptions.PaperSize = PdfPaperSize.A4 와 renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape. 이것은 IntelliSense 지원과 컴파일 타임 타입 안전성을 제공합니다. IronPDF는 용지 크기와 방향 열거형을 위해 IronPdf.Rendering 네임스페이스를 가져와야 합니다. 더 많은 구성 예제를 보려면 튜토리얼을 참조하세요.
중요한 마이그레이션 노트
반환 타입 변경
pdforge는 서명된 URL이 들어있는 JSON 봉투를 반환합니다; IronPDF는 PdfDocument를 반환합니다:
// pdforge: Two-step — parse signedUrl from JSON, then fetch bytes from it
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf"); // Direct save
byte[] bytes = pdf.BinaryData; // Get bytes if needed
// pdforge: Two-step — parse signedUrl from JSON, then fetch bytes from it
var resp = await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json);
using var doc = JsonDocument.Parse(await resp.Content.ReadAsStringAsync());
var pdfBytes = await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString());
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Returns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf"); // Direct save
byte[] bytes = pdf.BinaryData; // Get bytes if needed
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports IronPdf
' pdforge: Two-step — parse signedUrl from JSON, then fetch bytes from it
Dim resp = Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json)
Using doc As JsonDocument = JsonDocument.Parse(Await resp.Content.ReadAsStringAsync())
Dim pdfBytes = Await http.GetByteArrayAsync(doc.RootElement.GetProperty("signedUrl").GetString())
File.WriteAllBytes("output.pdf", pdfBytes)
End Using
' IronPDF: Returns PdfDocument
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf") ' Direct save
Dim bytes As Byte() = pdf.BinaryData ' Get bytes if needed
발전기 변경
// pdforge: HttpClient against the REST endpoint
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
// pdforge: HttpClient against the REST endpoint
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY");
// IronPDF: ChromePdfRenderer
var renderer = new ChromePdfRenderer();
' pdforge: HttpClient against the REST endpoint
Using http As New HttpClient()
http.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", "pdfnoodle_api_YOUR_KEY")
' IronPDF: ChromePdfRenderer
Dim renderer As New ChromePdfRenderer()
End Using
작업 변경
// pdforge operations
await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json); // HTML to PDF
// URL to PDF: fetch the page first, then POST its HTML to the same endpoint
//IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
// pdforge operations
await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json); // HTML to PDF
// URL to PDF: fetch the page first, then POST its HTML to the same endpoint
//IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
' pdforge operations
Await http.PostAsync("https://api.pdfnoodle.com/v1/html-to-pdf/sync", json) ' HTML to PDF
' URL to PDF: fetch the page first, then POST its HTML to the same endpoint
' IronPDF methods
renderer.RenderHtmlAsPdf(html)
renderer.RenderUrlAsPdf(url)
저장 방법 변경
// pdforge: Two-step — fetch bytes from signed URL, then write to disk
var pdfBytes = await http.GetByteArrayAsync(signedUrl);
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
// pdforge: Two-step — fetch bytes from signed URL, then write to disk
var pdfBytes = await http.GetByteArrayAsync(signedUrl);
File.WriteAllBytes("output.pdf", pdfBytes);
// IronPDF: Built-in save method
pdf.SaveAs("output.pdf");
' pdforge: Two-step — fetch bytes from signed URL, then write to disk
Dim pdfBytes = Await http.GetByteArrayAsync(signedUrl)
File.WriteAllBytes("output.pdf", pdfBytes)
' IronPDF: Built-in save method
pdf.SaveAs("output.pdf")
구성 위치 변경
pdforge는 pdfParams의 JSON 필드로 옵션을 전달합니다; IronPDF는 RenderingOptions를 사용합니다:
// pdforge: JSON pdfParams object on the POST body
var body = new { html, pdfParams = new { format = "A4", landscape = true } };
// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
// pdforge: JSON pdfParams object on the POST body
var body = new { html, pdfParams = new { format = "A4", landscape = true } };
// IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
' pdforge: JSON pdfParams object on the POST body
Dim body = New With {Key .html = html, Key .pdfParams = New With {Key .format = "A4", Key .landscape = True}}
' IronPDF: Properties on RenderingOptions
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
헤더/푸터 플레이스홀더 구문
pdforge는 Chromium의 헤더/푸터 템플릿 형식을 상속받습니다 — HTML 요소로 구성된 <span class="..."></span> 프래그먼트를 런더링 시간에 엔진이 대체합니다. IronPDF는 TextHeaderFooter / HtmlHeaderFooter 내부에 괄호로 둘러싼 플레이스홀더를 사용합니다:
// pdforge: Chromium template HTML inside pdfParams.footerTemplate
// "<div>Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></div>"
//IronPDF placeholders
"Page {page} of {total-pages}" // Note: hyphen in total-pages
// pdforge: Chromium template HTML inside pdfParams.footerTemplate
// "<div>Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></div>"
//IronPDF placeholders
"Page {page} of {total-pages}" // Note: hyphen in total-pages
' pdforge: Chromium template HTML inside pdfParams.footerTemplate
' "<div>Page <span class=""pageNumber""></span> of <span class=""totalPages""></span></div>"
' IronPDF placeholders
"Page {page} of {total-pages}" ' Note: hyphen in total-pages
이동 후 새로운 기능
IronPDF로 마이그레이션한 후 pdforge가 제공할 수 없는 기능을 얻습니다:
PDF 병합
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
텍스트 추출
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string allText = pdf.ExtractAllText();
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim allText As String = pdf.ExtractAllText()
워터마크
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>")
비밀번호 보호
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
기능 비교 요약
| 기능 | pdforge | IronPDF |
|---|---|---|
| HTML to PDF | ✓ | ✓ |
| URL을 PDF로 변환 | ✓ | ✓ |
| 페이지 설정 | ✓ | ✓ |
| 오프라인 사용 가능 | ✗ | ✓ |
| 로컬 처리 | ✗ | ✓ |
| PDF 병합 | ✗ | ✓ |
| PDF 분할 | ✗ | ✓ |
| 텍스트 추출 | ✗ | ✓ |
| 워터마크 | ✗ | ✓ |
| 폼 채우기 | ✗ | ✓ |
| 디지털 서명 | ✗ | ✓ |
| 비밀번호 보호 | ✗ | ✓ |
| 비율 제한 없음 | ✗ | ✓ |
| 일회성 라이선스 | ✗ | ✓ |
마이그레이션 체크리스트
사전 마이그레이션
- 코드베이스에 있는 모든 pdforge / pdf noodle 엔드포인트 호출을 개괄합니다 (
api.pdforge.com,api.pdfnoodle.com) - 현재 사용 중인
pdfParamsJSON 구성 문서화 (페이지 크기, 방향, 여백) - Chromium 스타일 헤더/푸터 템플릿을 식별하여IronPDF플레이스홀더로 변환합니다 (
<span class="pageNumber">,<span class="totalPages">), ({page},{total-pages}) -IronPDF라이선스 키 저장 계획 (환경 변수 권장) -IronPDF체험판 라이선스로 먼저 테스트
패키지 변경 사항
- pdforge는 NuGet에 .NET SDK가 없습니다 — 제거할 경쟁자 패키지가 없습니다.
IronPdfNuGet Install-Package:dotnet add package IronPdf
코드 변경 사항
- pdforge 호출에만 사용되던
System.Net.Http/System.Text.Json임포트를 제거합니다 - 용지 크기와 방향 열거형을 위해
using IronPdf;와using IronPdf.Rendering;추가합니다 - 인증된
HttpClient를ChromePdfRenderer로 대체합니다 POST /v1/html-to-pdf/sync를RenderHtmlAsPdf()로 대체합니다- URL을 가져오고 POST하는 패턴을
RenderUrlAsPdf()로 대체합니다 - 두 단계의
GetByteArrayAsync(signedUrl)+File.WriteAllBytes()를pdf.SaveAs()로 대체합니다 pdfParams.format를RenderingOptions.PaperSize로 옮깁니다pdfParams.landscape를RenderingOptions.PaperOrientation로 옮깁니다PdfPaperSize.A4/PdfPaperOrientation.Landscape열거형을 사용합니다- Chromium 템플릿을
TextHeaderFooter/HtmlHeaderFooter내부의IronPDF플레이스홀더로 변환합니다 - 요청별
Bearer토큰을 시작 시 일회성IronPdf.License.LicenseKey로 대체합니다
마이그레이션 이후
- PDF 출력 품질이 기대에 부합하는지 테스트하세요
- 오프라인 작업이 작동하는지 확인
- 구성에서 API 자격 증명 제거
- 필요에 따라 새로운 기능 추가 (병합, 워터마크, 보안)

