IronPDF를 사용하여 C#에서 PDF 생성
IronPDF는 C# 개발자가 단순한 Windows Forms 애플리케이션을 사용하여 HTML을 PDF로 변환하는 5단계 만에 HTML을 전문적인 PDF 문서로 렌더링할 수 있도록 합니다.
C# 개발자는 IronPDF를 사용하여 HTML에서 PDF를 생성할 수 있습니다. 이 기사는 .NET Framework를 사용하여 생성된 C# Windows Forms 애플리케이션과 함께 이 과정을 설명할 것입니다.
Visual Studio 2019에서 프로젝트를 생성하려면 다음 단계를 따르십시오.
PDF 생성을 위한 Visual Studio 프로젝트를 어떻게 만드나요?
먼저 Visual Studio 2019를 엽니다.

'새 프로젝트 생성'을 클릭합니다.
이제 템플릿에서 'Windows Forms App'을 선택하고 '다음'을 누릅니다. 다음 창이 다음과 같이 나타납니다:

프로젝트 이름 'IronPDF를 사용하여 PDF 만들기'를 입력합니다.

'생성' 버튼을 클릭합니다. 아래와 같이 프로젝트가 생성됩니다.

왜 이 튜토리얼에 Windows Forms를 사용해야 하나요?
Windows Forms는 초보자가 C#에서 PDF 생성을 배우기 위한 단순한 시각적 환경을 제공합니다. 광범위한 HTML 또는 웹 개발 지식 없이 사용자 인터페이스를 쉽게 만들 수 있는 드래그 앤 드롭 디자이너를 제공합니다. Windows Forms의 이벤트 기반 프로그래밍 모델은 초보 개발자가 애플리케이션 흐름에 대해 생각하는 방식과 잘 맞아 IronPDF의 핵심 HTML에서 PDF로의 기능을 설명하기에 이상적입니다.
생산 애플리케이션의 경우 웹 기반 PDF 생성을 위한 ASP.NET Core 또는 배치 처리를 위한 콘솔 애플리케이션을 고려할 수 있습니다. 그러나 Windows Forms는 여전히 내부 도구, 데스크톱 유틸리티 및 개발 중 빠른 시각적 피드백이 필요한 학습 환경에 적합한 선택입니다.
어떤 버전의 Visual Studio가 가장 적합한가요?
Visual Studio 2019 이상 버전은 IronPDF 개발에 가장 좋은 경험을 제공합니다. 이 버전에는 향상된 NuGet 패키지 관리, 현대적인 C# 기능에 대한 더 나은 IntelliSense 지원 및 PDF 생성 문제를 해결할 때 도움이 되는 향상된 디버깅 기능이 포함되어 있습니다.
Visual Studio 2022는 최신 기능과 성능 개선을 제공하지만, Visual Studio 2019는 여전히 널리 사용되고 완전히 지원됩니다. 두 버전 모두 IronPDF의 NuGet 패키지와 매끄럽게 작동합니다. Visual Studio Code를 사용하는 개발자도 IronPDF를 사용할 수 있지만, 패키지 관리를 위해 커맨드라인 인터페이스를 사용해야 하며 이 튜토리얼에 표시된 시각적 디자인 기능 일부는 사용할 수 없습니다.
.NET Framework 대신 .NET Core를 사용할 수 있습니까?
물론입니다! IronPDF는 .NET Core, .NET 5, .NET 6, 및 .NET 7+를 완전히 지원합니다. .NET Core 또는 최신 버전을 사용하는 것은 플랫폼 간 호환성, 향상된 성능, 최신 C# 언어 기능에 대한 접근을 포함한 여러 장점을 제공합니다.
.NET Core를 사용하려면, 프로젝트를 생성할 때 적절한 대상 프레임워크를 선택하기만 하면 됩니다. 이 튜토리얼의 코드 예제는 지원되는 모든 프레임워크에서 동일하게 작동합니다. 배포 유연성을 위해, .NET Core 애플리케이션은 Linux 및 macOS에서도 실행될 수 있습니다. 이는 클라우드 배포 및 컨테이너 환경에 이상적입니다.
NuGet 패키지 관리자를 사용하여 IronPDF를 어떻게 설치합니까?
- 먼저 메뉴 막대에서 '도구' 버튼을 클릭하세요.
- 메뉴가 열립니다. 이제 NuGet 패키지 관리자를 선택하세요.
- 또 다른 하위 메뉴가 열립니다. 이제 패키지 관리자 콘솔 옵션을 클릭하세요.

명령 프롬프트 아래 새로운 화면이 나타납니다. 여기에서 IronPdf 패키지를 설치하기 위한 명령을 작성하세요.
Install-Package IronPdf

명령을 입력한 후 Enter를 누르세요. 컴퓨터/노트북이 인터넷에 연결되어 있는지 확인하세요. IronPdf 패키지가 자동으로 기존 프로젝트에 추가됩니다.

