Эта страница может содержать автоматически переведенный текст.

Рендеринг и печать PDF-документов на C# и VB.NET

Когда дело доходит до чтения PDF-документов, все думают об Adobe Reader. Но что делать, если ты вы разработчик программного обеспечения и хотите отображать PDF-документы в своем приложении? Вы не хотите просить пользователя установить Adobe Reader и открыть документ там.

Вам также может потребоваться реализовать другие требования, связанные с PDF. Например, распечатать PDF-документы. Или создать миниатюры для загруженных PDF-документов. Или поддерживать редактирование PDF в настольном или веб-приложении.

Все, что вам нужно, — это библиотека PDF, которая может отображать и печатать PDF-документы.

Печать PDF на C#

Библиотека .NET для просмотра, редактирования или печати PDF-документов

Библиотека Docotic.Pdf позволяет отображать, редактировать и печатать PDF-документы на C# и VB.NET. Вы можете реализовать любой сложный процесс рендеринга PDF, используя три основные функции.

Первая — это возможность конвертировать PDF в изображения. Вы можете реализовать почти всё на основе этой функции. От печати PDF до отображения PDF на HoloLense или публикация PDF-файла в Instagram. Это возможно, поскольку изображения поддерживаются повсюду.

Вторая ключевая особенность — возможность рисовать страницы PDF на поверхности рисования типа System.Drawing.Graphics. Эта возможность позволяет отображать и печатать PDF-файлы в приложениях Windows Forms или WPF. Чтобы использовать эту функцию, добавьте DLL дополнения BitMiracle.Docotic.Pdf.Gdi в ваш проект.

И последнее, но не менее важное: возможность извлекать объекты страниц PDF. Эта функция позволяет создавать средство просмотра PDF-файлов или редактор PDF-файлов в вашем приложении на C# или VB.NET.

Библиотека Docotic.Pdf 9.3.16887-dev Регрессионные тесты 14,635 прошло Всего загрузок NuGet 4,075,269

Вы можете загрузить бинарные файлы библиотеки или использовать ее пакет NuGet. Чтобы попробовать Docotic.Pdf без ограничений ознакомительного режима, вы можете получить бесплатный ограниченный по времени лицензионный ключ, используя форму здесь.

.NET не поддерживает печать PDF-документов «из коробки». Вам нужно преобразовать PDF-документ в изображение, файл XPS или нарисовать его на поверхности System.Drawing.Graphics. После этого вы сможете использовать классы .NET для печати результата из Windows Forms или приложения WPF.

В приложениях Windows Forms вы можете использовать классы из пространства имен System.Drawing.Printing. Там также есть удобные классы PrintDialog и PrintPreviewDialog для создания пользовательского интерфейса печати.

Обратите внимание, что не рекомендуется использовать что-либо из пространства имен System.Drawing в macOS и Linux. Реализации System.Drawing для macOS и Linux неполны и отличаются от реализации в Windows. Вы можете получить неверные и/или отличающиеся результаты если вы используете пространство имен System.Drawing в средах macOS и Linux.

WPF предоставляет другой класс PrintDialog, но не предоставляет классы для предварительного просмотра печати. К счастью, WPF позволяет вам использовать класс PrintPreviewDialog из System.Windows.Forms.dll. Таким образом, проще использовать классы печати из пространств имен System.Windows.Forms и System.Drawing.Printing в WPF приложениях.

Посмотрите демонстрационное приложение Печать PDF в .NET, которое поставляется в версиях на C# и VB.NET для WinForms и WPF. Приложение показывает как:

  • отображать предварительный просмотр PDF-документов
  • распечатывать PDF-документы на выбранном принтере
  • настроить размер бумаги, режим масштабирования и другие параметры печати

Приложение использует библиотеку Docotic.Pdf, DLL дополнения BitMiracle.Docotic.Pdf.Gdi, и классы для печати из пространств имен System.Windows.Forms и System.Drawing.Printing. Вы можете использовать классы PdfPrintDocument и PdfPrintHelper из приложения в ваших проектах WPF или Windows Forms.

Класс PdfPrintDocument описывает основную логику печати. Этот класс соединяет Docotic.Pdf с классом System.Drawing.Printing.PrintDocument. Ключевым методом является обработчик событий printDocument_PrintPage:

