이 페이지에는 자동 번역된 텍스트가 포함될 수 있습니다.

C# 및 VB.NET에서 PDF 문서 렌더링 및 인쇄

대부분의 사람들은 PDF 문서를 읽을 때 Adobe Reader를 떠올립니다. 하지만 소프트웨어 개발자이고 애플리케이션에서 PDF 문서를 표시하려면 어떻게 해야 할까요? 사용자에게 Adobe Reader를 설치하고 그곳에서 문서를 열도록 요청하고 싶지는 않을 것입니다.

PDF 관련 다른 요구 사항도 구현해야 할 수 있습니다. 예를 들어 PDF 문서를 인쇄하거나, 업로드된 PDF 문서의 축소판을 생성하거나, 데스크톱 또는 웹 애플리케이션에서 PDF 편집을 지원해야 할 수 있습니다.

필요한 것은 PDF 문서를 렌더링하고 인쇄할 수 있는 PDF 라이브러리뿐입니다.

C#에서 PDF 인쇄

PDF 문서를 보고, 편집하거나 인쇄하기 위한 .NET 라이브러리

Docotic.Pdf 라이브러리를 사용하면 C# 및 VB.NET에서 PDF 문서를 표시, 편집, 인쇄할 수 있습니다. 세 가지 핵심 기능을 사용해 복잡한 PDF 렌더링 흐름을 구현할 수 있습니다.

첫 번째는 PDF를 이미지로 변환하는 기능입니다. 이 기능을 기반으로 거의 모든 것을 구현할 수 있습니다. PDF 인쇄부터 HoloLens에 PDF를 표시하거나 Instagram에 PDF를 게시하는 것까지 가능합니다. 이는 이미지가 어디에서나 지원되기 때문에 가능합니다.

두 번째 핵심 기능은 System.Drawing.Graphics의 그리기 표면에 PDF 페이지를 그릴 수 있는 기능입니다. 이 기능을 사용하면 Windows Forms 또는 WPF 애플리케이션에서 PDF를 렌더링하고 인쇄할 수 있습니다. 이 기능을 사용하려면 프로젝트에 BitMiracle.Docotic.Pdf.Gdi 확장 DLL을 추가하세요.

마지막으로 중요한 기능은 PDF 페이지 개체를 추출할 수 있는 기능입니다. 이 기능을 사용하면 C# 또는 VB.NET 애플리케이션에서 PDF 뷰어 또는 PDF 편집기를 만들 수 있습니다.

라이브러리와 기간 제한이 있는 무료 라이선스 키는 C# .NET PDF 라이브러리 다운로드 페이지에서 받을 수 있습니다.

.NET은 기본적으로 PDF 문서 인쇄를 지원하지 않습니다. PDF 문서를 이미지나 XPS 파일로 변환하거나 System.Drawing.Graphics 표면에 그려야 합니다. 그런 다음 .NET 클래스를 사용해 Windows Forms 또는 WPF 애플리케이션에서 출력을 인쇄할 수 있습니다.

Windows Forms 애플리케이션에서는 System.Drawing.Printing 네임스페이스의 클래스를 사용할 수 있습니다. 인쇄 UI를 만들 때 유용한 PrintDialogPrintPreviewDialog 클래스도 있습니다.

macOS 및 Linux 환경에서는 System.Drawing 네임스페이스의 어떤 기능도 사용하는 것을 권장하지 않습니다. System.Drawing의 macOS 및 Linux 구현은 Windows 구현과 다르고 완전하지 않습니다. macOS 및 Linux 환경에서 System.Drawing 네임스페이스를 사용하면 잘못되거나 일관되지 않은 결과가 나올 수 있습니다.

WPF는 또 다른 PrintDialog 클래스를 제공하지만 인쇄 미리 보기를 위한 클래스는 제공하지 않습니다. 다행히도 WPF에서는 System.Windows.Forms.dll의 PrintPreviewDialog 클래스를 사용할 수 있습니다. 따라서 WPF 애플리케이션에서는 System.Windows.FormsSystem.Drawing.Printing 네임스페이스의 인쇄 클래스를 사용하는 것이 더 쉽습니다.

WinForms 및 WPF용 C# 및 VB.NET 버전으로 제공되는 “.NET에서 PDF 인쇄” 데모 애플리케이션을 보세요. 이 애플리케이션은 다음 방법을 보여줍니다:

  • PDF 문서의 인쇄 미리 보기 표시
  • 선택한 프린터로 PDF 문서 인쇄
  • 용지 크기, 배율 모드 및 기타 인쇄 설정 지정