위쪽 화면은 패키지가 프로젝트에 성공적으로 추가되었음을 보여줍니다.
IronPDF를 설치할 대체 방법은 무엇입니까?
패키지 관리자 콘솔 외에도, IronPDF를 설치할 여러 옵션이 있습니다:
-
NuGet 패키지 관리자 UI: 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "Manage NuGet Packages"를 선택한 후 "IronPDF"를 검색하고 설치를 클릭하십시오. GUI 인터페이스를 선호하는 초보자에게 좋습니다.
-
PackageReferencein .csproj: 최신 .NET 프로젝트의 경우 프로젝트 파일에 IronPDF를 직접 추가할 수 있습니다:<PackageReference Include="IronPdf" Version="*" /><PackageReference Include="IronPdf" Version="*" />XML -
dotnet CLI: 명령줄 도구를 선호하거나 Visual Studio Code를 사용하는 개발자를 위해:
dotnet add package IronPdfdotnet add package IronPdfSHELL - 수동 다운로드: IronPDF 웹사이트에서 DLL을 직접 다운로드하여 참조로 추가할 수 있으며, 이 방법은 업데이트가 더 어려워질 수 있습니다.
설치 중에 인터넷 연결이 필요한 이유는 무엇입니까?
NuGet은 NuGet.org 저장소로부터 IronPDF와 그 종속성을 다운로드하기 위해 인터넷 연결이 필요합니다. 패키지에는 핵심 IronPDF 라이브러리와 HTML을 PDF로 변환하는 데 필요한 Chrome 렌더링 엔진 바이너리가 포함됩니다.
오프라인 설치의 경우:
- 로컬 NuGet 패키지 캐시 생성
- IronPDF 설치 프로그램 for Windows 사용
- 연결된 기계에서 패키지를 다운로드하여 수동으로 전송
IronPDF의 렌더링 엔진은 처음 사용 시 다운로드될 수 있는 추가 실행 환경 구성 요소가 필요하므로 초기 PDF 생성 또한 인터넷 연결의 혜택을 받습니다.
설치가 성공했는지 어떻게 확인할 수 있습니까?
설치 후 IronPDF가 제대로 작동하는지 확인하기 위해 다음 지표를 확인하세요:
-
참조 노드: 솔루션 탐색기에서 참조 노드를 확장합니다. 프로젝트 참조에 "IronPdf"가 목록에 표시되어야 합니다.
-
IntelliSenseSupport: C# 파일 맨 위에using IronPdf;을 입력하세요.IntelliSense는 네임스페이스를 오류 없이 인식해야 합니다. - 간단한 테스트 코드: 기능을 확인하기 위한 기본 테스트를 추가하세요:
using IronPdf;using IronPdf;Imports IronPdf$vbLabelText $csharpLabel
// Quick verification test var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("
Test
"); // If no exceptions occur, IronPDF is installed correctly
4. **패키지 관리자**: 패키지 관리자 콘솔에서 `Get-Package IronPdf`을 실행하여 버전 정보를 확인하세요.
문제가 발생하면 [문제 해결 안내서](/troubleshooting/quick-ironpdf-troubleshooting/)를 참조하거나 [시스템 요구 사항을 충족하는지](/get-started/windows/) 확인하십시오.
## PDF 생성을 위한 사용자 인터페이스를 어떻게 설계합니까?
이제 라벨을 추가하고 텍스트를 "IronPDF를 사용해 HTML에서 PDF 생성"으로 설정하세요.

다음으로, 도구 상자에서 리치 텍스트 박스와 버튼을 추가하세요. 버튼 텍스트를 'Convert'로 설정하십시오.