private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics gr = e.Graphics;

    // Работаем в точках, чтобы иметь одинаковые единицы измерения для всех контекстов:
    // 1. Printer
    // 2. Print preview
    // 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 для печатаемой страницы. Важно уважать настройки «По размеру страницы» и «Реальный размер». И мы также отображаем жесткие поля принтера в диалоге предварительного просмотра печати. Затем мы рисуем текущую страницу PDF на объекте Graphics, используя метод дополнения PdfPage.Draw.

Класс PdfPrintHelper позволяет использовать 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;
    }
}

Вот и всё. Выполните следующие действия, чтобы реализовать печать PDF в приложении Windows Forms или WPF:

  • добавьте файлы PdfPrintDocument, PdfPrintHelper и PrintSize из примера
  • добавьте ссылку на библиотеку Docotic.Pdf
  • добавьте ссылку на DLL дополнения BitMiracle.Docotic.Pdf.Gdi
  • (только для WPF) добавьте ссылки на сборки System.Windows.Forms и System.Drawing.

Классы из пространства имен System.Drawing.Printing хорошо работают в приложениях Windows Forms и WPF. Но бывают случаи, когда вы не можете или не должны использовать System.Drawing.Printing.

Например, вам не следует использовать System.Drawing.Printing в службах Windows или приложениях ASP.NET. System.Drawing.Printing может давать отличающиеся результаты при печати в Linux или macOS. И вы не можете использовать System.Drawing.Printing в приложениях Eto.Forms или Avalonia.

В таких случаях вам необходимо сначала конвертировать PDF-документ в изображение. Этот примере на C# показывает, как сохранить страницу PDF в виде изображения PNG или преобразовать весь документ PDF в многостраничный TIFF:

using (var pdf = new PdfDocument(@"your_document.pdf"))
{
    PdfDrawOptions options = PdfDrawOptions.Create();
    options.HorizontalResolution = printerDpi;
    options.VerticalResolution = printerDpi;

    // сохранить одну страницу
    pdf.Pages[0].Save("page0.png", options);

    // сохранить весь документ как многостраничный битональный TIFF
    options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
    pdf.SaveAsTiff("your_document.tiff", options);
}

Затем распечатайте изображения, используя альтернативную платформу или инструмент печати. Посмотрите демонстрационное приложение Распечатать PDF в Это.Forms, которое показывает, как печатать PDF-документы без System.Drawing.Printing.

Рендеринг PDF в C# и VB.NET

Отображение PDF-файла в вашем приложении похоже на печать. В ASP.NET, WPF, Eto.Forms, Avalonia или приложении любого другого типа конвертируйте PDF в изображение, а затем отобразите изображение.

В приложении Windows Forms вы можете нарисовать страницу PDF на контексте System.Drawing.Graphics от любого элемента управления. Или вы можете преобразовать страницу PDF в System.Drawing.Bitmap, а затем отобразить растровое изображение в PictureBox.

В этом примере показано, как преобразовать страницу PDF в Bitmap на C#:

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");
    }
}

Приведенный выше код требует, чтобы вы добавили DLL дополнения BitMiracle.Docotic.Pdf.Gdi в ваш проект.

Создать программу просмотра PDF или редактор PDF в приложении .NET

Docotic.Pdf позволяет получить подробную информацию о каждом объекте на странице PDF. Вы можете извлекать фрагменты текста, изображения, векторные пути, элементы управления форм и аннотации со страницы PDF.

Затем в своем приложении вы можете визуализировать все извлеченные объекты. Вы также можете реализовать возможность выбора и редактирования визуализированных объектов.

Посмотрите пример Извлечь текст, изображения и пути из PDF. Он показывает, как извлекать и рисовать объекты страницы на контексте System.Drawing.Graphics.

Вы также можете извлекать текстовые объекты как векторные пути. Используйте для этого перегрузку PdfPage.GetObjects(PdfObjectExtractionOptions).

Вывод

Используйте библиотеку Docotic.Pdf для отображения и печати PDF-документов в ваших проектах .NET. Посмотрите соответствующие примеры на C# и VB.NET:

Свяжитесь с нами, если у вас есть вопросы о печати или рендеринге PDF.