PDF를 다루는 .NET 라이브러리는 여러 가지가 있지만, 네이티브 바이너리 의존성 없이 순수 C#만으로 PDF 읽기와 생성을 모두 지원하는 오픈소스 라이브러리를 찾고 계신다면 PdfPig을 검토해 볼 만합니다.
PdfPig은 “PDF에서 텍스트를 정확하게 뽑아내야 하는” 시나리오에 강점이 있습니다. 특히 네이티브 라이브러리 의존 없이 크로스플랫폼으로 동작해야 하거나, RAG/LLM 파이프라인의 전처리 단계에서 PDF 텍스트를 구조화해야 하는 경우에 좋은 선택지입니다. 반면 고급 PDF 편집이나 복잡한 문서 생성이 주 목적이라면 다른 라이브러리를 함께 검토하시는 것이 좋겠습니다.
사실 PdfPig이 닷넷데브 포럼에서 언급된 것은 이번이 처음은 아닙니다. 2021년 8월, honeyhead 님이 C# Worker Service와 iTextSharp을 활용해 만든 HWP→PDF 변환 앱을 소개하는 글에서 iTextSharp과 PdfPig의 혼용을 추천하신 적이 있었습니다. 당시 PdfPig GitHub 이슈에서 CJK(한중일) 관련 문제를 직접 해결하신 경험도 함께 공유해 주셨는데, 그로부터 약 5년이 지난 지금 PdfPig은 NuGet 누적 다운로드 약 2천만 회에 달하는 라이브러리로 성장했습니다. 이 글에서는 현재 시점 기준으로 PdfPig의 주요 기능과 활용 포인트를 정리해 보겠습니다.
PdfPig은 Java 진영의 Apache PDFBox를 C#으로 포팅한 것에서 출발한 라이브러리입니다. PDF 문서에서 텍스트와 콘텐츠를 추출하고, 기본적인 PDF 문서 생성도 지원합니다.
-
라이선스: Apache 2.0
-
최신 안정 버전: 0.1.13 (2025년 12월)
-
대상 프레임워크: .NET 6.0+, .NET Standard 2.0, .NET Framework 4.6.2
-
NuGet 누적 다운로드: 약 1,970만 회
-
GitHub:
2.4k / Fork 311
dotnet add package PdfPig
가장 기본적인 사용법은 PDF를 열어서 페이지별로 텍스트를 읽는 것입니다.
using UglyToad.PdfPig;
using UglyToad.PdfPig.DocumentLayoutAnalysis.TextExtractor;
using (var document = PdfDocument.Open(@"document.pdf"))
{
foreach (var page in document.GetPages())
{
string text = ContentOrderTextExtractor.GetText(page);
}
}
여기서 한 가지 주의할 점이 있습니다. page.Text 속성을 직접 사용하면 PDF 내부의 콘텐츠 스트림 순서 그대로 텍스트가 반환되므로, 사람이 읽는 순서와 다를 수 있습니다. ContentOrderTextExtractor나 NearestNeighbourWordExtractor 같은 레이아웃 분석 도구를 사용하는 것이 권장됩니다.
PdfDocumentBuilder를 사용하면 새 PDF를 만들 수 있습니다. Standard 14 폰트와 TrueType 폰트(.ttf)를 지원합니다.
using UglyToad.PdfPig.Writer;
using UglyToad.PdfPig.Fonts.Standard14Fonts;
using UglyToad.PdfPig.Core;
var builder = new PdfDocumentBuilder();
var page = builder.AddPage(PageSize.A4);
var font = builder.AddStandard14Font(Standard14Font.Helvetica);
page.AddText("Hello from PdfPig!", 12, new PdfPoint(25, 700), font);
byte[] pdfBytes = builder.Build();
File.WriteAllBytes("output.pdf", pdfBytes);
그 외에도 PdfPig의 차별점 중 하나는 문서 레이아웃 분석(Document Layout Analysis) 기능이 내장되어 있다는 것입니다. 단어 추출, 텍스트 블록 분할, 읽기 순서 감지를 파이프라인으로 구성할 수 있습니다.
var letters = page.Letters;
// 1. 단어 추출
var words = NearestNeighbourWordExtractor.Instance.GetWords(letters);
// 2. 텍스트 블록 분할
var textBlocks = DocstrumBoundingBoxes.Instance.GetBlocks(words);
// 3. 읽기 순서 감지
var ordered = UnsupervisedReadingOrderDetector.Instance.Get(textBlocks);
RAG 파이프라인이나 LLM에 PDF 텍스트를 입력으로 넣어야 하는 경우, 이 레이아웃 분석 기능이 특히 유용합니다.
그 외에도 다음의 기능들을 지원합니다.
-
PDF 병합:
PdfMerger.Merge()로 여러 PDF를 하나로 합칠 수 있습니다. -
암호화된 PDF:
ParsingOptions에 비밀번호를 전달하여 암호화된 문서를 열 수 있습니다. -
이미지 추출:
page.GetImages()로 페이지에 포함된 이미지 객체에 접근 가능합니다. -
어노테이션 / 하이퍼링크:
page.GetAnnotations(),page.GetHyperlinks()를 제공합니다. -
북마크:
document.TryGetBookmarks()로 문서의 아웃라인 구조를 읽을 수 있습니다. -
AcroForm:
document.TryGetForm()으로 폼 필드를 읽을 수 있습니다 (읽기 전용). -
내장 파일 추출: PDF에 임베딩된 파일의 바이트를 꺼낼 수 있습니다.
-
TrueType 폰트 파싱: TTF 파일을 직접 파싱하여 글리프 정보를 조회할 수 있습니다.
다만 고려해야 할 점들도 있습니다.
-
아직 1.0 이전 버전이므로 마이너 버전 업데이트 시 공개 API가 변경될 수 있습니다(SemVer 미적용).
-
PDF 생성 기능은 기본적인 수준이며, 기존 문서의 폼 편집이나 어노테이션 수정은 지원하지 않습니다.
-
텍스트 작성 시 Standard 14 폰트와 TrueType 폰트만 사용할 수 있습니다.
-
SkiaSharp 기반의 PDF 렌더링 확장 패키지(
PdfPig.Rendering.Skia)도 별도로 제공됩니다.
관련 링크
이 글은 AI의 도움을 받아 요약/작성된 글입니다.