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

Рендеринг и печать 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.5.17664-dev Регрессионные тесты 14,820 прошло Всего загрузок NuGet 4,998,853

Получите библиотеку и бесплатный лицензионный ключ с ограниченным сроком действия на странице Скачать PDF библиотеку C# .NET.

.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.