IRONSOFTWAREHOME
동영상

C#을 사용하여 PDF에서 삽입된 텍스트와 이미지를 추출하는 방법

Curtis Chau
Curtis Chau
Updated: 2026년 7월 19일

Api2pdf는 PDF 생성을 위한 클라우드 기반 서비스를 제공하지만, 민감한 문서를 외부 서버에 보내면 보안 위험, 규정 준수 문제, 시간이 지남에 따라 증가할 수 있는 지속적인 비용을 초래할 수 있습니다. 이 가이드는 Api2pdf에서 IronPDF로의 자세한 마이그레이션 경로를 제공하며, IronPDF는 문서를 완전히 자체 인프라에서 처리하여 데이터 전송 문제를 제거하고 변환당 비용을 일회성 투자로 전환합니다.

왜 Api2pdf에서 이동을 고려해야 하나요?

Api2pdf는 편리한 클라우드 기반 PDF 생성을 제공하지만, 몇 가지 요인으로 인해 개발 팀은 PDF 생성 요구 사항을 위한 온프레미스 대안을 찾습니다.

보안 및 규정 준수 관련 문제

Api2pdf는 클라우드 기반 서비스로, 귀하의 민감한 HTML 및 문서를 타사 서버에 처리하기 위해 보냅니다. 이는 규제 데이터를 처리하는 조직에 상당한 우려를 불러일으킵니다.

위험Api2pdfIronPDF
데이터 전송모든 콘텐츠가 외부 서버로 전송됨귀하의 인프라에서 로컬로 처리됨
GDPR 준수데이터가 관할권을 넘나듦데이터가 귀하의 환경을 떠나지 않음
HIPAA 준수PHI가 외부로 전송됨PHI가 귀하의 시스템 내에 유지됨
SOC 2타사 의존성데이터 처리에 대한 완전한 제어
PCI DSS카드 데이터가 잠재적으로 노출됨외부 전송이 없음

시간이 지남에 따른 비용 누적

Api2pdf는 매월 $1의 기본 요금과 메타된 사용량(대역폭과 계산 초)을 무한히 청구하는 반면, IronPDF는 일회성 영구 라이선스를 제공합니다. api2pdf.com/pricing에서 현재 가격을 확인하십시오:

컴포넌트Api2pdfIronPDF
기본$1/월일회성 라이선스
대역폭MB당 $0.001n/a (로컬)
연산$0.00019551 초당n/a (로컬)
볼륨 스케일링사용량 및 파일 크기에 비례Flat (Lite ~$999, Plus ~$1,499, Professional ~$2,399)

대규모 작업(큰 파일, JS 중점 페이지, 긴 렌더링 시간)은 api2pdf 비용을 증가시킵니다;IronPDF비용은 라이선스가 발행되면 고정됩니다.

성능 및 가용성

Api2pdf는 네트워크 왕복이 필요하여 PDF 생성 요청당 25초의 지연 시간을 추가합니다. IronPDF는 로컬에서 100500 밀리초에 처리합니다. 또한, IronPDF는 오프라인 환경과 에어갭 환경에서 완전히 작동하며, 외부 서비스 가용성에 의존할 수 없는 애플리케이션에 필수적입니다.

##Api2pdfvs. IronPDF: 주요 차이점

측면Api2pdfIronPDF
데이터 처리제3자 클라우드 서버로 전송귀하의 인프라에서 로컬로 처리
가격$1/월 기본 + 사용량에 따라 측정됨 ($0.001/MB 대역폭, $0.00019551/초 연산)일회성 영구 라이선스
지연 시간2-5초(네트워크 왕복 시간)100-500ms(로컬 처리)
오프라인사용 불가완전한 오프라인 작동
설치API 키 + HTTP 클라이언트간단한 NuGet 패키지
규정 준수GDPR/HIPAA 문제 (데이터가 네트워크를 떠남)완전한 규정 준수 제어

단계별 마이그레이션 프로세스

1단계: NuGet 패키지 업데이트

Api2pdf 패키지를 제거하고 IronPDF를 설치하세요:

# Remove Api2pdf
dotnet remove package Api2Pdf

# Install IronPDF
dotnet add package IronPdf
SHELL

또는 패키지 관리자 콘솔을 통해:

Uninstall-Package Api2Pdf
Install-Package IronPdf
PowerShell

2단계: 네임스페이스 참조 업데이트