이 애플리케이션은 Docotic.Pdf 라이브러리, BitMiracle.Docotic.Pdf.Gdi 확장 DLL, 그리고 System.Windows.FormsSystem.Drawing.Printing 네임스페이스의 인쇄 클래스를 사용합니다. WPF 또는 Windows Forms 프로젝트에서 PdfPrintDocumentPdfPrintHelper 클래스를 사용할 수 있습니다.

PdfPrintDocument 클래스는 주요 인쇄 로직을 설명합니다. 이 클래스는 Docotic.Pdf와 System.Drawing.Printing.PrintDocument 클래스를 연결합니다. 핵심 메서드는 printDocument_PrintPage 이벤트 처리기입니다:

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics ?? throw new InvalidOperationException("No Graphics!");

    // 모든 컨텍스트에서 일관된 단위를 사용하려면 포인트 단위로 작업합니다:
    // 1. 프린터
    // 2. 인쇄 미리 보기
    // 3. PDF
    gr.PageUnit = GraphicsUnit.Point;

    if (m_printAction == PrintAction.PrintToPreview)
    {
        gr.Clear(Color.LightGray);
        gr.FillRectangle(Brushes.White, m_printableAreaInPoints);
        gr.IntersectClip(m_printableAreaInPoints);

        gr.TranslateTransform(m_printableAreaInPoints.X, m_printableAreaInPoints.Y);
    }

    PdfPage page = m_pdf.Pages[m_pageIndex];
    PdfSize pageSizeInPoints = getPageSizeInPoints(page);

    if (m_printSize == PrintSize.FitPage)
    {
        float sx = (float)(m_printableAreaInPoints.Width / pageSizeInPoints.Width);
        float sy = (float)(m_printableAreaInPoints.Height / pageSizeInPoints.Height);
        float scaleFactor = Math.Min(sx, sy);

        centerContentInPrintableArea(gr, pageSizeInPoints, scaleFactor);
        gr.ScaleTransform(scaleFactor, scaleFactor);
    }
    else if (m_printSize == PrintSize.ActualSize)
    {
        centerContentInPrintableArea(gr, pageSizeInPoints, 1);
    }

    page.Draw(gr);

    ++m_pageIndex;
    e.HasMorePages = (m_pageIndex <= m_lastPageIndex);
}

먼저, 인쇄된 페이지의 Graphics 객체 변환을 설정합니다. "페이지 맞춤" 및 "실제 크기" 설정을 준수하는 것이 중요합니다. 또한 인쇄 미리 보기 대화 상자에서 프린터의 하드 여백도 표시합니다. 그런 다음 PdfPage.Draw 확장 메서드를 사용해 현재 PDF 페이지를 Graphics 객체에 그립니다.

PdfPrintHelper 클래스를 사용하면 인쇄용 UI 클래스와 함께 PdfPrintDocument를 사용할 수 있습니다. 예를 들어 다음과 같이 PDF 문서의 인쇄 대화 상자를 표시할 수 있습니다:

using (var pdf = new PdfDocument("your_document.pdf"))
    action(pdf, getPrintSize());

public static DialogResult ShowPrintDialog(PdfDocument pdf, PrintSize printSize)
{
    using (var printDialog = new PrintDialog())
    {
        printDialog.AllowSomePages = true;
        printDialog.AllowCurrentPage = true;
        printDialog.AllowSelection = true;

        printDialog.PrinterSettings.MinimumPage = 1;
        printDialog.PrinterSettings.MaximumPage = pdf.PageCount;
        printDialog.PrinterSettings.FromPage = printDialog.PrinterSettings.MinimumPage;
        printDialog.PrinterSettings.ToPage = printDialog.PrinterSettings.MaximumPage;

        var result = printDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            using (var printDocument = new PdfPrintDocument(pdf, printSize))
                printDocument.Print(printDialog.PrinterSettings);
        }

        return result;
    }
}

이제 끝입니다. Windows Forms 또는 WPF 애플리케이션에서 PDF 인쇄를 구현하려면 다음을 수행하세요:

  • 샘플PdfPrintDocument, PdfPrintHelper, PrintSize 파일 추가
  • Docotic.Pdf 라이브러리 참조 추가
  • BitMiracle.Docotic.Pdf.Gdi 확장 DLL 참조 추가
  • (WPF만 해당) System.Windows.Forms 및 System.Drawing 어셈블리 참조 추가

