C#에서 PDF 수정 기록을 저장하고 편집하는 방법
MigraDoc에서 IronPDF로 마이그레이션하면 .NET PDF 워크플로우가 수작업으로 요소를 하나씩 구축해야 하는 장황한 프로그래밍 문서 모델에서 기존 웹 개발 기술을 활용하는 최신 HTML/CSS기반 접근 방식으로 전환됩니다. 이 가이드는 전문 .NET 개발자를 위해 MigraDoc의 독점적 문서 객체 모델의 가파른 학습 곡선을 제거하는 포괄적이며 단계별 마이그레이션 경로를 제공합니다.
왜 MigraDoc에서 IronPDF로 마이그레이션해야 하는가?
MigraDoc의 문제점
MigraDoc는 PDFsharp 위에 있는 레이아웃 엔진으로, PDFsharp 패키지에 의존하며 PDFsharp PdfDocument로 렌더링합니다. MIT 라이선스 하에 empira / PDFsharp-Team에 의해 유지 관리되고 있으며, 프로그래밍 생성을 위한 강력한 기능을 제공하지만 현대 개발 워크플로우에 영향을 미치는 근본적인 제한 사항이 있습니다:
-
HTML 지원 없음: MigraDoc는 HTML을 직접 지원하지 않습니다.
Document,Section,Paragraph, 그리고Table객체를 사용하여 요소별로 문서를 수동으로 구성해야 하며, 기존 HTML/CSS디자인을 활용할 수 없습니다. -
독점 문서 모델: MigraDoc는
AddSection(),AddParagraph(),AddTable(),AddRow(), 그리고AddCell()같은 개념이 포함된 고유한 문서 모델을 학습해야 합니다. 이 가파른 학습 곡선은 웹 개발 배경이 있는 개발자에게 특히 어렵습니다. -
제한적인 스타일링 옵션: MigraDoc는 강력한 문서 구조 관리 기능을 제공하지만, 그 스타일링 기능은 현대 웹 도구에 비해 부족합니다.
Format.Font.Size,Format.Font.Bold, 그리고Format.Alignment같은 속성은 전체 CSS3에 비해 제한적입니다. -
장황한 코드: 간단한 레이아웃을 만들기 위해서도 수십 줄의 코드가 필요합니다. 기본 테이블에 머리글을 추가하려면 15-20 줄의MigraDoc코드가 필요할 수 있습니다.
-
JavaScript 지원 없음: MigraDoc는 동적 콘텐츠를 렌더링하거나 JavaScript를 실행할 수 없어 현대적인 차트와 상호작용 요소의 옵션을 제한합니다.
-
기본 차트: MigraDoc의 차트 기능은 Chart.js나 D3와 같은 현대적인JavaScript차트 라이브러리에 비해 제한적입니다.
###MigraDocvsIronPDF비교
| 기능 | MigraDoc | IronPDF |
|---|---|---|
| 콘텐츠 정의 | 프로그래밍 방식 (문서/섹션/단락) | HTML/CSS |
| 학습 곡선 | 어려움 (독점 DOM) | 쉬움 (웹 기술) |
| 스타일링 | 제한된 속성 | 전체 CSS3 |
| JavaScript | None | 전체 Chromium 실행 |
| 표 | 수동 열/행 정의 | HTML <table>와 CSS |
| 차트 | 기본적인MigraDoc차트 | 모든JavaScript차트 라이브러리 |
| 이미지 | 수동 크기 조정/위치 설정 | 표준 HTML <img> |
| 반응형 레이아웃 | 지원되지 않음 | 플렉스박스, 그리드 |
| 라이선스 | 오픈 소스 (MIT) | 상업적 |
현대 .NET을 목표로 하는 팀의 경우, IronPDF는 개발자들이 독점적 문서 모델을 배우는 대신 익숙한 HTML/CSS기술을 사용할 수 있도록 해줍니다.
마이그레이션 복잡성 평가
기능별 예상 노력
| 기능 | 마이그레이션 복잡성 |
|---|---|
| 간단한 텍스트 | 매우 낮음 |
| 표 | 낮음 |
| 헤더/푸터 | 낮음 |
| 스타일 | 중간 |
| 이미지 | 낮음 |
| 차트 | 중간 |
패러다임 전환
이MigraDoc마이그레이션의 기본적인 변화는 프로그래밍 문서 구축에서 HTML 우선 렌더링으로 전환하는 것입니다:
MigraDoc: 문서 → AddSection() → AddParagraph() → PdfDocumentRenderer → Save()
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
이 패러다임 변화는 CSS를 통해 무제한 스타일링 기능을 제공하면서 코드 복잡성을 획기적으로 감소시킵니다.
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# RemoveMigraDocpackages (package IDs are case-sensitive on nuget.org)
dotnet remove package PDFsharp-MigraDoc
dotnet remove package PDFsharp-MigraDoc-GDI
dotnet remove package PDFsharp-MigraDoc-WPF
# Install IronPDF
dotnet add package IronPdf
라이선스 구성
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"###MigraDoc사용 식별하기
# Find allMigraDocreferences
grep -r "using MigraDoc\|PdfDocumentRenderer\|AddSection\|AddParagraph" --include="*.cs" .
grep -r "AddTable\|AddRow\|AddColumn\|AddCell\|AddImage" --include="*.cs" .
완전한 API 참조
클래스 매핑
| MigraDoc 클래스 | IronPDF 동등 |
|---|---|
Document | ChromePdfRenderer |
Section | HTML <body> 또는 <div> |
Paragraph | HTML <p>, <h1>, 등 |
FormattedText | HTML <span>, <strong>, 등 |
Table | HTML <table> |
Row | HTML <tr> |
Column | HTML <col> 또는 CSS |
Cell | HTML <td>, <th> |
PdfDocumentRenderer | ChromePdfRenderer |
메서드 매핑
| MigraDoc 메서드 | IronPDF 동등 |
|---|---|
document.AddSection() | HTML 구조 |
section.AddParagraph(text) | <p>text</p> |
section.AddTable() | <table> |
table.AddColumn(width) | CSS width 속성 |
table.AddRow() | <tr> |
row.Cells[n].AddParagraph() | <td>content</td> |
renderer.RenderDocument() | RenderHtmlAsPdf(html) |
pdfDocument.Save(path) | pdf.SaveAs(path) |
플레이스홀더 매핑 (헤더/푸터)
| MigraDoc 메서드 | IronPDF 플레이스홀더 |
|---|---|
AddPageField() | {page} |
AddNumPagesField() | {total-pages} |
AddDateField() | {date} |
코드 마이그레이션 예제
예제 1: 기본 HTML을 PDF로 (근본적인 차이점)
이전 (MigraDoc):
// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using System.Diagnostics;
class Program
{
static void Main()
{
//MigraDocdoesn't support HTML directly
// Must manually create document structure
Document document = new Document();
Section section = document.AddSection();
Paragraph paragraph = section.AddParagraph();
paragraph.AddFormattedText("Hello World", TextFormat.Bold);
paragraph.Format.Font.Size = 16;
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("output.pdf");
}
}
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
pdf.SaveAs("output.pdf");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>")
pdf.SaveAs("output.pdf")
End Sub
End Class이 예제는 MigraDoc과IronPDF사이의 근본적인 차이점을 보여줍니다. MigraDoc는 Document를 생성하고, Section를 추가하고, Paragraph를 추가하며, AddFormattedText()와 TextFormat.Bold를 사용하고, Format.Font.Size을 설정하고, PdfDocumentRenderer를 생성하고, 문서를 할당하고, RenderDocument()를 호출하며, 마지막으로 저장하는 작업을 요구합니다. 이는 여러 객체로 10줄 이상의 코드가 필요합니다.
IronPDF는 같은 결과를 3줄로 달성합니다: 렌더러 생성, HTML 렌더링, 저장. HTML <h1> 태그는 자연스럽게 굵고 큰 제목 스타일을 제공합니다. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.
예제 2: 테이블 생성
이전 (MigraDoc):
// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;
class Program
{
static void Main()
{
Document document = new Document();
Section section = document.AddSection();
Table table = section.AddTable();
table.Borders.Width = 0.75;
Column column1 = table.AddColumn("3cm");
Column column2 = table.AddColumn("3cm");
Row row1 = table.AddRow();
row1.Cells[0].AddParagraph("Name");
row1.Cells[1].AddParagraph("Age");
Row row2 = table.AddRow();
row2.Cells[0].AddParagraph("John");
row2.Cells[1].AddParagraph("30");
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("table.pdf");
}
}
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlTable = @"
<table border='1'>
<tr><th>Name</th><th>Age</th></tr>
<tr><td>John</td><td>30</td></tr>
</table>";
var pdf = renderer.RenderHtmlAsPdf(htmlTable);
pdf.SaveAs("table.pdf");
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim htmlTable As String = "
<table border='1'>
<tr><th>Name</th><th>Age</th></tr>
<tr><td>John</td><td>30</td></tr>
</table>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlTable)
pdf.SaveAs("table.pdf")
End Sub
End ModuleMigraDoc 테이블 생성은 Table, Column, Row, Cell 계층 구조를 이해해야 합니다. AddColumn()로 열을 명시적으로 추가하고, AddRow()로 행을 생성하고, Cells[n]로 인덱스를 통해 셀을 접근하며, AddParagraph()로 내용을 추가해야 합니다. 테두리는 table.Borders.Width로 설정됩니다.
IronPDF는 모든 웹 개발자가 아는 표준 HTML 테이블 구문을 사용합니다. border='1' 속성은 테두리를 제공하며, <th> 요소는 헤더 셀을 생성하고, <td> 요소는 데이터 셀을 생성합니다. CSS는 더 발전된 스타일링을 위해 추가될 수 있으며, 지브라 스트라이핑, 호버 효과 또는 반응형 레이아웃 등을 포함할 수 있습니다. PDF에서 테이블 생성에 대해 자세히 알아보세요.
예제 3: 페이지 번호가 있는 헤더와 푸터
이전 (MigraDoc):
// NuGet: Install-Package PDFsharp-MigraDoc-GDI
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
class Program
{
static void Main()
{
Document document = new Document();
Section section = document.AddSection();
// Add header
Paragraph headerPara = section.Headers.Primary.AddParagraph();
headerPara.AddText("Document Header");
headerPara.Format.Font.Size = 12;
headerPara.Format.Alignment = ParagraphAlignment.Center;
// Add footer
Paragraph footerPara = section.Footers.Primary.AddParagraph();
footerPara.AddText("Page ");
footerPara.AddPageField();
footerPara.Format.Alignment = ParagraphAlignment.Center;
// Add content
section.AddParagraph("Main content of the document");
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("header-footer.pdf");
}
}
이후 (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Document Header"
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>");
pdf.SaveAs("header-footer.pdf");
}
}Imports IronPdf
Class Program
Shared Sub Main()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter With {
.CenterText = "Document Header"
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page}"
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Main content of the document</h1>")
pdf.SaveAs("header-footer.pdf")
End Sub
End ClassMigraDoc 헤더와 바닥글은 section.Headers.Primary와 section.Footers.Primary 접근, 그 안에 단락 생성, AddText()로 텍스트 추가, AddPageField() 같은 특별한 방법으로 동적 콘텐츠 사용을 요구합니다. 정렬은 Format.Alignment 설정이 필요합니다.
IronPDF는 TextHeaderFooter을 사용하여 RenderingOptions.TextHeader / RenderingOptions.TextFooter에 헤더와 바닥글을 구성하며, LeftText, CenterText, RightText 영역을 포함합니다. {page} 자리표시는 현재 페이지 번호를 자동으로 삽입합니다. 더 풍부한 레이아웃을 위해 HtmlHeader / HtmlFooter을 HtmlHeaderFooter와 함께 사용하여 완전한 HTML/CSS지원을 제공합니다. 고급 옵션에 대해서는 헤더와 푸터 문서를 참조하세요.
중요한 마이그레이션 노트
페이지 번호 플레이스홀더 문법
헤더와 푸터에 가장 중요한 변화는 플레이스홀더 문법입니다:
//MigraDocfield methods:
footerPara.AddPageField(); // Current page
footerPara.AddNumPagesField(); // Total pages
//IronPDF placeholders:
"Page {page} of {total-pages}"
형식 속성을 CSS로
MigraDoc의 Format 속성은 CSS와 매핑됩니다:
// MigraDoc:
paragraph.Format.Font.Size = 16;
paragraph.Format.Font.Bold = true;
paragraph.Format.Alignment = ParagraphAlignment.Center;
//IronPDF(CSS):
<p style="font-size: 16pt; font-weight: bold; text-align: center;">' MigraDoc:
paragraph.Format.Font.Size = 16
paragraph.Format.Font.Bold = True
paragraph.Format.Alignment = ParagraphAlignment.Center
' IronPDF(CSS):
'<p style="font-size: 16pt; font-weight: bold; text-align: center;">단위 변환
MigraDoc은 다양한 단위를 사용합니다;IronPDF여백은 밀리미터 단위를 사용합니다:
- '1cm' = 10mm
- '1in' = 25.4mm
- '72pt' = 25.4mm
// MigraDoc:
table.AddColumn("3cm");
//IronPDF(CSS):
<th style="width: 3cm;">' MigraDoc:
table.AddColumn("3cm")
' IronPDF(CSS):
<th style="width: 3cm;">렌더링 패턴 변경
전체 렌더링 패턴이 변경됩니다:
//MigraDocpattern (DELETE):
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save("output.pdf");
//IronPDF pattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
문제 해결
문제 1: 문서/섹션을 찾을 수 없음
문제: IronPDF에는 Document 및 Section 클래스가 존재하지 않습니다.
해결 방법: HTML 구조로 교체하세요:
// MigraDoc
Document document = new Document();
Section section = document.AddSection();
// IronPDF
string html = "<html><body>...</body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);Imports MigraDoc.DocumentObjectModel
Imports IronPdf
Dim document As New Document()
Dim section As Section = document.AddSection()
Dim html As String = "<html><body>...</body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)문제 2: AddParagraph를 찾을 수 없음
문제: AddParagraph() 메서드가 존재하지 않습니다.
해결 방법: HTML 요소를 사용하세요:
// MigraDoc
section.AddParagraph("Hello World");
// IronPDF
"<p>Hello World</p>"net문제 3: PdfDocumentRenderer를 찾을 수 없음
문제: PdfDocumentRenderer 클래스가 존재하지 않습니다.
해결책: ChromePdfRenderer을 사용하세요:
// MigraDoc
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer();
// IronPDF
var renderer = new ChromePdfRenderer();' MigraDoc
Dim pdfRenderer As New PdfDocumentRenderer()
' IronPDF
Dim renderer As New ChromePdfRenderer()문제 4: AddPageField가 작동하지 않음
문제: AddPageField() 메서드가 존재하지 않습니다.
**해결 방법:**IronPDF플레이스홀더 문법을 사용하세요:
// MigraDoc
footerPara.AddPageField();
// IronPDF
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};' MigraDoc
footerPara.AddPageField()
' IronPDF
renderer.RenderingOptions.TextFooter = New TextHeaderFooter With {
.CenterText = "Page {page}"
}마이그레이션 체크리스트
사전 마이그레이션
- 모든MigraDoc
using문을 식별 - 문서 테이블 구조(열, 행, 스타일링)를 문서화하세요
- 헤더/푸터 콘텐츠 및 페이지 필드 사용을 기록하세요
document.Styles로 정의된 사용자 지정 스타일 목록 -IronPDF라이센스 키를 받으세요
패키지 변경 사항
PDFsharp-MigraDoc,PDFsharp-MigraDoc-GDI,PDFsharp-MigraDoc-WPF패키지 제거IronPdfNuGet Install-Package:dotnet add package IronPdf- 네임스페이스 가져오기 업데이트
코드 변경 사항
- 시작 시 라이선스 키 구성 추가
Section을 HTML 구조로 대체AddParagraph()을 HTML<p>요소로 변환Cell을 HTML<table>구조로 변환AddPageField()을{page}자리표시자로 대체AddNumPagesField()을{total-pages}자리표시자로 대체Format속성을 CSS 스타일로 변환PdfDocumentRenderer을ChromePdfRenderer으로 대체
테스트
- 기존과 새로운 PDF 간의 시각적 출력을 비교하세요
- 페이지 나누기가 올바르게 작동하는지 확인하세요
- 헤더/푸터 렌더링 및 페이지 번호를 확인하세요
- 테이블 형식 및 테두리를 검증하세요
- 복잡한 다중 페이지 문서로 테스트하세요
마이그레이션 이후
-MigraDoc관련 문서 제거
- 팀 교육 자료 업데이트
- 새 HTML 템플릿 위치 문서화

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