Api2pdf 네임스페이스를 IronPDF로 교체하세요:

// Remove these
using Api2Pdf;

// Add these
using IronPdf;
using IronPdf.Rendering;

3단계: 라이선스 키 구성

어플리케이션 시작 시IronPDF라이선스 키를 설정하세요:

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";

// Or configure via appsettings.json:
// { "IronPdf.LicenseKey": "YOUR-IRONPDF-LICENSE-KEY" }

4단계: API 키 구성 제거

IronPDF는 로컬에서 실행되며 API 키가 필요하지 않습니다:

// Remove thisApi2pdfpattern
var client = new Api2Pdf("API_KEY");

// Just create the renderer directly
var renderer = new ChromePdfRenderer();
C#

완전한 API 마이그레이션 참조

핵심 클래스 매핑

Api2pdf 클래스IronPDF 동등
Api2Pdf (클라이언트)ChromePdfRenderer
Api2PdfResultPdfDocument
ChromeHtmlToPdfOptionsChromePdfRenderOptions

메서드 매핑

Api2pdf 메서드IronPDF 메소드
client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html })renderer.RenderHtmlAsPdf(html)
client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest { Url = url })renderer.RenderUrlAsPdf(url)
result.FileUrl (다운로드 URL)pdf.SaveAs(path)
result.GetFileBytes()pdf.BinaryData
client.PdfSharp.MergePdfs(new PdfMergeRequest { Urls = urls })PdfDocument.Merge(pdfs)
client.PdfSharp.SetPassword(new PdfPasswordRequest { Url, OwnerPassword })pdf.SecuritySettings.OwnerPassword

렌더링 옵션 매핑

Api2pdf 옵션IronPDF 옵션
Landscape = trueRenderingOptions.PaperOrientation = Landscape
PreferCSSPageSize = true / FormatRenderingOptions.PaperSize = PdfPaperSize.A4
PrintBackground = trueRenderingOptions.PrintHtmlBackgrounds = true
MarginTop, 등.RenderingOptions.MarginTop, 등.
Delay = 5000RenderingOptions.WaitFor.RenderDelay(5000)

코드 마이그레이션 예제

HTML을 PDF로 변환

가장 일반적인Api2pdf작업은 클라우드 API 호출에서 로컬 처리로의 근본적인 전환을 보여줍니다.

Api2pdf 구현:

// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = "<h1>Hello World</h1>"
        });
        Console.WriteLine(result.FileUrl);
    }
}

IronPDF 구현:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created successfully");
    }
}

IronPDF는 네트워크 왕복, API 키 관리, 그리고 Api2pdf의 URL 기반 응답 패턴이 요구하는 별도의 다운로드 단계를 제거합니다.

URL을 PDF로 변환

Api2pdf 구현:

// NuGet: Install-Package Api2Pdf
using System;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        var result = await client.Chrome.UrlToPdfAsync(new ChromeUrlToPdfRequest
        {
            Url = "https://www.example.com"
        });
        Console.WriteLine(result.FileUrl);
    }
}

IronPDF 구현:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
        Console.WriteLine("PDF created from URL successfully");
    }
}

HTML 파일을 PDF로 변환 (옵션 포함)

Api2pdf 구현:

// NuGet: Install-Package Api2Pdf
using System;
using System.IO;
using System.Threading.Tasks;
using Api2Pdf;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new Api2Pdf("your-api-key");
        string html = File.ReadAllText("input.html");
        var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = html,
            Options = new ChromeHtmlToPdfOptions
            {
                Landscape = true,
                PrintBackground = true
            }
        });
        Console.WriteLine(result.FileUrl);
    }
}

IronPDF 구현:

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

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = IronPdf.Rendering.PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
        string html = File.ReadAllText("input.html");
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
        Console.WriteLine("PDF created with options successfully");
    }
}

IronPDF는 각 API 호출에 별도의 옵션 매개변수로 전달하는 대신, 렌더러 객체에서 직접 렌더링 옵션을 구성합니다.

여러 PDF 병합

Api2pdf 구현:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

var pdfUrls = new List<string>
{
    "https://example.com/pdf1.pdf",
    "https://example.com/pdf2.pdf",
    "https://example.com/pdf3.pdf"
};

var request = new PdfMergeRequest { Urls = pdfUrls };
var result = await client.PdfSharp.MergePdfsAsync(request);

