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

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 인쇄부터 HoloLense에 PDF 표시 또는 Instagram에 PDF 게시까지. 이미지는 어디에서나 지원되기 때문에 가능합니다.

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

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

Docotic.Pdf 라이브러리 9.3.17014-dev 회귀 테스트 14,645건의 테스트 통과 총 NuGet 다운로드 4,172,488

라이브러리의 바이너리를 다운로드하거나 NuGet 패키지를 사용할 수 있습니다. 평가 모드 제한 없이 Docotic.Pdf를 사용해 보려면 여기 양식을 사용하여 무료 시간 제한 라이센스 키를 얻을 수 있습니다.

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

Windows Forms 애플리케이션에서는 System.Drawing.Printing 네임스페이스의 클래스를 사용할 수 있습니다. 인쇄 UI를 구축하기 위한 편리한 PrintDialogPrintPreviewDialog 클래스도 있습니다.

macOS 및 Linux 환경에서는 System.Drawing 네임스페이스의 어떤 것도 사용하지 않는 것이 좋습니다. macOS 및 Linux의 System.Drawing 구현은 불완전하며 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 확장 DLLSystem.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;

    // 모든 컨텍스트에 대해 일관된 단위를 갖도록 포인트 단위로 작업합니다.
    // 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 확장 메서드를 사용하여 Graphics 개체에 현재 PDF 페이지를 그립니다.

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, PdfPrintHelperPrintSize 파일을 추가합니다
  • 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 인쇄 또는 렌더링에 대해 질문이 있는 경우 연락처로 문의하세요.