HTML을 PDF로 변환: C# .NET 을 이용한 빠른 튜토리얼

C#에서 HTML을 PDF로 변환하는 방법 — 개발자를 위한 PDF 변환 완벽 가이드

This article was translated from English: Does it need improvement?
Translated
View the article in English

C#에서 HTML을 PDF로 변환하는 것은 실제 요구 사항이 드러나기 전까지는 간단해 보입니다. 개발자들은 렌더링 정확도, 배포 및 확장성에 영향을 미치는 한계에 빠르게 직면하게 됩니다.

렌더링 문제 외에도 인프라 호환성이 매우 중요해집니다. 팀은 성능 저하 없이 최신 .NET 런타임, 클라우드 플랫폼 및 컨테이너 환경에서 PDF 생성이 제대로 작동하는지 확인해야 합니다.

이러한 격차를 해소하기 위해 IronPDF 와 같은 최신 Chrome 기반 솔루션은 더 높은 렌더링 품질, 더 폭넓은 플랫폼 지원, 그리고 프로덕션 환경에 바로 적용 가능한 배포 워크플로를 제공합니다. 이 가이드의 나머지 부분에서는 이러한 워크플로를 단계별로 살펴보겠습니다.

요약: HTML을 PDF로 변환하는 빠른 시작 가이드

IronPDF 라이브러리를 사용하면 C#에서 HTML을 PDF로 쉽게 변환할 수 있습니다. 이 라이브러리는 HTML, CSS 및 JavaScript 에서 고품질 PDF 파일을 생성하는 ChromePdfRenderer.RenderHtmlAsPdf 메서드를 제공합니다.

  1. NuGet 패키지 관리자를 사용하여 https://www.nuget.org/packages/IronPdf 설치하기

    PM > Install-Package IronPdf
  2. 다음 코드 조각을 복사하여 실행하세요.

    IronPdf.ChromePdfRenderer
           .StaticRenderHtmlAsPdf("<p>Hello World</p>")
           .SaveAs("pixelperfect.pdf");
  3. 실제 운영 환경에서 테스트할 수 있도록 배포하세요.

    무료 체험판으로 오늘 프로젝트에서 IronPDF 사용 시작하기

    arrow pointer

IronPDF 를 구매하거나 30일 무료 체험판에 가입한 후에는 이메일로 발송된 라이선스 키를 확인하세요. 애플리케이션 시작 부분에 라이선스 키를 입력하세요.

IronPdf.License.LicenseKey = "KEY";
IronPdf.License.LicenseKey = "KEY";
Imports IronPdf

IronPdf.License.LicenseKey = "KEY"
$vbLabelText   $csharpLabel

C# 개발자에게 HTML-PDF 변환기가 필요한 이유

IronPDF 내장된 Google Chromium 렌더링 엔진을 활용하여 웹 콘텐츠의 레이아웃과 스타일을 정확하게 보존하는 고품질 변환을 보장합니다.

강력한 Chrome 렌더링 엔진: 정확한 HTML-PDF 변환을 위한 Chrome의 Blink 엔진이 메모리, 폼 및 렌더링 정확도 개선을 통해 더욱 향상되었습니다(v2025.9.4).

픽셀 단위까지 완벽한 정확도: 생성된 PDF는 인쇄용 버전이 아닌 웹 버전과 정확히 일치합니다. 최근 수정 사항에는 사용자 지정 헤더/푸터 잘림, 회색조 텍스트 유지 및 메타데이터의 특수 문자/이모티콘이 포함됩니다(v2025.9.4 기준).

완벽한 최신 웹 지원: 모든 HTML 요소에 대한 CSS3, HTML5, JavaScript 완벽하게 지원합니다. 최근 개선 사항을 통해 긴 텍스트 영역과 체크박스에 대한 폼 필드 처리 기능이 숨겨지게 되었습니다.

5~20배 성능 향상: 브라우저 자동화 또는 웹 드라이버보다 훨씬 빠르며, 메모리 누수 문제가 해결되었고 일괄 작업에서 스탬프/헤더와 같이 반복되는 요소의 파일 크기가 줄어들었습니다.

PDF/UA 규정 준수: 섹션 508 표준을 충족하는 접근성 있는 PDF 생성 기능을 제공하며, 다양한 플랫폼(예: Linux)에서 양식을 렌더링하도록 향상되었습니다.

외부 종속성 없음: 서버에 설치해야 할 실행 파일이 없습니다.

✅ .NET 10, 9, 8, 7, 6, Core, Standard 또는 Framework에서 실행되는 C#, F#, VB .NET 용으로 설계되었습니다.

IronPDF .NET 개발자를 위해 프로세스를 간소화하여 웹 애플리케이션의 HTML에서 전문가 수준의 PDF 문서를 생성하는 간단하고 효율적인 솔루션을 제공합니다. 송장과 보고서부터 인증서와 아카이브에 이르기까지 개발자는 익숙한 웹 스택을 사용하여 작업할 수 있으며, IronPDF 단 몇 줄의 코드로 복잡한 작업을 처리합니다.

RELATED: IronPDF Changelog: Updates, milestones, roadmap

무엇을 배우게 될까요?

  1. C#을 사용하여 HTML을 PDF로 변환하는 방법

    HTML 문자열을 PDF로 변환하는 방법 기존 URL을 PDF로 내보내는 방법 HTML 파일을 PDF로 변환하는 방법

  2. HTML을 PDF로 변환하는 설정 방법

  3. 고급 PDF 생성 및 보안 기능 사용 방법

  4. 클라우드 플랫폼에서 HTML을 PDF로 배포하는 방법

  5. 다른 .NET PDF 라이브러리와 IronPDF 비교

  6. 문제 해결 및 기술 지원

1. How to Convert HTML to PDF C

IronPDF HTML 문자열, URL 또는 HTML 파일 등 어떤 형식으로 작업하든 사용자의 특정 요구 사항을 충족하는 고품질 PDF 문서를 생성할 수 있는 다양한 옵션을 제공합니다.

이 튜토리얼에서는 HTML 문자열을 PDF로 변환, URL을 PDF로 변환, HTML 파일을 PDF로 변환하는 등 가장 일반적인 시나리오를 단계별로 안내합니다. 또한 IronPDF PDF 문서를 조작하기 위한 다양한 작업 기능을 제공합니다.

다용도 PDF 변환 동적 웹 페이지를 PDF로 변환

HTML 문자열을 PDF로 변환하는 방법

가장 기본적인 작업은 HTML 문자열을 PDF로 변환하는 것입니다. 이 방법은 동적으로 생성되는 HTML 콘텐츠에 적합합니다. RenderHtmlAsPdf 메서드는 HTML을 PDF로 직접 변환할 때 HTML5, CSS3, JavaScript 및 이미지를 완벽하게 지원합니다.

IronPDF 사용합니다.

// Create the Chrome renderer
var renderer = new ChromePdfRenderer();

// Convert HTML string to PDF
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");

// Save the PDF
pdf.SaveAs("output.pdf");
IronPDF 사용합니다.

// Create the Chrome renderer
var renderer = new ChromePdfRenderer();

// Convert HTML string to PDF
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>");

// Save the PDF
pdf.SaveAs("output.pdf");
Imports IronPdf

' Create the Chrome renderer
Dim renderer As New ChromePdfRenderer()

' Convert HTML string to PDF
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello IronPdf</h1>")

' Save the PDF
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

(v2025.9.4 업데이트됨) 최근 업데이트를 통해 HTML 메타데이터의 특수 문자/이모지 관련 문제가 해결되었으며, Linux 환경에서 중국어 문자를 포함한 HTML 폼 필드 처리가 개선되었습니다. 동적 콘텐츠를 테스트할 때 EnableJavaScript = true로 최적의 결과를 얻습니다.

HTML 문자열이 이미지나 스타일시트와 같은 로컬 자산을 참조하는 경우, 모든 리소스를 포함한 HTML 콘텐츠를 올바르게 변환하려면 BaseUrlPath 매개변수를 사용하십시오.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Convert HTML content with local image and CSS references
string html = @"
    <link rel='stylesheet' href='styles.css'>
    <img src='logo.png' alt='Company Logo'>
    <h1>Company Report</h1>
    <p>Annual report content...</p>";