if (result.Success)
{
    // Download merged PDF from result.FileUrl
}

IronPDF 구현:

using IronPdf;

// Load PDFs from files
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var pdf3 = PdfDocument.FromFile("document3.pdf");

// Merge all PDFs
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("merged.pdf");

IronPDF의 정적 Merge 메서드는 여러 문서를 직접 수락하여 URL 기반 워크플로우를 제거합니다.

비밀번호로 보호된 PDF

Api2pdf 구현:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

// Generate PDF first
var pdfResult = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
    Html = "<h1>Confidential</h1>"
});

// Then add password protection in a second round-trip
var protectedResult = await client.PdfSharp.SetPasswordAsync(new PdfPasswordRequest
{
    Url = pdfResult.FileUrl,
    OwnerPassword = "secretpassword"
});

IronPDF 구현:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

// Set security in one step
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

pdf.SaveAs("protected.pdf");

IronPDF는 SecuritySettings 속성을 통해 PDF 권한에 대한 세밀한 제어를 제공합니다.

머리말과 바닥글

Api2pdf 구현:

using Api2Pdf;

var client = new Api2Pdf("YOUR_API_KEY");

var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
{
    Html = html,
    Options = new ChromeHtmlToPdfOptions
    {
        DisplayHeaderFooter = true,
        HeaderTemplate = "<div style='font-size:10px'>Company Header</div>",
        FooterTemplate = "<div style='font-size:10px'>Page <span class='pageNumber'></span></div>"
    }
});

IronPDF 구현:

using IronPdf;

var renderer = new ChromePdfRenderer();

// HTML headers and footers with full styling
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='font-size:10px; text-align:center;'>Company Header</div>",
    DrawDividerLine = true
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='font-size:10px; text-align:center;'>Page {page} of {total-pages}</div>",
    DrawDividerLine = true
};

var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("with-headers.pdf");

IronPDF는 동적 페이지 번호 매김을 위한 {page}{total-pages}와 같은 플레이스홀더 토큰을 지원합니다. 더 많은 옵션은 헤더 및 푸터 문서를 참조하세요.

ASP.NET Core 통합

Api2pdf의 비동기 HTTP 패턴은 IronPDF의 직접적인 PDF 생성과 상당히 다릅니다.

Api2pdf 패턴:

[ApiController]
public class PdfController : ControllerBase
{
    private readonly Api2Pdf _client;

    public PdfController()
    {
        _client = new Api2Pdf("YOUR_API_KEY");
    }

    [HttpGet("generate")]
    public async Task<IActionResult> GeneratePdf()
    {
        var result = await _client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest
        {
            Html = "<h1>Report</h1>"
        });

        if (!result.Success)
            return BadRequest(result.Error);

        // Redirect to download URL
        return Redirect(result.FileUrl);
    }
}

IronPDF 패턴:

[ApiController]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

        // Return PDF directly - no download step needed
        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }
}

IronPDF는 BinaryData 또는 Stream를 통해 PDF를 직접 반환하여 다운로드를 위한 리디렉션 패턴을 제거합니다.

의존성 주입 구성

// Program.cs or Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IPdfService, IronPdfService>();
}

// IPdfService.cs
public interface IPdfService
{
    PdfDocument GenerateFromHtml(string html);
    Task<PdfDocument> GenerateFromHtmlAsync(string html);
}

// IronPdfService.cs
public class IronPdfService : IPdfService
{
    private readonly ChromePdfRenderer _renderer;

    public IronPdfService()
    {
        _renderer = new ChromePdfRenderer();
        _renderer.RenderingOptions.PrintHtmlBackgrounds = true;
        _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
    }

    public PdfDocument GenerateFromHtml(string html) =>
        _renderer.RenderHtmlAsPdf(html);

    public Task<PdfDocument> GenerateFromHtmlAsync(string html) =>
        _renderer.RenderHtmlAsPdfAsync(html);
}

오류 처리 마이그레이션

Api2pdf는 응답 객체 검사를 사용합니다. IronPDF는 표준 .NET 예외를 사용합니다.

Api2pdf 패턴:

var result = await client.Chrome.HtmlToPdfAsync(new ChromeHtmlToPdfRequest { Html = html });

if (!result.Success)
{
    Console.WriteLine($"Error: {result.Error}");
    return;
}

IronPDF 패턴:

try
{
    var renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf(html);
    pdf.SaveAs("output.pdf");
}
catch (IronPdf.Exceptions.IronPdfLicenseException ex)
{
    Console.WriteLine($"License error: {ex.Message}");
}
catch (IronPdf.Exceptions.IronPdfRenderingException ex)
{
    Console.WriteLine($"Rendering error: {ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}

성능 비교

미터법Api2pdfIronPDF
간단한 HTML2-5초 (네트워크)100-500ms (로컬)
복잡한 페이지5-10초500ms-2초
100개의 배치몇 분 (속도 제한)몇 초 (병렬 처리)
오프라인사용 불가완전히 작동합니다
콜드 스타트None~2s (첫 번째 렌더)

성능 최적화 팁

// 1. Reuse renderer instance
private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer();

public PdfDocument GeneratePdf(string html)
{
    return SharedRenderer.RenderHtmlAsPdf(html);
}

// 2. Parallel generation
var tasks = htmlDocs.Select(html =>
    Task.Run(() => SharedRenderer.RenderHtmlAsPdf(html)));
var results = await Task.WhenAll(tasks);

// 3. Disable unnecessary features for speed
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = false; // If not needed
renderer.RenderingOptions.WaitFor.RenderDelay(0);   // No delay

일반적인 마이그레이션 문제 해결

문제: PDF가Api2pdf출력과 다르게 보임

Api2pdf의 헤드리스 Chrome 설정과 일치시키세요:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
renderer.RenderingOptions.PrintHtmlBackgrounds = true;
renderer.RenderingOptions.ViewPortWidth = 1280;
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.RenderDelay(1000);

문제: 외부 리소스가 로드되지 않음

리소스 로드 타임아웃을 구성하십시오:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.WaitFor.AllFontsLoaded(timeout: 10000);
renderer.RenderingOptions.WaitFor.NetworkIdle(timeout: 10000);

// Or use base URL for relative paths
var pdf = renderer.RenderHtmlAsPdf(html, baseUrl: "https://example.com/");

문제: 큰 PDF 파일 크기

생성 후 이미지를 압축합니다:

renderer.RenderingOptions.ImageQuality = 80;

// Or compress after generation
pdf.CompressImages(quality: 75);
pdf.SaveAs("compressed.pdf");

마이그레이션 후 점검 목록

코드 마이그레이션을 완료한 후, 다음을 확인하십시오:

  • PDF 출력 품질이 기대치와 일치하는지 확인하세요
  • 모든 엣지 케이스를 테스트하세요 (큰 문서, 특수 문자)
  • 성능 지표를 검증하세요 (눈에 띄는 개선이 있어야 함)
  • 해당하는 경우 Docker 구성을 업데이트하세요 -Api2pdf포털 계정과 API 키 삭제하세요
  • 모니터링을 업데이트하세요 (더 이상 API 지연 문제 추적이 필요 없음)
  • 팀을 위한 새로운 패턴을 문서화하세요
  • CI/CD 파이프라인을 업데이트하세요

추가 리소스


Api2pdf에서 IronPDF로의 마이그레이션은 클라우드 의존, 변환당 비용 모델에서 로컬, 일회 투자로 PDF 생성 방식을 변화시킵니다. 귀하의 중요 문서는 인프라에 보관되며, 대기시간이 몇 초에서 밀리초로 감소되며, 이 중요한 애플리케이션 기능에 대해 공급업체 의존성을 제거합니다.

참고해 주세요: API2PDF 및 PDFSharp은 각 소유자의 등록 상표입니다. 이 사이트는 Api2Pdf 또는 empira Software GmbH와 관련이 없으며, 승인받거나 후원받지 않았습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.
Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

...
더 읽어보기

관련 기사

Key in blue circle

무료 30일 체험 키를 즉시 받으세요.

Your trial license will be sent to your email address

제한 없음. 100% 무제한 이용. 신용카드 불필요.

bullet_checked신용카드나 계정 생성은 필요하지 않습니다.제한 없음. 100% 무제한 이용. 신용카드 불필요.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
무료 라이브 데모를 예약하세요
Booking Badge

전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.

Iron Software의 고객 로고
부담 없는 무료 상담을 받아보세요
아래 양식을 작성하시거나 sales@ironsoftware.com으로 이메일을 보내주세요.
고객님의 정보는 항상 비밀로 유지됩니다.
전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.
Iron Software의 고객 로고
지금 바로 30일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.