System.Drawing.Printing 네임스페이스의 클래스는 Windows Forms 및 WPF 애플리케이션에서 잘 작동합니다. 하지만 System.Drawing.Printing을 사용할 수 없거나 사용해서는 안 되는 경우도 있습니다.

예를 들어 Windows 서비스나 ASP.NET 애플리케이션에서는 System.Drawing.Printing을 사용하면 안 됩니다. Linux 또는 macOS에서 인쇄할 때 System.Drawing.Printing이 일관되지 않은 결과를 생성할 수 있습니다. 또한 Eto.Forms 또는 Avalonia 애플리케이션에서는 System.Drawing.Printing을 사용할 수 없습니다.

이런 경우 먼저 PDF 문서를 이미지로 변환해야 합니다. 다음 C# 샘플은 PDF 페이지를 PNG 이미지로 저장하거나 전체 PDF 문서를 다중 페이지 TIFF로 변환하는 방법을 보여줍니다:

using var pdf = new PdfDocument(@"your_document.pdf");

PdfDrawOptions options = PdfDrawOptions.Create();
options.HorizontalResolution = printerDpi;
options.VerticalResolution = printerDpi;

// save one page
pdf.Pages[0].Save("page0.png", options);

// save the whole document as multipage bitonal TIFF
options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
pdf.SaveAsTiff("your_document.tiff", options);

그런 다음 대체 인쇄 프레임워크나 도구를 사용해 이미지를 인쇄합니다. System.Drawing.Printing 없이 PDF 문서를 인쇄하는 방법을 보여주는 Eto.Forms에서 PDF 인쇄 데모 애플리케이션을 보세요.

C# 및 VB.NET에서 PDF 렌더링하기

애플리케이션에서 PDF를 표시하는 것은 인쇄와 비슷합니다. ASP.NET, WPF, Eto.Forms, Avalonia 또는 다른 어떤 애플리케이션 유형이든 PDF를 이미지로 변환한 다음 이미지를 표시하면 됩니다.

Windows Forms 앱에서는 모든 컨트롤에서 System.Drawing.Graphics 컨텍스트에 PDF 페이지를 그릴 수 있습니다. 또는 PDF 페이지를 System.Drawing.Bitmap으로 변환한 다음 PictureBox에 비트맵을 표시할 수도 있습니다.

다음 샘플은 C#에서 PDF 페이지를 Bitmap으로 변환하는 방법을 보여줍니다:

using var pdf = new PdfDocument("render.pdf");
const float TargetResolution = 300;

PdfPage page = pdf.Pages[0];
double scaleFactor = TargetResolution / page.Resolution;

using var bitmap = new Bitmap((int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor));
bitmap.SetResolution(TargetResolution, TargetResolution);

using (Graphics gr = Graphics.FromImage(bitmap))
    page.Draw(gr);

bitmap.Save("result.png");

위 코드를 사용하려면 프로젝트에 BitMiracle.Docotic.Pdf.Gdi 확장 DLL을 추가해야 합니다.

.NET 애플리케이션에서 PDF 뷰어 또는 PDF 편집기 만들기

Docotic.Pdf를 사용하면 PDF 페이지의 모든 개체에 대한 자세한 정보를 얻을 수 있습니다. PDF 페이지에서 텍스트 조각, 이미지, 벡터 경로, 폼 컨트롤 및 주석을 추출할 수 있습니다.

그런 다음 애플리케이션에서 추출한 모든 개체를 렌더링할 수 있습니다. 렌더링된 개체를 선택하고 편집하는 기능도 구현할 수 있습니다.

PDF에서 텍스트, 이미지 및 경로 추출 샘플을 보세요. 페이지 개체를 System.Drawing.Graphics 컨텍스트로 추출하고 그리는 방법을 보여줍니다.

텍스트 개체를 벡터 경로로 추출할 수도 있습니다. 이를 위해 PdfPage.GetObjects(PdfObjectExtractionOptions) 오버로드를 사용하세요.

결론

Docotic.Pdf 라이브러리를 사용해 .NET 프로젝트에서 PDF 문서를 표시하고 인쇄하세요. 관련 C# 및 VB.NET 샘플도 확인해 보세요:

PDF 인쇄 또는 렌더링에 대해 궁금한 점이 있으면 문의하기 바랍니다.