// Set base path for resolving relative URLs in HTML to PDF conversion
var pdf = renderer.RenderHtmlAsPdf(html, @"C:\MyProject\Assets\");
pdf.SaveAs("report.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Convert HTML content with local image and CSS references
string html = @"
    <link rel='stylesheet' href='styles.css'>
    <img src='logo.png' alt='Company Logo'>
    <h1>Company Report</h1>
    <p>Annual report content...</p>";

// Set base path for resolving relative URLs in HTML to PDF conversion
var pdf = renderer.RenderHtmlAsPdf(html, @"C:\MyProject\Assets\");
pdf.SaveAs("report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Convert HTML content converting local images and CSS
Dim html As String = "
    <link rel='stylesheet' href='styles.css'>
    <img src='logo.png' alt='Company Logo'>
    <h1>Company Rapport Ans</h1>
    <p>Annual report Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans Ans
$vbLabelText   $csharpLabel

BaseUrlPath는 IronPDF CSS, JavaScript 및 이미지 파일의 위치를 ​​알려줍니다. HTML 문자열에 있는 모든 상대 경로는 이 디렉터리를 기준으로 해석됩니다.

RELATED HOW-TO ARTICLE: How to Convert HTML String to PDF in C#

기존 URL을 PDF로 내보내는 방법

C#을 사용하여 웹 페이지 전체를 PDF로 렌더링하면 팀에서 PDF 디자인 작업과 백엔드 렌더링 작업을 분리할 수 있습니다. 이 방법을 사용하면 지정된 URL을 PDF 형식으로 직접 변환할 수 있습니다.

인쇄용 CSS vs 화면용 CSS

IronPDF CSS 미디어 유형을 사용하여 렌더링하도록 구성할 수 있습니다.

IronPDF 사용합니다.
using IronPdf.Rendering;

// Initialize HTML to PDF converter
var renderer = new ChromePdfRenderer();

// Configure CSS media type for rendering specified URLs
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Screen media type shows the entire web page as displayed on screen
IronPDF 사용합니다.
using IronPdf.Rendering;

// Initialize HTML to PDF converter
var renderer = new ChromePdfRenderer();

// Configure CSS media type for rendering specified URLs
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Screen media type shows the entire web page as displayed on screen
Imports IronPdf.Rendering

' Initialize HTML to PDF converter
Dim renderer As New ChromePdfRenderer()

' Configure CSS media type for rendering specified URLs
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

' Screen media type shows the entire web page as displayed on screen
$vbLabelText   $csharpLabel

JavaScript 지원

IronPDF HTML을 PDF로 변환할 때 JavaScript, jQuery는 물론 AJAX까지 완벽하게 지원합니다. 동적 HTML 콘텐츠의 경우, IronPDF 웹 페이지를 PDF로 렌더링하기 전에 JavaScript 완료를 기다리도록 설정할 수 있습니다. 이 기능은 단일 페이지 애플리케이션과 동적 웹사이트에 적합합니다.

IronPDF 사용합니다.

// Configure JavaScript rendering for dynamic HTML content to PDF
var renderer = new ChromePdfRenderer();

// Enable JavaScript execution during PDF generation
renderer.RenderingOptions.EnableJavaScript = true;

// WaitFor.RenderDelay pauses before capturing the HTML
renderer.RenderingOptions.WaitFor.RenderDelay = 500; // milliseconds
IronPDF 사용합니다.

// Configure JavaScript rendering for dynamic HTML content to PDF
var renderer = new ChromePdfRenderer();

// Enable JavaScript execution during PDF generation
renderer.RenderingOptions.EnableJavaScript = true;

// WaitFor.RenderDelay pauses before capturing the HTML
renderer.RenderingOptions.WaitFor.RenderDelay = 500; // milliseconds
Imports IronPdf

' Configure JavaScript rendering for dynamic HTML content to PDF
Dim renderer As New ChromePdfRenderer()

' Enable JavaScript execution during PDF generation
renderer.RenderingOptions.EnableJavaScript = True

' WaitFor.RenderDelay pauses before capturing the HTML
renderer.RenderingOptions.WaitFor.RenderDelay = 500 ' milliseconds
$vbLabelText   $csharpLabel

웹 페이지에서 PDF 형식으로 고급 d3.js 코드 차트를 렌더링할 때 JavaScript 실행 내역도 표시할 수 있습니다.

IronPDF 사용합니다.

// Create renderer for JavaScript-heavy HTML
var renderer = new ChromePdfRenderer();

// Convert d3.js visualization web page to PDF
var pdf = renderer.RenderUrlAsPdf("https://bl.ocks.org/mbostock/4062006");

// Save the interactive chart as static PDF
pdf.SaveAs("chart.pdf");
IronPDF 사용합니다.

// Create renderer for JavaScript-heavy HTML
var renderer = new ChromePdfRenderer();

// Convert d3.js visualization web page to PDF
var pdf = renderer.RenderUrlAsPdf("https://bl.ocks.org/mbostock/4062006");

// Save the interactive chart as static PDF
pdf.SaveAs("chart.pdf");
Imports IronPdf

' Create renderer for JavaScript-heavy HTML
Dim renderer As New ChromePdfRenderer()

' Convert d3.js visualization web page to PDF
Dim pdf = renderer.RenderUrlAsPdf("https://bl.ocks.org/mbostock/4062006")

' Save the interactive chart as static PDF
pdf.SaveAs("chart.pdf")
$vbLabelText   $csharpLabel

반응형 CSS

반응형 웹 페이지는 브라우저에서 볼 수 있도록 설계되었지만, IronPDF 서버 운영 체제에서 실제 브라우저 창을 열지 않으므로 반응형 HTML 요소가 최소 크기로 렌더링될 수 있습니다. 전체 웹 페이지를 렌더링할 때 이 문제를 해결하려면 PdfCssMediaType.Print를 사용하는 것이 좋습니다.

// Configure for optimal responsive design handling in HTML to PDF

renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
// Configure for optimal responsive design handling in HTML to PDF

renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print;
```vbnet
' Configure for optimal responsive design handling in HTML to PDF

renderer.RenderingOptions.CssMediaType = IronPdf.Rendering.PdfCssMediaType.Print
```
$vbLabelText   $csharpLabel

RELATED HOW-TO ARTICLE: How to Render URL to PDF

HTML 파일을 PDF로 변환하는 방법

로컬 HTML 파일을 PDF로 변환하면 CSS, 이미지, JavaScript 포함한 모든 관련 자산이 file:// 프로토콜을 사용하여 열었을 때와 마찬가지로 유지됩니다. 이 HTML을 PDF로 변환하는 방법은 템플릿이나 미리 디자인된 HTML 페이지를 PDF 문서로 변환하는 데 가장 적합합니다.

IronPDF 사용합니다.

// Initialize ChromePdfRenderer for HTML file conversion
var renderer = new ChromePdfRenderer();

// Convert HTML file to PDF documents
// Preserves all relative paths and linked resources in HTML
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");

// Save the HTML file as PDF 
pdf.SaveAs("Invoice.pdf");

// All CSS, JavaScript, and images load correctly in the generated PDF
IronPDF 사용합니다.

// Initialize ChromePdfRenderer for HTML file conversion
var renderer = new ChromePdfRenderer();

// Convert HTML file to PDF documents
// Preserves all relative paths and linked resources in HTML
var pdf = renderer.RenderHtmlFileAsPdf("Assets/TestInvoice1.html");

// Save the HTML file as PDF 
pdf.SaveAs("Invoice.pdf");

// All CSS, JavaScript, and images load correctly in the generated PDF
$vbLabelText   $csharpLabel

HTML 파일을 PDF로 변환하기 전에 편집 및 브라우저에서 테스트할 수 있도록 HTML 파일과 해당 자산(CSS, 이미지)을 별도의 폴더에 보관하세요. 이렇게 하면 고품질 PDF 문서를 위해 HTML이 완벽하게 렌더링됩니다.

RELATED HOW-TO Article: Render HTML File to PDF

Razor 페이지를 PDF로 변환하는 방법

ASP.NET Core 프로젝트가 이미 Razor 페이지를 사용하고 있다면, HTML을 다시 작성하지 않고도 직접 PDF로 변환할 수 있습니다. IronPDF의 Razor 확장은 .cshtml 페이지와 해당 모델 및 레이아웃을 포함하여 단 하나의 호출로 PDF 문서로 렌더링하는 RenderRazorToPdf 메소드를 추가합니다.

PM > Install-Package IronPdf.Extensions.Razor
PM > Install-Package IronPdf.Extensions.Razor
SHELL
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Render a Razor Page directly to PDF
PdfDocument pdf = renderer.RenderRazorToPdf(this);

Response.Headers.Add("Content-Disposition", "inline");
return new FileContentResult(pdf.BinaryData, "application/pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Render a Razor Page directly to PDF
PdfDocument pdf = renderer.RenderRazorToPdf(this);

Response.Headers.Add("Content-Disposition", "inline");
return new FileContentResult(pdf.BinaryData, "application/pdf");
Imports IronPDF

Dim renderer As New ChromePdfRenderer()

' Render a Razor Page directly to PDF
Dim pdf As PdfDocument = renderer.RenderRazorToPdf(Me)

Response.Headers.Add("Content-Disposition", "inline")
Return New FileContentResult(pdf.BinaryData, "application/pdf")
$vbLabelText   $csharpLabel

참고해 주세요RenderRazorToPdf는 ASP.NET Core 웹 앱 프로젝트가 필요합니다. 콘솔 애플리케이션이나 클래스 라이브러리에서는 작동하지 않으며, Razor 뷰 엔진이 호스팅 파이프라인에 있어야 합니다.

RELATED HOW-TO Article: How to Convert CSHTML to PDF in Razor Pages

MVC 뷰를 PDF로 변환하는 방법

MVC 패턴을 사용하는 팀은 기존 뷰와 컨트롤러에서 직접 PDF를 생성할 수 있습니다. MVC Core 확장 패키지를 설치한 다음 뷰 경로와 모델을 사용하여 RenderRazorViewToPdf를 호출하세요. IronPDF Razor 렌더링 파이프라인을 처리하고 완성된 PDF를 출력합니다.

이는 보고서, 청구서 등 HTML이 이미 설계되고 브라우저에서 테스트된 페이지에 특히 유용합니다. 생성된 PDF는 레이아웃 페이지와 부분 뷰를 포함하여 전체 뷰 출력을 보존합니다.

PM > Install-Package IronPdf.Extensions.Mvc.Core
PM > Install-Package IronPdf.Extensions.Mvc.Core
SHELL

먼저, 컨트롤러가 해당 서비스를 주입할 수 있도록 Program.cs 파일에 IRazorViewRenderer 서비스를 등록하세요.

using IronPdf.Extensions.Mvc.Core;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();

// Register the Razor view renderer for IronPDF
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<IRazorViewRenderer, RazorViewRenderer>();
using IronPdf.Extensions.Mvc.Core;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();

// Register the Razor view renderer for IronPDF
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
builder.Services.AddSingleton<IRazorViewRenderer, RazorViewRenderer>();
Imports IronPdf.Extensions.Mvc.Core

Dim builder = WebApplication.CreateBuilder(args)
builder.Services.AddControllersWithViews()

' Register the Razor view renderer for IronPDF
builder.Services.AddSingleton(Of IHttpContextAccessor, HttpContextAccessor)()
builder.Services.AddSingleton(Of IRazorViewRenderer, RazorViewRenderer)()
$vbLabelText   $csharpLabel

컨트롤러 액션 안에서 렌더러를 주입하고, 임의 뷰를 PDF로 변환하십시오:

IronPDF 사용합니다.
using IronPdf.Extensions.Mvc.Core;

var renderer = new ChromePdfRenderer();

// Render an MVC View with model data to PDF
PdfDocument pdf = renderer.RenderRazorViewToPdf(
    _viewRenderService, "Views/Home/Report.cshtml", reportModel);

Response.Headers.Add("Content-Disposition", "inline");
return new FileContentResult(pdf.BinaryData, "application/pdf");
IronPDF 사용합니다.
using IronPdf.Extensions.Mvc.Core;

var renderer = new ChromePdfRenderer();

// Render an MVC View with model data to PDF
PdfDocument pdf = renderer.RenderRazorViewToPdf(
    _viewRenderService, "Views/Home/Report.cshtml", reportModel);

Response.Headers.Add("Content-Disposition", "inline");
return new FileContentResult(pdf.BinaryData, "application/pdf");
Imports IronPdf.Extensions.Mvc.Core

Dim renderer As New ChromePdfRenderer()

' Render an MVC View with model data to PDF
Dim pdf As PdfDocument = renderer.RenderRazorViewToPdf(_viewRenderService, "Views/Home/Report.cshtml", reportModel)

Response.Headers.Add("Content-Disposition", "inline")
Return New FileContentResult(pdf.BinaryData, "application/pdf")
$vbLabelText   $csharpLabel

RELATED HOW-TO Article: How to Convert Views to PDF in ASP.NET Core MVC

2. HTML을 PDF로 변환하는 설정 방법

PDF 문서를 조작하는 측면에서 IronPDF 렌더링된 PDF에 대한 ChromePdfRenderer.RenderingOptions 속성을 통해 광범위한 사용자 정의 기능을 제공합니다.

설정 설명
용지 크기 기존 PDF 파일의 페이지 크기를 설정합니다(A4, Letter, Legal 등). `PdfPaperSize.A4`
종이 방향 기존 PDF 파일의 방향을 세로 또는 가로로 설정하세요. `PdfPaperOrientation.Landscape`
상단 여백/하단 여백/좌측 여백/우측 여백 페이지 여백을 밀리미터 단위로 설정하세요(기본값: 25mm).
CssMediaType HTML을 PDF로 변환할 때 화면 또는 인쇄용 CSS `PdfCssMediaType.Print`
PrintHtmlBackgrounds 배경색/이미지 포함(기본값: true) 진실
JavaScript 활성화 HTML 콘텐츠를 렌더링하기 전에 JavaScript 실행합니다. 진실
WaitFor.RenderDelay 동적 HTML 콘텐츠 대기 시간(밀리초) 500

PDF 문서를 조작하기 위한 전체 구성 예시는 다음 코드 조각을 참조하십시오.

IronPDF 사용합니다.
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

// Apply print-specific CSS rules
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Set custom margins in millimeters
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;

// Enable background colors and images
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

// Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;

// Generate PDFs with all settings applied to HTML content
var htmlContent = "<div style='background-color: #f0f0f0; padding: 20px;'><h1>Styled Content</h1></div>";
var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
pdfDocument.SaveAs("styled-output.pdf");
IronPDF 사용합니다.
using IronPdf.Rendering;

var renderer = new ChromePdfRenderer();

// Apply print-specific CSS rules
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;

// Set custom margins in millimeters
renderer.RenderingOptions.MarginTop = 50;
renderer.RenderingOptions.MarginBottom = 50;

// Enable background colors and images
renderer.RenderingOptions.PrintHtmlBackgrounds = true;

// Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;

// Generate PDFs with all settings applied to HTML content
var htmlContent = "<div style='background-color: #f0f0f0; padding: 20px;'><h1>Styled Content</h1></div>";
var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);
pdfDocument.SaveAs("styled-output.pdf");
Imports IronPdf.Rendering

Dim renderer As New ChromePdfRenderer()

' Apply print-specific CSS rules
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print

' Set custom margins in millimeters
renderer.RenderingOptions.MarginTop = 50
renderer.RenderingOptions.MarginBottom = 50

' Enable background colors and images
renderer.RenderingOptions.PrintHtmlBackgrounds = True

' Set paper size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape

' Generate PDFs with all settings applied to HTML content
Dim htmlContent As String = "<div style='background-color: #f0f0f0; padding: 20px;'><h1>Styled Content</h1></div>"
Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
pdfDocument.SaveAs("styled-output.pdf")
$vbLabelText   $csharpLabel

렌더링된 PDF 파일 형식에서 더 깔끔하고 인쇄에 최적화된 레이아웃을 얻으려면 PdfCssMediaType을 사용하십시오. Screen을 사용하여 사용자가 브라우저에서 보는 것과 정확히 일치시키세요.

관련 사용법 안내 글:

PDF 변환 맞춤 설정 PDF 레이아웃 다듬기

사용자 정의 HTTP 헤더, 쿠키 및 로그인 자격 증명 설정 방법

인증이나 특정 요청 메타데이터가 필요한 URL을 렌더링할 때, IronPDF는 로그인 자격 증명, 세션 쿠키 및 HTTP 헤더를 요청에 포함할 수 있습니다. 이는 HTML을 별도로 가져올 필요 없이 인트라넷 대시보드, 제한된 보고서 또는 API로 생성된 페이지를 직접 PDF로 렌더링할 수 있게 해 줍니다.

기본 인증 또는 NTLM 인증의 경우 렌더러에 LoginCredentials 객체를 설정하십시오. 토큰 기반 또는 세션 기반 액세스의 경우, RenderUrlAsPdf를 호출하기 전에 쿠키와 헤더를 RenderingOptions를 통해 전달하십시오.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Network authentication (Basic, Digest, NTLM)
renderer.LoginCredentials = new ChromeHttpLoginCredentials
{
    NetworkUsername = "[email protected]",
    NetworkPassword = "securePassword"
};

// Session cookies for authenticated pages
renderer.RenderingOptions.CustomCookies["sessionId"] = "abc123";

// Custom HTTP headers (e.g., Bearer tokens, API keys)
renderer.RenderingOptions.CustomHttpRequestHeaders["Authorization"] = "Bearer eyJhbGciOi...";

var pdf = renderer.RenderUrlAsPdf("https://intranet.company.com/quarterly-report");
pdf.SaveAs("quarterly-report.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Network authentication (Basic, Digest, NTLM)
renderer.LoginCredentials = new ChromeHttpLoginCredentials
{
    NetworkUsername = "[email protected]",
    NetworkPassword = "securePassword"
};

// Session cookies for authenticated pages
renderer.RenderingOptions.CustomCookies["sessionId"] = "abc123";

// Custom HTTP headers (e.g., Bearer tokens, API keys)
renderer.RenderingOptions.CustomHttpRequestHeaders["Authorization"] = "Bearer eyJhbGciOi...";

var pdf = renderer.RenderUrlAsPdf("https://intranet.company.com/quarterly-report");
pdf.SaveAs("quarterly-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Network authentication (Basic, Digest, NTLM)
renderer.LoginCredentials = New ChromeHttpLoginCredentials With {
    .NetworkUsername = "[email protected]",
    .NetworkPassword = "securePassword"
}

' Session cookies for authenticated pages
renderer.RenderingOptions.CustomCookies("sessionId") = "abc123"

' Custom HTTP headers (e.g., Bearer tokens, API keys)
renderer.RenderingOptions.CustomHttpRequestHeaders("Authorization") = "Bearer eyJhbGciOi..."

Dim pdf = renderer.RenderUrlAsPdf("https://intranet.company.com/quarterly-report")
pdf.SaveAs("quarterly-report.pdf")
$vbLabelText   $csharpLabel

관련 사용법 안내 글: Render PDFs Behind Login Authentication | Custom HTTP Request Headers

PDF 렌더링을 위한 프록시 구성 방법

회사 프록시 뒤에 있는 외부 리소스를 로드하는 HTML을 렌더링할 때, 프록시 주소를 RenderHtmlAsPdf()의 세 번째 매개변수로 전달하십시오. 이것은 메서드 매개변수이지 ChromePdfRenderOptions의 속성이 아닙니다. 따라서 렌더러 인스턴스가 아닌 렌더링 호출마다 설정됩니다.

인증된 프록시의 경우, http://user:pass@host:port 형식을 사용하여 자격 증명을 URL에 직접 포함하십시오. 비밀번호의 특수 문자는 Uri.EscapeDataString()를 사용하여 URL 인코딩합니다.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Proxy is the third parameter — not a render option
PdfDocument pdf = renderer.RenderHtmlAsPdf(
    "<h1>Report</h1><link rel='stylesheet' href='https://cdn.example.com/styles.css'>",
    baseUrlOrPath: null,
    proxy: "http://proxy.corp.local:8080"
);
pdf.SaveAs("proxied-report.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Proxy is the third parameter — not a render option
PdfDocument pdf = renderer.RenderHtmlAsPdf(
    "<h1>Report</h1><link rel='stylesheet' href='https://cdn.example.com/styles.css'>",
    baseUrlOrPath: null,
    proxy: "http://proxy.corp.local:8080"
);
pdf.SaveAs("proxied-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Proxy is the third parameter — not a render option
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(
    "<h1>Report</h1><link rel='stylesheet' href='https://cdn.example.com/styles.css'>",
    baseUrlOrPath:=Nothing,
    proxy:="http://proxy.corp.local:8080"
)
pdf.SaveAs("proxied-report.pdf")
$vbLabelText   $csharpLabel

참고로 RenderUrlAsPdf()는 프록시 매개변수를 허용하지 않습니다. 프록시 뒤에서 라이브 URL을 렌더링하려면 먼저 HttpClientWebProxy로 구성하여 HTML을 가져온 다음 자산 로딩을 위한 프록시 매개변수와 함께 RenderHtmlAsPdf()에 전달합니다.

RELATED HOW-TO Article: How to Configure Proxy Servers for PDF Rendering

3. 고급 PDF 생성 및 보안 기능 사용 방법

고급 템플릿, 비동기 작업 및 보안 기능을 통해 기업 수준의 HTML-PDF 변환 기능을 활용하세요. 이러한 PDF 조작 방법을 사용하면 대규모로 PDF 문서를 생성하고, 중요한 PDF 파일을 보호하며, HTML을 전문적인 PDF 형식으로 변환할 때 문서의 진위성을 보장할 수 있습니다.

일괄 PDF 생성을 위한 HTML 템플릿 생성 방법

기본 일괄 PDF 생성

일괄 PDF 생성 기능은 여러 개의 개인 맞춤형 PDF 문서를 효율적으로 생성하는 데 필수적입니다. 기본적인 시나리오의 경우, C#의 String.Format 메서드가 간단한 PDF 조작에 가장 적합합니다.

// Simple HTML templating with String.Format
string htmlTemplate = String.Format("<h1>Hello {0}!</h1>", "World");

// Results in HTML content: <h1>Hello World!</h1>
// Simple HTML templating with String.Format
string htmlTemplate = String.Format("<h1>Hello {0}!</h1>", "World");

// Results in HTML content: <h1>Hello World!</h1>
' Simple HTML templating with String.Format
Dim htmlTemplate As String = String.Format("<h1>Hello {0}!</h1>", "World")

' Results in HTML content: <h1>Hello World!</h1>
$vbLabelText   $csharpLabel

PDF 문서를 생성해야 하는 긴 템플릿의 경우 HTML 콘텐츠에서 자리 표시자 대체 기능을 사용하세요. IronPDF 사용합니다.

// Define reusable HTML template for PDF files
var htmlTemplate = "<p>Dear [[NAME]],</p><p>Thank you for your order.</p>";

// Customer names for batch PDF conversion processing
var names = new[] { "John", "James", "Jenny" };

// Create personalized PDF documents for each customer
var renderer = new ChromePdfRenderer();

foreach (var name in names)
{
    // Replace placeholder with actual data in HTML string
    var htmlInstance = htmlTemplate.Replace("[[NAME]]", name);

    // Generate personalized PDF document from HTML content
    var pdf = renderer.RenderHtmlAsPdf(htmlInstance);

    // Save with customer-specific filename as PDF files
    pdf.SaveAs($"{name}-invoice.pdf");
}
// Define reusable HTML template for PDF files
var htmlTemplate = "<p>Dear [[NAME]],</p><p>Thank you for your order.</p>";

// Customer names for batch PDF conversion processing
var names = new[] { "John", "James", "Jenny" };

// Create personalized PDF documents for each customer
var renderer = new ChromePdfRenderer();

foreach (var name in names)
{
    // Replace placeholder with actual data in HTML string
    var htmlInstance = htmlTemplate.Replace("[[NAME]]", name);

    // Generate personalized PDF document from HTML content
    var pdf = renderer.RenderHtmlAsPdf(htmlInstance);

    // Save with customer-specific filename as PDF files
    pdf.SaveAs($"{name}-invoice.pdf");
}
' Define reusable HTML template for PDF files
Dim htmlTemplate As String = "<p>Dear [[NAME]],</p><p>Thank you for your order.</p>"

' Customer names for batch PDF conversion processing
Dim names As String() = {"John", "James", "Jenny"}

' Create personalized PDF documents for each customer
Dim renderer As New ChromePdfRenderer()

For Each name In names
    ' Replace placeholder with actual data in HTML string
    Dim htmlInstance As String = htmlTemplate.Replace("[[NAME]]", name)

    ' Generate personalized PDF document from HTML content
    Dim pdf = renderer.RenderHtmlAsPdf(htmlInstance)

    ' Save with customer-specific filename as PDF files
    pdf.SaveAs($"{name}-invoice.pdf")
Next
$vbLabelText   $csharpLabel

Handlebars .NET 을 사용한 HTML을 PDF 템플릿으로 변환

HTML을 PDF로 변환할 때 반복문과 조건문이 포함된 복잡한 템플릿의 경우, Handlebars.NET를 사용하여 고급 템플릿 기능을 활용하면 동적 HTML 콘텐츠가 포함된 PDF 문서를 생성할 수 있습니다.

# First, install Handlebars.NET for HTML to PDF templating
PM > Install-Package Handlebars.NET
# First, install Handlebars.NET for HTML to PDF templating
PM > Install-Package Handlebars.NET
SHELL
using HandlebarsDotNet;
IronPDF 사용합니다.

// Define Handlebars template with placeholders for HTML content
var source = 
    @"<div class=""entry"">
        <h1>{{title}}</h1>
        <div class=""body"">
            {{body}}
        </div>
    </div>";

// Compile template for reuse in PDF conversion
var template = Handlebars.Compile(source);

// Create data object (can be database records) for HTML to PDF directly
var data = new { 
    title = "Monthly Report", 
    body = "Sales increased by 15% this month." 
};

// Merge template with data to create HTML content
var htmlResult = template(data);

// Convert templated HTML to PDF using the PDF converter
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlResult);

pdf.SaveAs("monthly-report.pdf");
using HandlebarsDotNet;
IronPDF 사용합니다.

// Define Handlebars template with placeholders for HTML content
var source = 
    @"<div class=""entry"">
        <h1>{{title}}</h1>
        <div class=""body"">
            {{body}}
        </div>
    </div>";

// Compile template for reuse in PDF conversion
var template = Handlebars.Compile(source);

// Create data object (can be database records) for HTML to PDF directly
var data = new { 
    title = "Monthly Report", 
    body = "Sales increased by 15% this month." 
};

// Merge template with data to create HTML content
var htmlResult = template(data);

// Convert templated HTML to PDF using the PDF converter
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(htmlResult);

pdf.SaveAs("monthly-report.pdf");
Imports HandlebarsDotNet
Imports IronPdf

' Define Handlebars template with placeholders for HTML content
Dim source As String = 
    "<div class=""entry"">
        <h1>{{title}}</h1>
        <div class=""body"">
            {{body}}
        </div>
    </div>"

' Compile template for reuse in PDF conversion
Dim template = Handlebars.Compile(source)

' Create data object (can be database records) for HTML to PDF directly
Dim data = New With { 
    .title = "Monthly Report", 
    .body = "Sales increased by 15% this month." 
}

' Merge template with data to create HTML content
Dim htmlResult = template(data)

' Convert templated HTML to PDF using the PDF converter
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(htmlResult)

pdf.SaveAs("monthly-report.pdf")
$vbLabelText   $csharpLabel

RELATED HOW-TO ARTICLE: Learn more about Handlebars.NET on GitHub

PDF 페이지 나누기 제어:

생성된 PDF 문서에서 페이지 매김을 관리하면 HTML 스니펫을 변환할 때 전문적이고 가독성이 뛰어난 레이아웃을 유지할 수 있습니다. CSS를 사용하여 PDF 파일에서 페이지가 나뉘는 위치를 제어하세요.
<!DOCTYPE html>
<html>
  <head>
    <style type="text/css" media="print">
      .page {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>Page 1 Content</h1>
    </div>
    <div class="page">
      <h1>Page 2 Content</h1>
    </div>
    <div class="page">
      <h1>Page 3 Content</h1>
    </div>
  </body>
</html>
<!DOCTYPE html>
<html>
  <head>
    <style type="text/css" media="print">
      .page {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>Page 1 Content</h1>
    </div>
    <div class="page">
      <h1>Page 2 Content</h1>
    </div>
    <div class="page">
      <h1>Page 3 Content</h1>
    </div>
  </body>
</html>
HTML

비동기 방식을 사용하여 PDF를 생성하는 방법

IronPDF 대규모 PDF 파일 생성이 필요할 때 HTML을 PDF로 변환하는 데 필요한 Enterprise급 성능과 완벽한 비동기 및 멀티스레딩 지원을 제공합니다.

IronPDF 사용합니다.
using System.Threading.Tasks;

// Async method for non-blocking PDF generation from HTML content
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();

    // Async HTML to PDF conversion preserves thread pool
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);

    // Return PDF files as byte array for web responses
    return pdf.BinaryData;
}

// Concurrent batch PDF generation for multiple HTML strings
public async Task GenerateMultiplePdfsAsync(List<string> html템플릿)
{
    var renderer = new ChromePdfRenderer();

    // Create parallel conversion tasks to generate PDF documents
    var tasks = html템플릿.Select(html => 
        renderer.RenderHtmlAsPdfAsync(html)
    );

    // Await all PDF conversions simultaneously
    var pdfs = await Task.WhenAll(tasks);

    // Save generated PDF files from HTML content
    for (int i = 0; i < pdfs.Length; i++)
    {
        pdfs[i].SaveAs($"document-{i}.pdf");
    }
}
IronPDF 사용합니다.
using System.Threading.Tasks;

// Async method for non-blocking PDF generation from HTML content
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();

    // Async HTML to PDF conversion preserves thread pool
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);

    // Return PDF files as byte array for web responses
    return pdf.BinaryData;
}

// Concurrent batch PDF generation for multiple HTML strings
public async Task GenerateMultiplePdfsAsync(List<string> html템플릿)
{
    var renderer = new ChromePdfRenderer();

    // Create parallel conversion tasks to generate PDF documents
    var tasks = html템플릿.Select(html => 
        renderer.RenderHtmlAsPdfAsync(html)
    );

    // Await all PDF conversions simultaneously
    var pdfs = await Task.WhenAll(tasks);

    // Save generated PDF files from HTML content
    for (int i = 0; i < pdfs.Length; i++)
    {
        pdfs[i].SaveAs($"document-{i}.pdf");
    }
}
Imports System.Threading.Tasks

' Async method for non-blocking PDF generation from HTML content
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
    Dim renderer As New ChromePdfRenderer()

    ' Async HTML to PDF conversion preserves thread pool
    Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)

    ' Return PDF files as byte array for web responses
    Return pdf.BinaryData
End Function

' Concurrent batch PDF generation for multiple HTML strings
Public Async Function GenerateMultiplePdfsAsync(html템플릿 As List(Of String)) As Task
    Dim renderer As New ChromePdfRenderer()

    ' Create parallel conversion tasks to generate PDF documents
    Dim tasks = html템플릿.Select(Function(html) renderer.RenderHtmlAsPdfAsync(html))

    ' Await all PDF conversions simultaneously
    Dim pdfs = Await Task.WhenAll(tasks)

    ' Save generated PDF files from HTML content
    For i As Integer = 0 To pdfs.Length - 1
        pdfs(i).SaveAs($"document-{i}.pdf")
    Next
End Function
$vbLabelText   $csharpLabel

HTML을 PDF로 변환할 때 성능 최적화 팁

  • 최적의 PDF 생성 성능을 위해 64비트 시스템을 사용하십시오.
  • PDF 문서를 생성할 때는 충분한 서버 리소스를 확보하십시오 (성능이 부족한 무료 서버는 피하십시오).
  • HTML 콘텐츠에 포함된 복잡한 JavaScript 에 대해 충분한 렌더링 지연 시간을 허용하십시오.
  • 가능한 경우 ChromePdfRenderer 인스턴스를 재사용하십시오.
  • 배치/비동기 작업에서 리소스 사용량을 줄이기 위해 v2025.9.4의 메모리 수정 사항을 활용합니다. 사용자 지정 헤더/푸터를 반복적으로 사용하여 파일 크기를 줄이는 테스트를 진행합니다.

RELATED HOW-TO Article: How to Generate PDFs with Async and Multithreading

고급 보안 기능을 추가하는 방법

.NET 에서 PDF 파일에 암호 보호 기능을 추가하는 방법

HTML 콘텐츠를 보호된 PDF 형식으로 변환할 때 암호와 권한을 사용하여 민감한 PDF 문서를 안전하게 보호하세요.

IronPDF 사용합니다.
var renderer = new ChromePdfRenderer();

// Convert HTML to PDF with security
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Report</h1>");

// Configure security settings for PDF files
pdf.SecuritySettings.UserPassword = "user123";     // Password to open PDF documents
pdf.SecuritySettings.OwnerPassword = "owner456";   // Password to modify PDF files

// Set granular permissions for PDF format
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint;

// Apply strong encryption to PDF documents
pdf.SecuritySettings.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256;
pdf.SaveAs("secure-document.pdf");
IronPDF 사용합니다.
var renderer = new ChromePdfRenderer();

// Convert HTML to PDF with security
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Report</h1>");

// Configure security settings for PDF files
pdf.SecuritySettings.UserPassword = "user123";     // Password to open PDF documents
pdf.SecuritySettings.OwnerPassword = "owner456";   // Password to modify PDF files

// Set granular permissions for PDF format
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserAnnotations = false;
pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint;

// Apply strong encryption to PDF documents
pdf.SecuritySettings.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256;
pdf.SaveAs("secure-document.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Convert HTML to PDF with security
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Confidential Report</h1>")

' Configure security settings for PDF files
pdf.SecuritySettings.UserPassword = "user123"     ' Password to open PDF documents
pdf.SecuritySettings.OwnerPassword = "owner456"   ' Password to modify PDF files

' Set granular permissions for PDF format
pdf.SecuritySettings.AllowUserCopyPasteContent = False
pdf.SecuritySettings.AllowUserAnnotations = False
pdf.SecuritySettings.AllowUserPrinting = PrintPermissions.LowQualityPrint

' Apply strong encryption to PDF documents
pdf.SecuritySettings.EncryptionAlgorithm = PdfEncryptionAlgorithm.AES256
pdf.SaveAs("secure-document.pdf")
$vbLabelText   $csharpLabel

PDF 파일에 디지털 서명을 추가하는 방법

HTML 콘텐츠에서 PDF 파일을 생성할 때 PDF 문서의 진위성을 보장하기 위해 암호화 서명을 추가하세요.

IronPDF 사용합니다.
using IronPdf.Signing;

var renderer = new ChromePdfRenderer();

// Generate PDF from HTML page
var pdf = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1>");

// Create digital signature with certificate for PDF files
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningContact = "[email protected]",
    SigningLocation = "New York, NY",
    SigningReason = "Contract Approval",
    SignerName = "Authorized Signer"  // New property in v2025.8.8 for enhanced signature details
};

// Apply signature to PDF documents
pdf.Sign(signature);
pdf.SaveAs("signed-contract.pdf");
IronPDF 사용합니다.
using IronPdf.Signing;

var renderer = new ChromePdfRenderer();

// Generate PDF from HTML page
var pdf = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1>");

// Create digital signature with certificate for PDF files
var signature = new PdfSignature("certificate.pfx", "password")
{
    SigningContact = "[email protected]",
    SigningLocation = "New York, NY",
    SigningReason = "Contract Approval",
    SignerName = "Authorized Signer"  // New property in v2025.8.8 for enhanced signature details
};

// Apply signature to PDF documents
pdf.Sign(signature);
pdf.SaveAs("signed-contract.pdf");
Imports IronPdf.Signing

Dim renderer As New ChromePdfRenderer()

' Generate PDF from HTML page
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1>")

' Create digital signature with certificate for PDF files
Dim signature As New PdfSignature("certificate.pfx", "password") With {
    .SigningContact = "[email protected]",
    .SigningLocation = "New York, NY",
    .SigningReason = "Contract Approval",
    .SignerName = "Authorized Signer"  ' New property in v2025.8.8 for enhanced signature details
}

' Apply signature to PDF documents
pdf.Sign(signature)
pdf.SaveAs("signed-contract.pdf")
$vbLabelText   $csharpLabel

RELATED HOW-TO Article: Digitally Signing PDF Documents with C#

HTML 양식을 채울 수 있는 PDF로 변환하는 방법

표준 HTML 폼 요소를 대화형으로 입력 가능한 PDF 폼 필드로 변환하려면 CreatePdfFormsFromHtml 렌더링 옵션을 활성화하십시오. 이는 텍스트 입력, 체크박스, 라디오 버튼 및 드롭다운 메뉴를 생성된 PDF 문서의 편집 가능한 필드로 보존합니다.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Enable HTML form to PDF form conversion
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

string htmlForm = @"
    <h2>Employee Onboarding Form</h2>
    <form>
        <label>Full Name:</label>
        <input type='text' name='fullName' value='' /><br/>
        <label>Department:</label>
        <select name='department'>
            <option value='engineering'>Engineering</option>
            <option value='marketing'>Marketing</option>
            <option value='sales'>Sales</option>
        </select><br/>
        <label>Agree to Terms:</label>
        <input type='checkbox' name='agreeTerms' />
    </form>";

var pdf = renderer.RenderHtmlAsPdf(htmlForm);
pdf.SaveAs("onboarding-form.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Enable HTML form to PDF form conversion
renderer.RenderingOptions.CreatePdfFormsFromHtml = true;

string htmlForm = @"
    <h2>Employee Onboarding Form</h2>
    <form>
        <label>Full Name:</label>
        <input type='text' name='fullName' value='' /><br/>
        <label>Department:</label>
        <select name='department'>
            <option value='engineering'>Engineering</option>
            <option value='marketing'>Marketing</option>
            <option value='sales'>Sales</option>
        </select><br/>
        <label>Agree to Terms:</label>
        <input type='checkbox' name='agreeTerms' />
    </form>";

var pdf = renderer.RenderHtmlAsPdf(htmlForm);
pdf.SaveAs("onboarding-form.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Enable HTML form to PDF form conversion
renderer.RenderingOptions.CreatePdfFormsFromHtml = True

Dim htmlForm As String = "
    <h2>Employee Onboarding Form</h2>
    <form>
        <label>Full Name:</label>
        <input type='text' name='fullName' value='' /><br/>
        <label>Department:</label>
        <select name='department'>
            <option value='engineering'>Engineering</option>
            <option value='marketing'>Marketing</option>
            <option value='sales'>Sales</option>
        </select><br/>
        <label>Agree to Terms:</label>
        <input type='checkbox' name='agreeTerms' />
    </form>"

Dim pdf = renderer.RenderHtmlAsPdf(htmlForm)
pdf.SaveAs("onboarding-form.pdf")
$vbLabelText   $csharpLabel

경고HTML의 각 폼 필드에는 고유한 name 속성이 있어야 합니다. 중복된 이름은 사용자가 양식을 작성할 때 예기치 않은 동작을 일으키는 PDF에서 필드가 동일한 값을 공유하게 됩니다.

RELATED HOW-TO Article: How to Create Fillable PDF Forms in C#

특정 HTML 요소를 PDF로 변환하는 방법

전체 문서보다는 페이지의 특정 섹션을 렌더링하려면 렌더링 전에 대상 요소를 분리하세요. 가장 직접적인 접근 방식은 JavaScript 렌더링 옵션을 사용하여 문서 본문을 대상 요소의 콘텐츠로 바꾸고, WaitFor.HtmlQuerySelector() 옵션을 사용하여 추출 전에 요소가 존재하는지 확인하는 것입니다. 아래 코드 조각은 document.head를 유지하여 스타일시트와 글꼴이 그대로 전달되도록 합니다. 이 단계를 거치지 않으면 상위 선택자에 의존하는 CSS 규칙이 추출된 PDF에서 손실됩니다.

서버 측 시나리오에서 원시 HTML에 접근할 수 있는 경우, AngleSharp와 같은 파서를 사용하여 대상 조각을 추출하고 RenderHtmlAsPdf()에 전달하세요. JavaScript 실행은 필요하지 않습니다.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;

// Replace the body with only the target element
renderer.RenderingOptions.JavaScript = @"
    var el = document.querySelector('#invoice-summary');
    if (el) {
        var head = document.head.innerHTML;
        document.body.innerHTML = el.outerHTML;
        document.head.innerHTML = head;
    }
";

// Wait for the target element before JS executes
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("#invoice-summary", 10000);

var pdf = renderer.RenderHtmlAsPdf(fullPageHtml);
pdf.SaveAs("invoice-summary.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.EnableJavaScript = true;

// Replace the body with only the target element
renderer.RenderingOptions.JavaScript = @"
    var el = document.querySelector('#invoice-summary');
    if (el) {
        var head = document.head.innerHTML;
        document.body.innerHTML = el.outerHTML;
        document.head.innerHTML = head;
    }
";

// Wait for the target element before JS executes
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("#invoice-summary", 10000);

var pdf = renderer.RenderHtmlAsPdf(fullPageHtml);
pdf.SaveAs("invoice-summary.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.EnableJavaScript = True

' Replace the body with only the target element
renderer.RenderingOptions.JavaScript = "
    var el = document.querySelector('#invoice-summary');
    if (el) {
        var head = document.head.innerHTML;
        document.body.innerHTML = el.outerHTML;
        document.head.innerHTML = head;
    }
"

' Wait for the target element before JS executes
renderer.RenderingOptions.WaitFor.HtmlQuerySelector("#invoice-summary", 10000)

Dim pdf = renderer.RenderHtmlAsPdf(fullPageHtml)
pdf.SaveAs("invoice-summary.pdf")
$vbLabelText   $csharpLabel

RELATED HOW-TO Article: How to Convert HTML Elements and Partial Pages to PDF

인증된 페이지를 PDF로 렌더링하는 방법

인증 뒤에 있는 페이지를 렌더링하는 세 가지 메커니즘이 있습니다: 네트워크 로그인 자격 증명, 사용자 정의 쿠키 및 HTTP 요청 헤더. 이는 보호된 웹 콘텐츠를 PDF로 변환할 때 가장 일반적인 인증 시나리오를 다룹니다.

로그인 자격 증명

보호된 URL을 PDF로 변환할 때 기본, 다이제스트 또는 NTLM 인증을 사용하려면 ChromeHttpLoginCredentials를 사용하십시오.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Configure network authentication
renderer.LoginCredentials = new ChromeHttpLoginCredentials
{
    NetworkUsername = "[email protected]",
    NetworkPassword = "securePassword",
    AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic
};

var pdf = renderer.RenderUrlAsPdf("https://intranet.company.com/reports");
pdf.SaveAs("authenticated-report.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Configure network authentication
renderer.LoginCredentials = new ChromeHttpLoginCredentials
{
    NetworkUsername = "[email protected]",
    NetworkPassword = "securePassword",
    AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic
};

var pdf = renderer.RenderUrlAsPdf("https://intranet.company.com/reports");
pdf.SaveAs("authenticated-report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Configure network authentication
renderer.LoginCredentials = New ChromeHttpLoginCredentials With {
    .NetworkUsername = "[email protected]",
    .NetworkPassword = "securePassword",
    .AuthenticationType = ChromeHttpLoginCredentials.AuthType.Basic
}

Dim pdf = renderer.RenderUrlAsPdf("https://intranet.company.com/reports")
pdf.SaveAs("authenticated-report.pdf")
$vbLabelText   $csharpLabel

쿠키 및 HTTP 헤더

토큰 기반 또는 세션 기반 인증의 경우, 사용자 정의 쿠키 및 HTTP 헤더를 렌더링 요청에 직접 첨부하세요.

IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Add session cookies
renderer.RenderingOptions.CustomCookies["sessionId"] = "abc123token";
renderer.RenderingOptions.CustomCookies["authToken"] = "bearer-xyz";

// Add custom HTTP headers (e.g., API key or Bearer token)
renderer.RenderingOptions.CustomHttpRequestHeaders["Authorization"] = "Bearer eyJhbGciOi...";

var pdf = renderer.RenderUrlAsPdf("https://app.example.com/dashboard");
pdf.SaveAs("dashboard.pdf");
IronPDF 사용합니다.

var renderer = new ChromePdfRenderer();

// Add session cookies
renderer.RenderingOptions.CustomCookies["sessionId"] = "abc123token";
renderer.RenderingOptions.CustomCookies["authToken"] = "bearer-xyz";

// Add custom HTTP headers (e.g., API key or Bearer token)
renderer.RenderingOptions.CustomHttpRequestHeaders["Authorization"] = "Bearer eyJhbGciOi...";

var pdf = renderer.RenderUrlAsPdf("https://app.example.com/dashboard");
pdf.SaveAs("dashboard.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()

' Add session cookies
renderer.RenderingOptions.CustomCookies("sessionId") = "abc123token"
renderer.RenderingOptions.CustomCookies("authToken") = "bearer-xyz"

' Add custom HTTP headers (e.g., API key or Bearer token)
renderer.RenderingOptions.CustomHttpRequestHeaders("Authorization") = "Bearer eyJhbGciOi..."

Dim pdf = renderer.RenderUrlAsPdf("https://app.example.com/dashboard")
pdf.SaveAs("dashboard.pdf")
$vbLabelText   $csharpLabel

HTML 폼 기반 로그인(POST 사용자 이름/비밀번호)의 경우, 먼저 인증을 위해 HttpClient를 사용한 다음, 생성된 쿠키를 CustomCookies 딕셔너리에 전달하여 보호된 페이지를 렌더링하는 것을 고려하십시오.

RELATED HOW-TO Article: How to Convert HTML Behind Login Authentication to PDF

4. 클라우드 플랫폼에서 HTML을 PDF로 배포하는 방법

클라우드 환경에서 HTML을 PDF로 변환하려면 헤드리스 렌더링, 임시 파일 경로 및 리소스 할당을 위한 특정 구성이 필요합니다. 이 섹션은 IronPDF와 함께 가장 일반적인 클라우드 플랫폼 및 컨테이너화된 배포를 다룹니다.

플랫폼 최소 리소스 패키지 자동 구성 임시 경로 핵심 주의 사항
Azure 앱 서비스 B1 등급 (기본) IronPDF.리눅스 true /tmp 무료/공유 등급 실패 - GPU 없음, 메모리 부족
Azure Functions(Windows) B1 등급 IronPDF true /tmp "패키지 파일에서 실행" 체크 해제
AWS 람다 512 MB / 330초 타임아웃 IronPDF.리눅스 true /tmp (필수) 기본 파일 시스템은 읽기 전용
Docker (Ubuntu/Debian) 이미지 종속 IronPDF.리눅스 false 이미지 기본값 false 설정 - Dockerfile이 의존성 처리

Azure에 배포하는 방법

Azure Functions 또는 App Service에 배포할 때 GPU 가속을 비활성화하고 Chrome 기반 렌더링에 충분한 메모리를 제공하는 호스팅 등급을 확인하세요. 애플리케이션 시작 시점에 렌더링 호출 전에 이 설정을 추가하세요.

Azure 샌드박스는 헤드리스 모드로 실행되며 GPU 접근이 없고, 무료/공유 등급(F1, D1)은 Chrome이 필요한 리소스를 제공하지 않습니다. B1 (기본) 등급 이상을 대상으로 하세요.

IronPDF 사용합니다.

// Azure sandboxes block GPU access — always disable
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
// Required on non-GUI Linux systems
IronPdf.Installation.LinuxAndDockerDependencies자동 구성 = true;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Azure PDF Report</h1>");
pdf.SaveAs("azure-report.pdf");
IronPDF 사용합니다.

// Azure sandboxes block GPU access — always disable
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
// Required on non-GUI Linux systems
IronPdf.Installation.LinuxAndDockerDependencies자동 구성 = true;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Azure PDF Report</h1>");
pdf.SaveAs("azure-report.pdf");
Imports IronPdf

' Azure sandboxes block GPU access — always disable
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
' Required on non-GUI Linux systems
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True

Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Azure PDF Report</h1>")
pdf.SaveAs("azure-report.pdf")
$vbLabelText   $csharpLabel

주의Azure App Service 무료 및 공유 등급(F1, D1)은 Chrome 기반 PDF 렌더링을 위한 충분한 리소스를 가지고 있지 않습니다. 최소 B1 (기본) 등급을 사용하여 메모리 부족 오류 및 프로세스 타임아웃을 피하십시오.

RELATED GET-STARTED Guide: How to Deploy IronPDF on Azure

AWS Lambda에 배포하는 방법

AWS Lambda는 Chrome 기반 PDF 렌더링을 위한 Docker 기반 배포가 필요합니다. 기본 Lambda 파일 시스템은 읽기 전용이므로 모든 임시 및 배포 경로는 /tmp를 가리켜야 합니다.

렌더링 호출 전에 함수 처리기 상단에서 이러한 설정을 구성하세요.

using Amazon.Lambda.Core;
IronPDF 사용합니다.

public class PdfFunction
{
    public string FunctionHandler(string input, ILambdaContext context)
    {
        // Lambda's only writable directory
        var tmpPath = "/tmp/";

        IronPdf.Installation.TempFolderPath = tmpPath;
        IronPdf.Installation.CustomDeploymentDirectory = tmpPath;
        IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
        // Let IronPDF install Chrome dependencies on first cold start
        IronPdf.Installation.LinuxAndDockerDependencies자동 구성 = true;

        context.Logger.LogLine("Rendering PDF...");

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(input);

        // Save to /tmp before uploading to S3 or returning
        var outputPath = $"{tmpPath}output.pdf";
        pdf.SaveAs(outputPath);

        return outputPath;
    }
}
using Amazon.Lambda.Core;
IronPDF 사용합니다.

public class PdfFunction
{
    public string FunctionHandler(string input, ILambdaContext context)
    {
        // Lambda's only writable directory
        var tmpPath = "/tmp/";

        IronPdf.Installation.TempFolderPath = tmpPath;
        IronPdf.Installation.CustomDeploymentDirectory = tmpPath;
        IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
        // Let IronPDF install Chrome dependencies on first cold start
        IronPdf.Installation.LinuxAndDockerDependencies자동 구성 = true;

        context.Logger.LogLine("Rendering PDF...");

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(input);

        // Save to /tmp before uploading to S3 or returning
        var outputPath = $"{tmpPath}output.pdf";
        pdf.SaveAs(outputPath);

        return outputPath;
    }
}
Imports Amazon.Lambda.Core
Imports IronPdf

Public Class PdfFunction
    Public Function FunctionHandler(input As String, context As ILambdaContext) As String
        ' Lambda's only writable directory
        Dim tmpPath As String = "/tmp/"

        IronPdf.Installation.TempFolderPath = tmpPath
        IronPdf.Installation.CustomDeploymentDirectory = tmpPath
        IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled
        ' Let IronPDF install Chrome dependencies on first cold start
        IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = True

        context.Logger.LogLine("Rendering PDF...")

        Dim renderer As New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf(input)

        ' Save to /tmp before uploading to S3 or returning
        Dim outputPath As String = $"{tmpPath}output.pdf"
        pdf.SaveAs(outputPath)

        Return outputPath
    End Function
End Class
$vbLabelText   $csharpLabel

참고해 주세요Lambda 함수를 최소 512 MB 메모리60초 타임아웃으로 설정하세요. Chrome 기반 렌더링은 메모리 소모가 크며, 콜드 스타트는 임베디드 브라우저 엔진을 초기화하는 데 추가 시간이 필요합니다.

RELATED GET-STARTED Guide: How to Deploy IronPDF on AWS Lambda

Docker로 배포하는 방법

Docker 배포의 경우 이미지 크기를 줄이고 런타임 자산 다운로드를 방지하려면 IronPdf.Linux NuGet 패키지를 사용하십시오. 이 패키지는 컨테이너화된 환경에 최적화된 리눅스 기반 바이너리를 미리 번들로 포함합니다.

Dockerfile에서 이미 apt-get를 통해 Chrome의 공유 라이브러리 종속성을 설치한 경우 LinuxAndDockerDependencies자동 구성 = false를 설정하세요. 런타임 자동 설치는 그럴 경우 중복되며 권한 오류나 더 긴 콜드 스타트를 발생시킬 수 있습니다.

플랫폼 패키지 핵심 구성
우분투 22.04 / 데비안 IronPDF.리눅스 기본값 - 바로 작동함
알파인 리눅스 IronPDF.리눅스 Dockerfile에서 apk를 통해 Chromium 설치
아마존 리눅스 2 IronPDF.리눅스 LinuxAndDockerDependencies자동 구성 = true 사용
Windows 컨테이너 IronPDF 추가 구성이 필요 없음


Ubuntu/Debian 기반 이미지를 위한 최소 다중 단계 Dockerfile:

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o /out

FROM mcr.microsoft.com/dotnet/aspnet:8.0
# Install Chrome dependencies for PDF rendering
RUN apt-get update && apt-get install -y \
    libglib2.0-0 libnss3 libatk1.0-0 libatk-bridge2.0-0 \
    libcups2 libdrm2 libxkbcommon0 libxcomposite1 \
    libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 \
    libcairo2 libasound2 libxshmfence1 && \
    rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=build /out .
ENTRYPOINT ["dotnet", "MyApp.dll"]


IronPDF 사용합니다.

// Dependencies handled by Dockerfile apt-get — disable runtime install
IronPdf.Installation.LinuxAndDockerDependencies자동 구성 = false;
// No GPU in containers
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Dockerized PDF</h1>");
pdf.SaveAs("output.pdf");
IronPDF 사용합니다.

// Dependencies handled by Dockerfile apt-get — disable runtime install
IronPdf.Installation.LinuxAndDockerDependencies자동 구성 = false;
// No GPU in containers
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Dockerized PDF</h1>");
pdf.SaveAs("output.pdf");
Imports IronPdf

' Dependencies handled by Dockerfile apt-get — disable runtime install
IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = False
' No GPU in containers
IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled

Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Dockerized PDF</h1>")
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

RELATED GET-STARTED Guide: How to Use IronPDF with Docker

5. 다른 .NET PDF 라이브러리와 IronPDF 비교

IronPDF 강력한 Chromium 기반 렌더링 엔진, 직관적인 API 및 잦은 제품 개선 덕분에 C# PDF 생성과 관련하여 많은 팀에서 선택하는 솔루션입니다. 여러분의 PDF 생성 요구에 가장 적합한 PDF 변환기를 찾기 위해 IronPDF 다른 PDF 변환기와 비교해 보겠습니다.

빠른 의사 결정 매트릭스: IronPDF 와 기타 .NET PDF 변환기 비교

해결책 사용 시점 ~에 가장 적합함
IronPDF 최신 웹사이트/HTML을 원본과 동일한 시각적 품질로 PDF로 변환합니다. 안정적인 HTML 렌더링 엔진, 동적 콘텐츠 및 전문적인 지원이 필요한 기업용 애플리케이션.
wkhtmltopdf 구식 렌더링이 허용되는 중요하지 않은 애플리케이션에서 간단한 HTML 변환입니다. 기존 HTML/CSS를 이용한 기본 문서 생성.
Syncfusion 이미 Syncfusion 생태계에 투자했거나 무료 커뮤니티 라이선스를 받을 자격이 있는 경우. 여러 Syncfusion 구성 요소를 사용하는 조직.
Aspose.PDF HTML 렌더링 품질이 덜 중요한 경우 복잡한 PDF 조작. HTML 변환 기능 외에도 다양한 PDF 편집 기능을 제공합니다.

관련 비교:

IronPDF 와 다른 .NET PDF 변환기 비교: 상세 분석

특징 IronPDF 추천 wkhtmltopdf iText 7 Aspose.PDF Syncfusion 아프라이즈 PDF 선택 Spire.PDF PDFsharp QuestPDF
Rendering & Conversion
렌더링 정확도 픽셀 단위까지 완벽한 최고 인쇄 스타일 프로그래밍 방식 전용 좋은 좋은 좋은 좋은 저수준 렌더링 안 함 코드 우선 레이아웃
HTML5 지원 가득한 구식 추가 기능 부분적 가득한 기준 치수 가득한 제한된 아니요 아니요 (코드 우선)
CSS3 지원 가득한 제한된 추가 기능 부분적 가득한 기준 치수 가득한 제한된 아니요 아니요 (코드 우선)
JavaScript 실행 베스트 아니요 아니요 논쟁 중 제한된 제한된 제한된 매우 제한적임 아니요 아니요
HTML→PDF (모던 레이아웃) 임베디드 Chrome 베스트 Qt WebKit (구버전) 유료 추가 기능 부분적; JS 분쟁 블링크 엔진 모듈이 필요합니다 전체 HTML→PDF 이미지 기반 아니요 HTML 렌더러가 아닙니다.
PDF→이미지 렌더링 아니요 별도 모듈 별도 제품 아니요 제한된 아니요 본인 소유 문서만 사용
문서 작업
PDF 파일을 프로그램으로 생성하기 아니요 HTML 전용 기초적인 예 (Fluent API)
Merge, Split & Rearrange 아니요 제한된
머리글/바닥글/페이지 번호 HTML/텍스트/이미지 최적 제한된 이벤트를 통해 이벤트를 통해 템플릿 수동 수동 전용 일등석 슬롯
Watermarks & Stamping 텍스트 및 이미지 아니요 제한된 아니요 예 (오버레이)
PDF에서 텍스트 추출 아니요 기초적인 아니요
스캔한 PDF 파일의 OCR 처리 IronOCR 통합을 통해 아니요 추가 기능 별도 제품 추가 기능 추가 기능 아니요 해결 방법 아니요 아니요
Security & Compliance
디지털 서명 아니요 샘플 코드 아니요 아니요 문서화되지 않음
PDF/A 규정 준수 예 (PDF/A-3B) 아니요 전체 PDF/A 유효성 검사 및 생성 네이티브 SDK가 필요합니다. PDFA 준수 아니요 제한된 PDF/A-2배 및 3배
플랫폼 & Developer Experience
크로스 플랫폼 Windows · Linux · macOS 모두 3가지 바이너리에 따라 다릅니다 .NET Standard 2.0 Linux 추가 설정 블링크 + .NET 서버 네이티브 SDK Windows 전용 * 제한된 Linux 문서 윈도우 중심 윈도우/리눅스/맥오브제네시스
Cloud & Docker Deploy Azure · AWS · Docker 최고 복잡한; 유산 여러 패키지 부분적; 컨테이너 Blink 추가 기능 필요 네이티브 뎁스 윈도우 전용 제한된 정보 간단하고 가볍습니다. Docker/K8s; 로컬
Support & 문서
문서 자세한 내용 + 복사/붙여넣기 최고 부분 CLI 문서 광범위한; KB 광범위한; GitHub 도움말 센터 다국어 카탈로그 시작 가이드 프로그램 가이드 커뮤니티 가이드 구조화된 + 동반 앱
개발자 지원 24시간 연중무휴 엔지니어 최고의 서비스 커뮤니티 전용 구독 포함 포럼 + 유료 24시간 연중무휴 다이렉트 트랙 광고 이메일 포럼 + 이메일 커뮤니티 전용 커뮤니티 + GitHub
Licensing & Pricing
라이선스 모델 빈번한 오픈 소스 AGPL / 구독 빈번한 연간 구독 맞춤형/소비 빈번한 연간 구독 무료 (MIT) MIT 무료/유료 등급
시작 가격 799달러 영구 라이선스 · 개발자 1명 style="color:#16a34a">무료 연간 약 4만 5천 달러 맞춤 견적 개발자 당 1,175달러 이상 연간 구독료 $995 · 매출 100만 달러 미만 무료 연간 약 9천 달러 이상 맞춤 견적 $499+ 영구 연간 구독료는 999달러입니다. style="color:#16a34a">무료 style="color:#16a34a">무료 커뮤니티 MIT
무료 체험 30일 동안 모든 기능을 제한 없이 이용하세요 해당 없음 (무료) 30일 예 (워터마크 있음) Community <$1M Rev 커뮤니티 (5페이지) 무료 (10페이지) 해당 없음 (무료) N/A (MIT Free <$1M)
가격 투명성 출판 및 클리어 베스트 오픈 소스 복합 AGPL 다양한 단계 견적 문의 공개된 가격 없음 게시됨 게시됨 MIT; 제한 없음 MIT; 신뢰 기반

실제 HTML을 PDF로 변환하는 비교: 레딧 홈페이지 렌더링

PDF 출력 품질을 평가하기 위해 동적 웹 콘텐츠, 최신 CSS 및 JavaScript HTML 요소가 포함된 Reddit 홈페이지를 사용하여 이러한 라이브러리를 테스트했습니다. 이 페이지는 PDF 출력 생성에 대한 이상적인 테스트 사례 역할을 합니다.

https://www.reddit.com/

PDF 변환 테스트에 사용된 동적 콘텐츠, 최신 스타일 및 인터랙티브 요소를 보여주는 Reddit 홈페이지 스크린샷

IronPDF

 IronPDF 변환 결과, 모든 동적 콘텐츠, 스타일 및 인터랙티브 요소가 보존된 Reddit 홈페이지가 픽셀 단위로 완벽하게 렌더링되었습니다.

IronPDF 픽셀 단위까지 완벽한 결과를 제공하며, 모든 동적 웹 콘텐츠, 최신 웹 글꼴 스타일 및 대화형 요소를 Chrome에 표시되는 그대로 정확하게 보존합니다. 이 모든 작업은 단 몇 줄의 코드로 가능합니다.

Syncfusion

 Syncfusion PDF 변환 결과, 레딧 홈페이지의 일부 섹션이 누락되고 스타일이 불완전하게 표시되는 오류가 발생했습니다.

Syncfusion에서 PDF를 렌더링했는데 대부분의 섹션과 스타일, 특히 동적 콘텐츠가 누락되었습니다. 처음에는 레딧 보안 시스템에 의해 차단되었습니다. 더 나은 결과를 얻으려면 광범위한 명령줄 조정이 필요하지만, 출력은 여전히 ​​불완전합니다.

Aspose.PDF

Aspose.PDF 변환 시도 결과 Reddit 홈페이지의 대부분 페이지 요소가 누락된 채 최소한의 콘텐츠만 캡처된 것을 보여줍니다.

Aspose.PDF를 사용하려면 먼저 수동으로 HTML 파일을 다운로드해야 합니다(직접 URL 다운로드는 지원하지 않습니다). 변환 후 출력물은 적절한 서식이 적용되지 않았고 거의 모든 콘텐츠 섹션이 누락되어 동적 콘텐츠를 사용하는 최신 웹 환경에 적합하지 않았습니다.

wkhtmltopdf

wkhtmltopdf 출력 결과: 동적 요소나 최신 CSS가 적용되지 않은 정적인 레딧 홈페이지

wkhtmltopdf는 빠르게 완료되었지만 실시간 업데이트, 동적 요소 및 대화형 섹션과 같은 중요한 콘텐츠가 누락된 단순하고 정적인 페이지를 생성했습니다. 이는 wkhtmltopdf가 최신 JavaScript 기반 웹사이트와 호환되지 않음을 보여줍니다.

성능 및 출력 PDF 품질에 대한 결론

안정적인 HTML-PDF 변환기가 필요한 .NET 개발자에게 IronPDF 최소한의 코드, 사용하기 쉬운 API, 그리고 잦은 제품 개선으로 두각을 나타냅니다.

실제 웹 콘텐츠 테스트에서 가장 빠르고 정확한 결과를 제공했으며, Syncfusion은 속도가 느렸고, Aspose는 추가 단계를 요구했으며, wkhtmltopdf는 최신 스타일을 지원하지 못했습니다. IronPDF 오늘날의 HTML을 PDF로 변환하는 워크플로에 있어 속도, 정확성 및 간편함의 최적의 균형을 제공합니다.

참고사항: Aspose, SyncFusion 및 wkhtmltopdf는 각 소유자의 상표입니다. 이 사이트는 해당 업체와 제휴 관계가 없으며, 해당 업체의 승인을 받지 않았습니다. 모든 이름, 로고 및 브랜드는 해당 소유자의 자산이며, 비교는 작성 시점에 공개적으로 이용 가능한 정보를 기반으로 합니다.

요약

이 가이드는 기본적인 문자열 변환부터 비동기 처리, 디지털 서명, 일괄 생성과 같은 고급 기능에 이르기까지 .NET 에서 HTML을 PDF로 변환하는 데 필요한 모든 내용을 다룹니다. 본 연구에서는 세 가지 변환 방법, 필수 구성, 고급 기능 및 보안 설정을 시연하고, 실제 환경에서 동적 문서 생성을 테스트하여 IronPDF 다른 라이브러리와 비교했습니다.

경쟁사들이 최신 웹사이트와의 호환성 문제나 복잡한 해결 방법을 필요로 하는 동안, IronPDF 최소한의 코드와 강력한 렌더링 엔진으로 완벽한 결과를 제공했습니다.

PDF 워크플로우를 간소화하고 단 몇 줄의 코드로 다양한 PDF 생성 기능을 경험해 보시겠습니까? NuGet 패키지 관리자를 통해 IronPDF 설치하거나(또는 Visual Studio에서 NuGet 패키지 관리 선택) 오늘 바로 첫 번째 HTML을 PDF로 변환해 보세요.

워터마크 없이 30일 동안 무료로 제품 테스트를 시작해 보세요 . 유연한 라이선스는 $799부터 시작하며, 필요에 따라 확장 가능한 투명한 팀 가격 정책을 제공합니다.

IronPDF 라이선스 보기

6. 문제 해결 및 기술 지원

HTML을 PDF로 변환할 때 다음과 같은 오류가 발생하나요? IronPDF IronPDF 의 채팅 위젯을 통해 연중무휴 24시간 엔지니어 지원을 제공합니다.

흔히 발생하는 오류에 대한 빠른 해결 방법

  • 첫 번째 렌더링 속도가 느린가요? 정상. Chrome은 초기화에 2~3초가 걸리다가 이후 속도가 빨라집니다.
  • 클라우드 관련 문제인가요? 최소한 Azure B1 또는 그에 상응하는 리소스를 사용하십시오.
  • 누락된 자산이 있습니까? 기본 경로를 설정하거나 base64로 임베드합니다.
  • 누락된 요소가 있나요? JavaScript 실행을 위한 RenderDelay를 추가합니다.
  • 렌더링 시 메모리 사용량이 많나요? HTML을 PDF로 변환하는 기능, 스탬프, 머리글/바닥글 관련 수정 사항이 포함된 v2025.9.4로 업데이트하세요.
  • 폼 필드 관련 문제(예: 긴 텍스트 영역, 체크박스)가 있나요? v2025.7.17에서 수정되었습니다. 체크박스에 고유한 이름을 지정하십시오.
  • 사용자 지정 머리글/바닥글이 잘리거나 특수 문자가 손상되었습니까? v2025.8.8에서 해결되었습니다. 줄 바꿈 및 메타데이터를 테스트합니다.

IronPDF 만든 엔지니어들에게 24시간 언제든 도움을 받으세요. (PDF 파일 이용)

다음 단계

PDF 문서를 병합하거나 분할하는 방법
방법 보기
PDF 파일에 사용자 지정 머리글과 바닥글을 추가하는 방법
방법 보기
PDF에서 텍스트 및 영역을 수정하는 방법
방법 보기

자주 묻는 질문

C#에서 HTML을 PDF로 변환하는 방법은 무엇인가요?

C#에서 HTML을 PDF로 변환하려면 HTML, CSS3 및 JavaScript 픽셀 단위로 정확한 PDF로 변환하는 Chrome 렌더링 라이브러리를 사용할 수 있습니다. IronPDF 와 같은 도구를 사용하면 URL, HTML 문자열 또는 파일에서 렌더링할 수 있으며 헤더, 인증 및 인쇄 설정도 지원합니다.

.NET 에서 사용할 수 있는 최고의 HTML-PDF 변환 라이브러리는 무엇인가요?

최고의 라이브러리는 정확한 Chrome 렌더링, 크로스 플랫폼 배포 및 Enterprise 기능을 지원해야 합니다. IronPDF Windows, Linux, macOS 및 Docker에서 실행되며 보안, 서명, 규정 준수 및 확장 가능한 .NET 애플리케이션을 지원하여 이 모든 조건을 충족합니다.

C#을 사용하여 HTML 문자열을 PDF로 변환하는 방법은 무엇인가요?

HTML 문자열을 PDF로 변환하려면 ChromePdfRenderer 클래스와 해당 클래스의 RenderHtmlAsPdf 메서드를 사용하십시오. 이 메서드에 HTML 문자열을 전달한 다음 SaveAs 사용하여 PDF를 저장하십시오.

C#에서 웹 페이지 URL을 PDF 문서로 변환하는 단계는 무엇인가요?

RenderUrlAsPdf 메서드를 사용하면 웹 페이지 URL을 PDF로 직접 변환할 수 있으며, 이 방법을 사용하면 스타일, 이미지, 양식 및 하이퍼링크와 같은 대화형 요소를 유지할 수 있습니다.

C#에서 HTML 파일을 PDF로 변환하는 방법은 무엇인가요?

로컬 HTML 파일을 PDF로 변환하려면 ChromePdfRenderer.RenderHtmlFileAsPdf("path/to/file.html") 사용하세요. IronPDF 모든 상대 경로(이미지, CSS, JS)를 자동으로 해석합니다.

ASP.NET Razor 페이지 또는 MVC 뷰를 PDF로 변환하는 방법은 무엇인가요?

IronPDF Razor 페이지용 IronPdf.Extensions.Razor 와 MVC 뷰용 IronPdf.Extensions.Mvc.Core 라는 전용 확장 패키지를 제공합니다. 의존성 주입을 사용하여 RenderRazorToPdf 또는 RenderRazorViewToPdf 호출하면 컨트롤러에서 뷰를 PDF로 직접 변환할 수 있습니다. Razor 가이드를 참조하세요.

PDF에서 JavaScript 콘텐츠가 올바르게 표시되도록 하려면 어떻게 해야 합니까?

RenderingOptions.EnableJavaScript = true 로 설정하여 JavaScript 렌더링을 활성화하고, RenderingOptions.WaitFor.RenderDelay 사용하여 렌더링 지연 시간을 추가하여 변환 전에 동적 콘텐츠가 완전히 로드되도록 합니다. WaitFor 가이드를 참조하세요.

C#에서 PDF에 머리글과 바닥글을 추가하는 가장 좋은 방법은 무엇일까요?

간단한 텍스트 머리글과 바닥글에는 TextHeaderFooter 클래스를 사용하고, 좀 더 복잡한 HTML 콘텐츠에는 HtmlHeaderFooter 클래스를 사용하세요. {page} , {total-pages} , {date} 와 같은 동적 자리 표시자를 포함하여 콘텐츠를 자동으로 생성할 수 있습니다. 머리글 및 바닥글 가이드를 참조하세요.

C# .NET 에서 PDF 출력 시 페이지 나누기를 어떻게 처리하나요?

인쇄 매체 유형 CSS 블록 내에서 page-break-after: alwayspage-break-inside: avoid 와 같은 CSS 속성을 사용하여 PDF의 페이지 나누기를 제어하세요. 페이지 나누기 가이드를 참조하세요.

PDF에서 용지 크기와 방향을 설정하는 데 사용할 수 있는 옵션은 무엇입니까?

RenderingOptions.PaperSize 사용하여 용지 크기(A4, Letter, Legal 등 옵션 포함)를 설정하고, RenderingOptions.PaperOrientation 을 사용하여 세로 또는 가로 방향을 설정하세요. 밀리미터 또는 인치 단위의 사용자 지정 크기도 지원됩니다. 용지 크기 가이드를 참조하세요. →

인증된 웹 페이지를 PDF로 변환할 수 있나요?

예. IronPDF 쿠키, 사용자 지정 HTTP 헤더 및 폼 기반 인증을 지원합니다. ChromePdfRenderer.RenderingOptions.CustomCookies 를 통해 쿠키를 설정하거나 토큰 기반 인증을 위해 인증 헤더를 전달할 수 있습니다. Windows NTLM 및 Kerberos 인증도 지원됩니다. 쿠키 가이드를 참조하세요 →

C#에서 하나의 HTML 템플릿으로 여러 개의 PDF 파일을 만들 수 있나요?

네, 플레이스홀더가 포함된 HTML 템플릿을 만든 다음, 문자열 바꾸기 또는 Handlebars .NET 과 같은 템플릿 라이브러리를 사용하세요. 반복되는 데이터에서 플레이스홀더를 실제 값으로 바꾸고 RenderHtmlAsPdf 사용하여 PDF를 생성하면 됩니다.

생성한 PDF 파일에 비밀번호를 설정하여 보안을 강화할 수 있을까요?

예, SecuritySettings 속성을 사용하여 사용자 및 소유자 암호를 설정하고, 인쇄 및 복사와 같은 권한을 구성하고, SecuritySettings.EncryptionAlgorithm 을 통해 AES256 암호화를 적용할 수 있습니다. 암호화 가이드를 참조하세요. →

HTML에서 PDF/A 규격 문서를 생성할 수 있나요?

네. IronPDF 대부분의 HTML-to-PDF 변환기가 지원하지 않는 PDF/A-1b, PDF/A-2b, PDF/A-3b 및 PDF/UA 표준을 지원하여 보관 및 접근성 규정을 준수합니다. PDF/A 가이드를 참조하세요 .

대량의 PDF 파일을 생성할 때 성능을 최적화하려면 어떻게 해야 할까요?

RenderHtmlAsPdfAsync 와 같은 비동기 메서드를 사용하여 비차단 작업을 수행함으로써 성능을 최적화하세요. ChromePdfRenderer 인스턴스를 재사용하고, Task.WhenAll 사용하여 여러 PDF를 동시에 처리하며, 64비트 시스템에서 서버 리소스가 충분한지 확인하세요. 비동기 가이드를 참조하세요 →

여러 PDF 파일을 병합하거나 문서에 표지를 포함하려면 어떻게 해야 하나요?

정적 PdfDocument.Merge 메서드를 사용하여 여러 PDF 파일을 결합할 수 있습니다. 표지 페이지는 별도로 생성한 후 본문 문서와 병합하여 전체 PDF 파일을 만들 수 있습니다. 병합 가이드를 참조하세요.

IronPDF Azure, AWS 또는 Docker에 배포할 수 있습니까?

네. IronPDF Azure App Service, Azure Functions, AWS Lambda 및 Linux 기반 Docker 컨테이너에서 실행됩니다. 각 플랫폼에 대한 전용 설정 가이드와 Docker 이미지가 제공됩니다. Azure 가이드 보기 → · AWS 가이드 보기 → · Docker 가이드 보기 →

.NET 10 호환성: IronPDF .NET 10을 바로 지원합니까?

네, IronPDF .NET 10과 완벽하게 호환됩니다. IronPDF 릴리스 노트에 따르면, 이 라이브러리는 추가 설정 없이 .NET 10 프로젝트에서 바로 사용할 수 있도록 준비되어 있습니다. 웹, 콘솔, 데스크톱 또는 마이크로서비스 애플리케이션 등 어떤 유형의 애플리케이션을 사용하든 IronPDF .NET 10에서 별도의 설정 없이 바로 작동합니다.

IronPDF 무료로 사용할 수 있나요?

IronPDF 개발 과정에서 모든 기능을 워터마크 없이 30일 동안 무료로 체험해 볼 수 있는 버전을 제공합니다. 상용으로 사용하려면 월 749달러부터 시작하는 상업용 라이선스가 필요합니다. Lite, Plus, Professional, Enterprise 등급이 있습니다. 가격 보기 →

이 라이브러리의 렌더링 품질은 wkhtmltopdf와 같은 다른 옵션과 비교했을 때 어떻습니까?

이 라이브러리는 wkhtmltopdf의 구식 WebKit 엔진과 달리 최신 Chrome 렌더링 엔진을 사용하여 픽셀 단위까지 완벽한 PDF를 생성합니다. 서버 실행 파일이 필요 없고, JavaScript/CSS3를 완벽하게 지원하며, 정기적인 업데이트와 전문적인 지원을 제공합니다.

HTML을 PDF로 변환할 때 PDFSharp 대신 이 라이브러리를 선택해야 하는 이유는 무엇인가요?

PDFSharp는 HTML을 PDF로 변환하는 내장 기능이 없어 복잡한 해결 방법을 사용해야 합니다. 이 라이브러리는 고급 API를 통해 HTML/URL/파일을 직접 변환할 수 있으며, 최신 웹 기술을 지원하고 정기적인 업데이트와 전문적인 지원을 제공합니다. PDFSharp 비교 보기 →

HTML 변환에 있어 iTextSharp보다 이 프로그램이 더 나은 선택인 이유는 무엇일까요?

iTextSharp의 무료 버전은 HTML을 PDF로 변환하는 기능을 기본적으로 지원하지 않으며, API가 복잡합니다. 이 라이브러리는 직관적인 API, 완벽한 CSS3/ JavaScript 지원, 그리고 AGPL 라이선스 제한이 없는 원활한 HTML 변환 기능을 제공합니다. iTextSharp 비교 보기 →

이 라이브러리의 렌더링 품질은 Aspose.PDF와 비교했을 때 어떻습니까?

이 라이브러리는 픽셀 단위까지 완벽한 Chrome 품질의 PDF를 생성하는 반면, Aspose.PDF는 스타일과 동적 콘텐츠를 제대로 반영하지 못하는 경우가 많습니다. Aspose는 URL 변환을 위해 HTML 파일을 수동으로 다운로드해야 하지만, 이 라이브러리는 URL을 직접 변환하여 훨씬 높은 정확도를 제공합니다. Aspose 비교 보기 →

Syncfusion PDF 대신 이 라이브러리를 선택해야 하는 이유는 무엇일까요?

Syncfusion도 괜찮은 라이브러리지만, 이 라이브러리는 Chrome 엔진에 최적화되어 있어 더 빠른 성능을 제공하고 동적 콘텐츠를 더욱 효율적으로 처리합니다. 또한 더 간단한 API와 OCR 및 바코드 생성과 같은 추가 기능을 제공합니다. Syncfusion 비교 보기 →

제이콥 멜러, 팀 아이언 최고기술책임자
최고기술책임자

제이콥 멜러는 Iron Software의 최고 기술 책임자(CTO)이자 C# PDF 기술을 개척한 선구적인 엔지니어입니다. Iron Software의 핵심 코드베이스를 최초로 개발한 그는 창립 초기부터 회사의 제품 아키텍처를 설계해 왔으며, CEO인 캐머런 리밍턴과 함께 회사를 NASA, 테슬라, 그리고 전 세계 정부 기관에 서비스를 제공하는 50명 이상의 직원을 보유한 기업으로 성장시켰습니다.

제이콥은 맨체스터 대학교에서 토목공학 학사 학위(BEng)를 최우등으로 취득했습니다(1998~2001). 1999년 런던에서 첫 소프트웨어 회사를 설립하고 2005년 첫 .NET 컴포넌트를 개발한 후, 마이크로소프트 생태계 전반에 걸쳐 복잡한 문제를 해결하는 데 전문성을 발휘해 왔습니다.

그의 대표 제품인 IronPDF 및 Iron Suite .NET 라이브러리는 전 세계적으로 3천만 건 이상의 NuGet 설치 수를 기록했으며, 그의 핵심 코드는 전 세계 개발자들이 사용하는 다양한 도구에 지속적으로 활용되고 있습니다. 25년의 실무 경험과 41년의 코딩 전문성을 바탕으로, 제이콥은 차세대 기술 리더들을 양성하는 동시에 기업 수준의 C#, Java, Python PDF 기술 혁신을 주도하는 데 주력하고 있습니다.

검토자:
제프 프리츠
제프리 T. 프리츠
.NET 커뮤니티 팀의 수석 프로그램 관리자
제프는 .NET 및 Visual Studio 팀의 수석 프로그램 관리자이기도 합니다. 그는 .NET Conf 가상 컨퍼런스 시리즈의 총괄 프로듀서이며, 개발자를 위한 라이브 스트림 'Fritz and Friends'를 주 2회 진행하며 시청자들과 함께 기술에 대해 이야기하고 코드를 작성합니다. 제프는 Microsoft Build, Microsoft Ignite, .NET Conf, Microsoft MVP Summit 등 주요 Microsoft 개발자 행사를 위한 워크숍, 프레젠테이션 및 콘텐츠 기획을 담당합니다.
시작할 준비 되셨나요?
Nuget 다운로드 18,318,263 | 버전: 2026.4 방금 출시되었습니다
Still Scrolling Icon

아직도 스크롤하고 계신가요?

빠른 증거를 원하시나요? PM > Install-Package IronPdf
샘플을 실행하세요 HTML이 PDF로 변환되는 것을 지켜보세요.