### 보통의 `TextBox` 대신 `RichTextBox`을(를) 사용하는 이유는 무엇인가요?
a `RichTextBox`은 PDF 생성 시나리오의 [HTML 입력](/how-to/html-string-to-pdf/)에 여러 가지 이점을 제공합니다:
1. **다중 라인 지원**: HTML은 보통 여러 줄에 걸쳐 있으며, `RichTextBox`는 이를 자연스럽게 처리합니다. 반면에 `TextBox`는 Multiline = true를 설정해야 합니다.
2. **서식 보존**: 우리가 단순 HTML을 입력할 때, `RichTextBox`은 들여쓰기와 줄 바꿈 같은 서식을 유지하여 개발 중에 HTML을 더 읽기 쉽게 만듭니다.
3. **더 큰 용량**: `RichTextBox`은 텍스트를 더 많이 처리할 수 있어, 코드 스니펫보다는 완전한 HTML 문서를 작업할 때 유용합니다.
4. **문법 강조 가능성**: 이 기본 예제에는 구현되지 않았지만, `RichTextBox`은 문법 강조를 제공하도록 확장할 수 있어 [개발자 경험을 향상시킬 수 있습니다](/tutorials/pixel-perfect-html-to-pdf/).
배포용 애플리케이션의 경우 더 나은 사용자 경험을 위해 전용 HTML 편집기 컨트롤을 사용하거나 외부 편집기와 통합하는 것을 고려하십시오.
### 사용자 인터페이스를 개선할 수 있는 다른 컨트롤은 무엇입니까?
더 강력한 PDF 생성 애플리케이션을 만들기 위해 다음 컨트롤을 추가하는 것을 고려하십시오:
1. **`WebBrowser` 컨트롤**: 변환 전 HTML 미리 보기를 표시하여 사용자가 PDF가 어떻게 보일지를 파악하도록 돕습니다. 이는 [IronPDF의 Chrome 렌더링 엔진](/how-to/pixel-perfect-html-to-pdf/)을 모방합니다.
2. **`ProgressBar`**: 대규모 문서 또는 [배치 작업](/how-to/async/)의 변환 진행 상황을 표시합니다.
3. **템플릿용 `ComboBox`**: 인보이스나 보고서 같은 일반 문서 유형에 미리 정의된 HTML 템플릿을 제공합니다.
4. **`PropertyGrid`**: 페이지 크기, 여백, 방향 같은 [PDF 렌더링 설정](/how-to/custom-paper-size/)을 수정할 수 있도록 합니다.
5. **`TabControl`**: 입력 HTML, 미리 보기 및 [PDF 설정](/how-to/rendering-options/)을 조직된 탭으로 분리합니다.
피드백을 위한 상태 표시 줄 추가 예시:
```csharp
// Add to your form
StatusStrip statusStrip = new StatusStrip();
ToolStripStatusLabel statusLabel = new ToolStripStatusLabel("Ready");
statusStrip.Items.Add(statusLabel);
this.Controls.Add(statusStrip);
모범 사례로 내 컨트롤을 어떻게 이름 지정해야 합니까?
일관된 명명 규칙을 따르면 코드 가독성과 유지보수가 향상됩니다. PDF 생성 폼에 대한 권장 사례는 다음과 같습니다:
-
설명적인 접두사 사용:
txtHtml은 HTML 입력RichTextBox을(를) 위한 것입니다btnConvert는 변환 버튼을 위한 것입니다lblTitle는 제목 레이블을 위한 것입니다
-
일관성을 유지해라: camelCase 또는
PascalCase중 하나를 선택하고 프로젝트 전반에 걸쳐 일관되게 사용하세요. -
기본 이름 피하기:
richTextBox1을 의미 있는 이름으로 바꾸세요, 예를 들면rtbHtmlInput. -
관련 컨트롤 그룹화: 복잡한 형식의 경우 기능을 그룹화하는 접두사를 사용하십시오:
pdfPageSize,pdfOrientation은 PDF 고유의 설정을 위한 것입니다htmlTemplate,htmlPreview은 HTML 관련 컨트롤을 위한 것입니다
- 접근성 고려하기: 스크린 리더용으로
Name속성을, 더 나은 사용성을 위해AccessibleName속성을 설정하세요.
좋은 명명은 코드를 자체 문서화하게 하며 양식 데이터 추출과 같은 기능 구현에 도움이 됩니다.
HTML을 PDF로 변환하는 코드를 어떻게 작성합니까?
'Convert' 버튼을 더블 클릭합니다. 변환 버튼 클릭 이벤트가 포함된 코드 창이 열립니다.

.cs 파일 맨 위에 IronPDF 라이브러리를 가져오는 코드를 추가합니다.
먼저, IronPDF 라이브러리 메서드를 사용하기 위한 아래 코드를 추가하십시오.
using IronPdf;
using IronPdf;
Imports IronPdf
아래는 현재 비어 있는 btnConvert_Click 이벤트의 초기 코드입니다:
private void btnConvert_Click(object sender, EventArgs e)
{
}
private void btnConvert_Click(object sender, EventArgs e)
{
}
Private Sub btnConvert_Click(ByVal sender As Object, ByVal e As EventArgs)
End Sub
이제 버튼 클릭 이벤트에 다음 코드를 작성합니다:
private void btnConvert_Click(object sender, EventArgs e)
{
// Declare an HtmlToPdf object
var HtmlLine = new HtmlToPdf();
// Get HTML text from the user
string strHtml = txtHtml.Text;
// Create SaveFileDialog to choose the save path for the PDF file
SaveFileDialog saveFileDialog = new SaveFileDialog
{
InitialDirectory = @"D:\",
Title = "Save PDF",
CheckPathExists = true,
DefaultExt = "pdf",
Filter = "pdf files (*.pdf)|*.pdf",
FilterIndex = 2,
RestoreDirectory = true
};
// If the user presses Save
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// Get the file path from the user
string filePath = saveFileDialog.FileName;
// Convert HTML to PDF and save at the specified path
using var PDF = HtmlLine.RenderHtmlAsPdf(strHtml);
PDF.SaveAs(filePath);
// Clear the TextBox and show a message confirming the successful creation
txtHtml.Text = "";
MessageBox.Show("File created successfully.");
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
// Declare an HtmlToPdf object
var HtmlLine = new HtmlToPdf();
// Get HTML text from the user
string strHtml = txtHtml.Text;
// Create SaveFileDialog to choose the save path for the PDF file
SaveFileDialog saveFileDialog = new SaveFileDialog
{
InitialDirectory = @"D:\",
Title = "Save PDF",
CheckPathExists = true,
DefaultExt = "pdf",
Filter = "pdf files (*.pdf)|*.pdf",
FilterIndex = 2,
RestoreDirectory = true
};
// If the user presses Save
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// Get the file path from the user
string filePath = saveFileDialog.FileName;
// Convert HTML to PDF and save at the specified path
using var PDF = HtmlLine.RenderHtmlAsPdf(strHtml);
PDF.SaveAs(filePath);
// Clear the TextBox and show a message confirming the successful creation
txtHtml.Text = "";
MessageBox.Show("File created successfully.");
}
}
Private Sub btnConvert_Click(ByVal sender As Object, ByVal e As EventArgs)
' Declare an HtmlToPdf object
Dim HtmlLine = New HtmlToPdf()
' Get HTML text from the user
Dim strHtml As String = txtHtml.Text
' Create SaveFileDialog to choose the save path for the PDF file
Dim saveFileDialog As New SaveFileDialog With {
.InitialDirectory = "D:\",
.Title = "Save PDF",
.CheckPathExists = True,
.DefaultExt = "pdf",
.Filter = "pdf files (*.pdf)|*.pdf",
.FilterIndex = 2,
.RestoreDirectory = True
}
' If the user presses Save
If saveFileDialog.ShowDialog() = DialogResult.OK Then
' Get the file path from the user
Dim filePath As String = saveFileDialog.FileName
' Convert HTML to PDF and save at the specified path
Dim PDF = HtmlLine.RenderHtmlAsPdf(strHtml)
PDF.SaveAs(filePath)
' Clear the TextBox and show a message confirming the successful creation
txtHtml.Text = ""
MessageBox.Show("File created successfully.")
End If
End Sub
설명:
- IronPDF의 변환 기능을 활용하기 위해
HtmlToPdf객체가 생성됩니다. - HTML 입력은 텍스트 박스에서 가져옵니다.
- 생성된 PDF를 저장할 위치를 사용자에게 묻기 위해
SaveFileDialog이 사용됩니다. - 사용자가 파일 위치를 선택하고 저장 버튼을 누르면 경로가 얻어집니다.
- 그런 다음 HTML 입력이
RenderHtmlAsPdf를 사용하여 PDF로 렌더링되고 선택한 경로에 저장됩니다. - 저장 후 텍스트 상자는 지워지고 PDF 생성 확인 메시지가 표시됩니다.
이 코드에 어떤 오류 처리를 추가해야 합니까?
제작용 PDF 생성 애플리케이션에 대한 강력한 오류 처리는 중요합니다. 종합적인 오류 처리가 포함된 향상된 버전은 다음과 같습니다:
private void btnConvert_Click(object sender, EventArgs e)
{
try
{
// Validate input
if (string.IsNullOrWhiteSpace(txtHtml.Text))
{
MessageBox.Show("Please enter HTML content.", "Validation Error",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
var renderer = new ChromePdfRenderer();
string strHtml = txtHtml.Text;
SaveFileDialog saveFileDialog = new SaveFileDialog
{
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
Title = "Save PDF",
CheckPathExists = true,
DefaultExt = "pdf",
Filter = "pdf files (*.pdf)|*.pdf",
FilterIndex = 1,
RestoreDirectory = true
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
// Show progress cursor
Cursor.Current = Cursors.WaitCursor;
using var pdf = renderer.RenderHtmlAsPdf(strHtml);
pdf.SaveAs(saveFileDialog.FileName);
txtHtml.Text = "";
MessageBox.Show("PDF created successfully!", "Success",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (IronPdf.Exceptions.IronPdfProductException ex)
{
// Handle licensing issues
MessageBox.Show($"Licensing error: {ex.Message}", "License Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor.Current = Cursors.Default;
}
}
}
catch (Exception ex)
{
MessageBox.Show($"An error occurred: {ex.Message}", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
// Log the full exception for debugging
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
try
{
// Validate input
if (string.IsNullOrWhiteSpace(txtHtml.Text))
{
MessageBox.Show("Please enter HTML content.", "Validation Error",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
var renderer = new ChromePdfRenderer();
string strHtml = txtHtml.Text;
SaveFileDialog saveFileDialog = new SaveFileDialog
{
InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
Title = "Save PDF",
CheckPathExists = true,
DefaultExt = "pdf",
Filter = "pdf files (*.pdf)|*.pdf",
FilterIndex = 1,
RestoreDirectory = true
};
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
// Show progress cursor
Cursor.Current = Cursors.WaitCursor;
using var pdf = renderer.RenderHtmlAsPdf(strHtml);
pdf.SaveAs(saveFileDialog.FileName);
txtHtml.Text = "";
MessageBox.Show("PDF created successfully!", "Success",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (IronPdf.Exceptions.IronPdfProductException ex)
{
// Handle licensing issues
MessageBox.Show($"Licensing error: {ex.Message}", "License Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor.Current = Cursors.Default;
}
}
}
catch (Exception ex)
{
MessageBox.Show($"An error occurred: {ex.Message}", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
// Log the full exception for debugging
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
Private Sub btnConvert_Click(sender As Object, e As EventArgs) Handles btnConvert.Click
Try
' Validate input
If String.IsNullOrWhiteSpace(txtHtml.Text) Then
MessageBox.Show("Please enter HTML content.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return
End If
Dim renderer As New ChromePdfRenderer()
Dim strHtml As String = txtHtml.Text
Dim saveFileDialog As New SaveFileDialog With {
.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
.Title = "Save PDF",
.CheckPathExists = True,
.DefaultExt = "pdf",
.Filter = "pdf files (*.pdf)|*.pdf",
.FilterIndex = 1,
.RestoreDirectory = True
}
If saveFileDialog.ShowDialog() = DialogResult.OK Then
Try
' Show progress cursor
Cursor.Current = Cursors.WaitCursor
Using pdf = renderer.RenderHtmlAsPdf(strHtml)
pdf.SaveAs(saveFileDialog.FileName)
End Using
txtHtml.Text = ""
MessageBox.Show("PDF created successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As IronPdf.Exceptions.IronPdfProductException
' Handle licensing issues
MessageBox.Show($"Licensing error: {ex.Message}", "License Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
Cursor.Current = Cursors.Default
End Try
End If
Catch ex As Exception
MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
' Log the full exception for debugging
System.Diagnostics.Debug.WriteLine(ex.ToString())
End Try
End Sub
키 오류 처리 개선:
- 처리 전 입력 유효성 검사
- IronPDF 라이선싱 예외에 대한 구체적인 처리
- 커서 변경을 통한 진행 표시
- 디버깅을 위한 적절한 예외 로깅
- 사용자 친화적인 오류 메시지
페이지 크기와 같은 PDF 설정을 어떻게 사용자 정의합니까?
IronPDF는 ChromePdfRenderOptions 클래스를 통해 광범위한 사용자 정의를 제공합니다. 일반적인 사용자 정의 구현 방법은 다음과 같습니다:
private void ConvertWithCustomSettings()
{
var renderer = new ChromePdfRenderer();
// Configure rendering options
renderer.RenderingOptions = new ChromePdfRenderOptions
{
// Page setup
PaperSize = PdfPaperSize.A4,
PaperOrientation = PdfPaperOrientation.Portrait,
MarginTop = 25, // millimeters
MarginBottom = 25,
MarginLeft = 20,
MarginRight = 20,
// Rendering behavior
EnableJavaScript = true,
RenderDelay = 500, // milliseconds
CreatePdfFormsFromHtml = true,
// Headers and footers
TextHeader = new TextHeaderFooter
{
CenterText = "My Document",
FontSize = 12,
DrawDividerLine = true
},
TextFooter = new TextHeaderFooter
{
RightText = "Page {page} of {total-pages}",
FontSize = 10
}
};
// Apply custom CSS for print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Generate PDF with custom settings
var pdf = renderer.RenderHtmlAsPdf(txtHtml.Text);
pdf.SaveAs("custom-output.pdf");
}
private void ConvertWithCustomSettings()
{
var renderer = new ChromePdfRenderer();
// Configure rendering options
renderer.RenderingOptions = new ChromePdfRenderOptions
{
// Page setup
PaperSize = PdfPaperSize.A4,
PaperOrientation = PdfPaperOrientation.Portrait,
MarginTop = 25, // millimeters
MarginBottom = 25,
MarginLeft = 20,
MarginRight = 20,
// Rendering behavior
EnableJavaScript = true,
RenderDelay = 500, // milliseconds
CreatePdfFormsFromHtml = true,
// Headers and footers
TextHeader = new TextHeaderFooter
{
CenterText = "My Document",
FontSize = 12,
DrawDividerLine = true
},
TextFooter = new TextHeaderFooter
{
RightText = "Page {page} of {total-pages}",
FontSize = 10
}
};
// Apply custom CSS for print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Generate PDF with custom settings
var pdf = renderer.RenderHtmlAsPdf(txtHtml.Text);
pdf.SaveAs("custom-output.pdf");
}
Private Sub ConvertWithCustomSettings()
Dim renderer = New ChromePdfRenderer()
' Configure rendering options
renderer.RenderingOptions = New ChromePdfRenderOptions With {
' Page setup
.PaperSize = PdfPaperSize.A4,
.PaperOrientation = PdfPaperOrientation.Portrait,
.MarginTop = 25, ' millimeters
.MarginBottom = 25,
.MarginLeft = 20,
.MarginRight = 20,
' Rendering behavior
.EnableJavaScript = True,
.RenderDelay = 500, ' milliseconds
.CreatePdfFormsFromHtml = True,
' Headers and footers
.TextHeader = New TextHeaderFooter With {
.CenterText = "My Document",
.FontSize = 12,
.DrawDividerLine = True
},
.TextFooter = New TextHeaderFooter With {
.RightText = "Page {page} of {total-pages}",
.FontSize = 10
}
}
' Apply custom CSS for print
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
' Generate PDF with custom settings
Dim pdf = renderer.RenderHtmlAsPdf(txtHtml.Text)
pdf.SaveAs("custom-output.pdf")
End Sub
더 발전된 사용자 정의 옵션을 탐색하려면 사용자 정의 용지 크기, 사용자 정의 여백, 뷰포트 설정을 참조하십시오.
PDF 생성을 위해 Using 문을 사용하는 이유는 무엇입니까?
PDF 생성을 위한 적절한 리소스 관리에서 using 문은 필수입니다:
-
자동 폐기: PDF 문서는 이미지나 대량 콘텐츠를 포함할 경우 상당한 메모리를 사용할 수 있습니다.
using문은 수정 후 PDF 객체가 적절히 폐기되도록 보장합니다. -
파일 핸들 해제: 적절한 폐기가 없을 경우 파일 핸들이 잠긴 상태로 남아 이후 PDF 파일 작업을 방지할 수 있습니다.
- 메모리 관리: IronPDF의 렌더링 엔진은 메모리 누수를 방지하기 위해 해제되어야 할 네이티브 리소스를 사용합니다.
다음은 패턴 비교입니다:
// Recommended approach with using
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
} // Resources automatically released here
// Alternative with try-finally (more verbose)
PdfDocument pdf = null;
try
{
pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
finally
{
pdf?.Dispose();
}
// Recommended approach with using
using (var pdf = renderer.RenderHtmlAsPdf(html))
{
pdf.SaveAs("output.pdf");
} // Resources automatically released here
// Alternative with try-finally (more verbose)
PdfDocument pdf = null;
try
{
pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
finally
{
pdf?.Dispose();
}
' Recommended approach with Using
Using pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Using ' Resources automatically released here
' Alternative with Try-Finally (more verbose)
Dim pdf As PdfDocument = Nothing
Try
pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
Finally
If pdf IsNot Nothing Then
pdf.Dispose()
End If
End Try
비동기 작업을 위해 C# 8.0+의 await using을 사용하세요:
await using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
await using var pdf = await renderer.RenderHtmlAsPdfAsync(html);
Await Using pdf = Await renderer.RenderHtmlAsPdfAsync(html)
가장 잘 작동하는 일반 HTML 태그는 무엇입니까?
IronPDF의 Chrome 렌더링 엔진은 모든 현대 HTML5 태그를 지원하지만, PDF 생성에 특히 잘 작동하는 태그가 있습니다:
문서 구조:
<html>
<head>
<meta charset="UTF-8">
<style>
@media print { /* PDF-specific styles */ }
body { font-family: Arial, sans-serif; }
.page-break { page-break-after: always; }
</style>
</head>
<body>
<h1>Document Title</h1>
<div class="page-break"></div>
<h2>New Page Content</h2>
</body>
</html>
<html>
<head>
<meta charset="UTF-8">
<style>
@media print { /* PDF-specific styles */ }
body { font-family: Arial, sans-serif; }
.page-break { page-break-after: always; }
</style>
</head>
<body>
<h1>Document Title</h1>
<div class="page-break"></div>
<h2>New Page Content</h2>
</body>
</html>
PDF에 가장 성능이 좋은 태그들:
<h1>to<h6>: 명확한 문서 계층 구조를 만듭니다<table>: 구조화된 데이터와 인보이스에 적합합니다<img>: 내장 이미지 및 base64 데이터를 지원합니다- CSS가 있는
<div>: 정밀한 레이아웃 제어 <p>및<span>: 표준 텍스트 서식 설정<ul>및<ol>: 깔끔한 목록 서식
특별 고려 사항:
- CSS 페이지 구분을 사용하여 다중 페이지 제어
- @font-face를 사용하여 일관성을 위해 글꼴 포함
- 절대 위치를 절제하여 사용
- JavaScript 생성 콘텐츠를 철저히 테스트
PDF 생성 애플리케이션을 어떻게 테스트합니까?
프로젝트를 실행하면 다음 화면이 표시됩니다:

RichTextBox에 HTML 코드를 입력합니다. 예시:
<h1>A Simple PDF File</h1><br><h6>Heading 6</h6>
<h1>A Simple PDF File</h1><br><h6>Heading 6</h6>
'Convert'를 클릭하십시오. 파일 저장 대화 상자가 표시됩니다.

저장 버튼을 클릭하면 파일이 지정된 경로에 이름과 위치가 정의된 채로 저장됩니다.
어떤 HTML 요소를 가장 먼저 테스트해야 합니까?
IronPDF의 렌더링 기능을 이해하기 위한 점진적으로 복잡한 HTML 예제로 시작하십시오:
기본 텍스트 형식:
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.highlight { background-color: yellow; }
.important { color: red; font-weight: bold; }
</style>
</head>
<body>
<h1>Test Document</h1>
<p>This is <strong>bold</strong> and <em>italic</em> text.</p>
<p class="highlight">Highlighted text example.</p>
<p class="important">Important notice!</p>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; margin: 40px; }
.highlight { background-color: yellow; }
.important { color: red; font-weight: bold; }
</style>
</head>
<body>
<h1>Test Document</h1>
<p>This is <strong>bold</strong> and <em>italic</em> text.</p>
<p class="highlight">Highlighted text example.</p>
<p class="important">Important notice!</p>
</body>
</html>
스타일이 있는 표:
<table style="border-collapse: collapse; width: 100%;">
<tr style="background-color: #f2f2f2;">
<th style="border: 1px solid #ddd; padding: 8px;">Product</th>
<th style="border: 1px solid #ddd; padding: 8px;">Price</th>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">IronPDF</td>
<td style="border: 1px solid #ddd; padding: 8px;">$749</td>
</tr>
</table>
<table style="border-collapse: collapse; width: 100%;">
<tr style="background-color: #f2f2f2;">
<th style="border: 1px solid #ddd; padding: 8px;">Product</th>
<th style="border: 1px solid #ddd; padding: 8px;">Price</th>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px;">IronPDF</td>
<td style="border: 1px solid #ddd; padding: 8px;">$749</td>
</tr>
</table>
고급 기능:
<img src="___PROTECTED_URL_118___" width="200" alt="Company Logo">
<div style="page-break-after: always;"></div>
<ul>
<li>First item</li>
<li>Second item</li>
</ul>
<img src="___PROTECTED_URL_118___" width="200" alt="Company Logo">
<div style="page-break-after: always;"></div>
<ul>
<li>First item</li>
<li>Second item</li>
</ul>
HTML을 PDF로 변환이 예상대로 작동하는지 확인하려면 이러한 요소를 테스트하십시오.
PDF가 생성되지 않으면 어떻게 디버그할 수 있습니까?
PDF 생성이 실패할 때, 체계적인 디버깅 접근 방식을 따르십시오:
-
로그 활성화:
IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "IronPdfLog.txt"; IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;IronPdf.Logging.Logger.EnableDebugging = true; IronPdf.Logging.Logger.LogFilePath = "IronPdfLog.txt"; IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;IronPdf.Logging.Logger.EnableDebugging = True IronPdf.Logging.Logger.LogFilePath = "IronPdfLog.txt" IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All$vbLabelText $csharpLabel -
HTML 유효성 검사:
// Validate HTML before conversion private bool IsValidHtml(string html) { try { var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); return doc.ParseErrors.Count() == 0; } catch { return false; } }// Validate HTML before conversion private bool IsValidHtml(string html) { try { var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); return doc.ParseErrors.Count() == 0; } catch { return false; } }' Validate HTML before conversion Private Function IsValidHtml(html As String) As Boolean Try Dim doc As New HtmlAgilityPack.HtmlDocument() doc.LoadHtml(html) Return doc.ParseErrors.Count() = 0 Catch Return False End Try End Function$vbLabelText $csharpLabel -
Chrome
DevTools사용하기:- HTML을 파일로 저장하고 Chrome에서 엽니다
- F12를 눌러 JavaScript 오류를 확인합니다
- 콘솔을 검토하여 문제를 확인합니다
- Chrome의 인쇄 미리보기를 사용하여 렌더링 방식을 봅니다
-
일반 문제와 해결책:
- 빈 PDF: JavaScript에 더 많은 렌더링 지연이 필요한지 확인합니다
- 누락된 이미지: 이미지 경로가 절대 경로인지 base64를 사용하는지 확인합니다
- 글꼴 문제: 글꼴을 적절하게 포함
- 레이아웃 문제: CSS 미디어 유형 검토
- 최소 예시 테스트:
// Start with the simplest possible HTML var testHtml = "<h1>Test</h1>"; var pdf = new ChromePdfRenderer().RenderHtmlAsPdf(testHtml); pdf.SaveAs("test.pdf");// Start with the simplest possible HTML var testHtml = "<h1>Test</h1>"; var pdf = new ChromePdfRenderer().RenderHtmlAsPdf(testHtml); pdf.SaveAs("test.pdf");' Start with the simplest possible HTML Dim testHtml = "<h1>Test</h1>" Dim pdf = New ChromePdfRenderer().RenderHtmlAsPdf(testHtml) pdf.SaveAs("test.pdf")$vbLabelText $csharpLabel
응용 프로그램 실행 시 발생하는 일반적인 문제는 무엇인가요?
초보 개발자들이 가장 자주 겪는 문제와 그 해결책은 다음과 같습니다:
-
"IronPdf.Exceptions.
IronPdfDeploymentException"- 해결책: Visual C++ 런타임이 설치되었는지 확인
- 최신 런타임을 얻기 위해 Windows 업데이트 실행
-
"액세스 거부" 오류
- 보호된 디렉터리(C:\, Program Files)에 저장하지 마세요
- 안전한 경로를 위해
Environment.SpecialFolder을 사용하세요 - 웹 앱의 IIS 권한을 확인합니다
-
대용량 파일 크기
- PDF 압축 적용:
pdf.CompressImages(90); // 90% qualitypdf.CompressImages(90); // 90% qualitypdf.CompressImages(90) ' 90% quality$vbLabelText $csharpLabel
- PDF 압축 적용:
-
성능 저하
- 더 나은 응답성을 위해 비동기 렌더링 구현
- 여러 PDF에 대해 병렬 처리 고려
- 렌더링 지연을 현명하게 사용
- 누락된 콘텐츠
- 외부 리소스는 절대 URL이 필요할 수 있습니다
- JavaScript 콘텐츠에 지연이 필요할 수 있습니다
- 보호된 리소스에 대한 네트워크 인증 확인
지속적인 문제의 경우, 포괄적인 문제 해결 가이드를 참조하세요.
최종 PDF 출력은 어떻게 보이나요?
출력 PDF 문서는 다음과 같이 보일 것입니다:

PDF 품질을 어떻게 개선할 수 있을까요?
다음 전문 기술로 PDF 출력 품질을 향상시키세요:
-
고해상도 렌더링:
renderer.RenderingOptions.PrintHtmlBackgrounds = true; renderer.RenderingOptions.ImageQuality = 95; // Higher quality for images renderer.RenderingOptions.DPI = 300; // Print-quality resolutionrenderer.RenderingOptions.PrintHtmlBackgrounds = true; renderer.RenderingOptions.ImageQuality = 95; // Higher quality for images renderer.RenderingOptions.DPI = 300; // Print-quality resolutionrenderer.RenderingOptions.PrintHtmlBackgrounds = True renderer.RenderingOptions.ImageQuality = 95 ' Higher quality for images renderer.RenderingOptions.DPI = 300 ' Print-quality resolution$vbLabelText $csharpLabel -
전문 스타일링:
<style> @page { size: A4; margin: 2cm; } body { font-family: 'Segoe UI', Tahoma, sans-serif; line-height: 1.6; color: #333; } h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; } </style><style> @page { size: A4; margin: 2cm; } body { font-family: 'Segoe UI', Tahoma, sans-serif; line-height: 1.6; color: #333; } h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; } </style>HTML -
시각적 요소 추가:
- 다양한 용도를 위한 최적화:
출력이 예상과 다른 이유는 무엇인가요?
여러 요인이 HTML 미리보기와 PDF 출력 간 렌더링 차이를 일으킬 수 있습니다:
-
CSS 미디어 유형: PDF는 기본적으로 인쇄 미디어를 사용합니다. 인쇄 전용 스타일 추가:
@media print { .no-print { display: none; } body { font-size: 12pt; } } -
폰트 가용성: 사용자 지정 폰트 임베드로 일관성 보장:
@font-face { font-family: 'MyFont'; src: url('data:font/woff2;base64,...') format('woff2'); } -
동적 콘텐츠: JavaScript로 렌더링된 콘텐츠 로딩 시간을 필요로 함:
renderer.RenderingOptions.RenderDelay = 2000; // Wait 2 secondsrenderer.RenderingOptions.RenderDelay = 2000; // Wait 2 secondsrenderer.RenderingOptions.RenderDelay = 2000 ' Wait 2 seconds$vbLabelText $csharpLabel -
브라우저 차이: IronPDF는 Chromium을 사용하므로 Chrome에서 정확한 미리보기를 테스트하십시오. Chrome 렌더러에 대해 알아보기.
- 해상도 및 스케일링: 모니터 DPI는 인쇄 DPI와 다름. 뷰포트 설정을 사용하여 일관된 렌더링.
픽셀 단위로 완벽한 렌더링을 위해 HTML to PDF 모범 사례 안내서를 따르십시오.
이 튜토리얼 이후에는 어떤 단계가 있나요?
위의 튜토리얼은 IronPDF 라이브러리를 사용하여 HTML에서 PDF를 생성하는 방법을 설명합니다.
자세한 정보를 얻으려면 IronPDF 공식 사이트를 방문하십시오. 이 라이브러리는 또한 완전히 사용자 정의 가능한 PDF 파일, 파일의 프로그래밍 방식 병합 및 분할 을 지원하거나 다양한 기능을 보여주는 샘플 코드 단순히 확인할 수 있는 기타 기능을 제공합니다.
30일 체험판 키를 사용하여 평가할 수 있습니다. 현재 훌륭한 제안이 있으며, 단 두 개의 가격으로 Iron Software 제품 다섯 개를 얻을 수 있습니다. 라이선스에 대한 자세한 내용을 보려면 이 IronPDF 라이선스 정보를 방문하십시오.
다음으로 어떤 고급 기능을 배워야 하나요?
기본 HTML to PDF 변환을 마스터한 후 이러한 고급 기능을 탐색하십시오:
-
PDF 양식: 데이터 수집을 위한 작성 가능한 양식 생성:
// Create interactive form fields pdf.Form.Fields.Add(new PdfTextField("name", "Enter your name", 100, 100));// Create interactive form fields pdf.Form.Fields.Add(new PdfTextField("name", "Enter your name", 100, 100));' Create interactive form fields pdf.Form.Fields.Add(New PdfTextField("name", "Enter your name", 100, 100))$vbLabelText $csharpLabel -
디지털 서명: 문서에 보안 및 진정성 추가
- 성능 최적화:
- 웹 애플리케이션을 위한 비동기 렌더링
- 여러 문서 일괄 처리
- 메모리 효율적인 스트리밍
프로젝트 요구 사항에 가장 관련이 있는 기능부터 시작하십시오.
체험판에서 프로덕션으로 어떻게 이동하나요?
체험판에서 프로덕션으로의 전환에는 여러 가지 중요한 단계가 포함됩니다:
-
적절한 라이선스 선택:
- Lite: 단일 개발자, 단일 프로젝트
- Plus: 단일 개발자, 여러 프로젝트
- Professional: 소규모 팀(최대 3명의 개발자)
- Unlimited: 기업 팀
- 라이선스 키 적용:
// In application startup IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// In application startup IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";$vbLabelText $csharpLabel
// Or via configuration // appsettings.json (for .NET Core) { "IronPdf.License.LicenseKey": "YOUR-LICENSE-KEY" }
3. **체험판 워터마크 제거**: 라이선스 버전은 생성된 모든 PDF에서 체험판 워터마크를 자동으로 제거합니다.
4. **성능 고려사항**:
- 프로덕션 규모의 데이터로 테스트
- [적절한 오류 처리](/troubleshooting/engineering-support-for-ironpdf/) 구현
- 모니터링을 위한 [로깅 설정](/how-to/custom-logging/)
5. **배포 체크리스트**:
- [서버 요구 사항](/get-started/windows/) 확인
- 목표 [배포 플랫폼](/get-started/azure/)에서 테스트
- [IIS를 설정](/troubleshooting/ironpdf-and-iis/) (해당되는 경우)
- [연속 통합 설정](/get-started/installation-overview/)
자세한 라이선스 안내는 [라이선스 FAQ](/licensing/)를 참조하세요.
### 더 복잡한 예제를 어디서 찾을 수 있나요?
다음과 같은 포괄적인 리소스를 통해 IronPDF 지식을 확장하세요:
1. **[코드 예제 라이브러리](/examples/)**:
- [송장 생성](/how-to/csharp-pdf-reports/)
- [보고서 생성](/how-to/csharp-pdf-reports/)
- [배치 처리](/examples/parallel/)
2. **[튜토리얼 시리즈](/tutorials/)**:
- [완전한 HTML to PDF 가이드](/tutorials/html-to-pdf/)
- [처음부터 PDF 생성](/tutorials/csharp-create-pdf-complete-tutorial/)
- [고급 PDF 편집](/tutorials/csharp-edit-pdf-complete-tutorial/)
3. **[통합 가이드](/how-to/html-string-to-pdf/)**:
- [ASP.NET MVC 통합](/how-to/cshtml-to-pdf-mvc-core/)
- [Blazor 응용 프로그램](/how-to/blazor-tutorial/)
- [Azure 배포](/how-to/azure/)
4. **[API 문서](/object-reference/api/)**:
- 포괄적인 클래스 참조
- 메서드 시그니처와 매개 변수
- 각 기능에 대한 코드 스니펫
5. **커뮤니티 리소스**:
- [Stack Overflow IronPDF 태그](https://stackoverflow.com/questions/tagged/ironpdf)
- [GitHub 예제](https://github.com/iron-software)
- [도움말 센터](/)를 통한 기술 지원
사용 사례에 가장 가까운 예제로 시작하고 필요에 따라 점차적으로 더 고급 기능을 탐색하십시오.자주 묻는 질문
C#에서 HTML을 PDF로 변환하는 방법은 무엇인가요?
IronPDF의 RenderHtmlAsPdf 메소드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. HtmlToPdf 객체를 생성하고 해당 메소드를 호출하여 HTML을 PDF 문서로 렌더링하십시오.
PDF 생성을 위한 Visual Studio 프로젝트 설정에 어떤 단계가 필요한가요?
Visual Studio 2019를 열고, 'Create a new project'를 선택, 'Windows Forms App'을 선택하고 프로젝트 이름을 설정합니다. 그런 다음 NuGet을 통해 IronPDF를 설치하여 PDF 생성 기능 통합을 시작하십시오.
Visual Studio에서 PDF 생성 라이브러리를 어떻게 설치하나요?
Visual Studio의 패키지 관리자 콘솔로 이동하여 Install-Package IronPdf 명령을 실행하여 IronPDF를 설치할 수 있습니다.
PDF를 생성할 폼에 포함할 구성 요소는 무엇인가요?
안내를 위한 라벨, HTML 입력을 위한 Rich Text Box, PDF를 생성하기 위한 'Convert' 버튼을 포함하세요.
PDF 파일 생성을 위한 백엔드 코드를 어떻게 구현하나요?
IronPDF를 사용하여 HtmlToPdf 객체를 선언합니다. 텍스트 상자에서 HTML 입력을 가져오고, 사용자에게 PDF를 저장하도록 요청하고 RenderHtmlAsPdf 메소드로 HTML을 렌더링합니다.
PDF 라이브러리에서 HtmlToPdf 객체의 기능은 무엇입니까?
IronPDF의 HtmlToPdf 객체는 라이브러리의 포괄적인 변환 기능을 사용하여 HTML 콘텐츠를 PDF 문서로 변환하는 데 사용됩니다.
내 PDF 생성 프로젝트가 올바르게 작동하는지 어떻게 확인하나요?
Visual Studio에서 프로젝트를 실행하고 RichTextBox에 HTML을 입력한 다음 'Convert'를 클릭하십시오. 그런 다음 SaveFileDialog를 사용하여 PDF 파일의 저장 위치를 선택하여 변환이 성공적으로 완료되었는지 확인하십시오.
PDF 라이브러리가 제공하는 고급 기능은 무엇인가요?
IronPDF는 완벽하게 사용자 정의 가능한 PDF, 파일 병합 및 분할 프로그래밍 기능을 제공합니다. 라이브러리는 다양한 기능에 대한 샘플 코드도 제공합니다.
구매하기 전에 PDF 라이브러리를 시험해볼 수 있나요?
예, IronPDF의 30일 체험 키가 공식 웹사이트에서 제공되어 구매하기 전에 기능을 탐색할 수 있습니다.
PDF 라이브러리의 라이선스 정보를 어디에서 찾을 수 있나요?
IronPDF의 자세한 라이선스 정보는 웹사이트에 있는 IronPDF 라이선스 정보 페이지에서 옵션 및 현재 제공을 포함하여 찾을 수 있습니다.
IronPDF는 .NET 10과 호환됩니까?
예 — IronPDF는 이미 모든 최신 .NET 버전을 지원하며, 2025년 11월에 예정된 .NET 10 릴리스와도 호환됩니다. 추가적인 우회 없이 .NET 10 프로젝트에서도 문제없이 작동합니다. (ironpdf.com/blog/using-ironpdf/5-steps-to-generate-a-pdf-file-in-c-sharp/)


