Эта страница может содержать автоматически переведенный текст.
Рендеринг и печать PDF-документов на C# и VB.NET
Когда дело доходит до чтения PDF-документов, все думают об Adobe Reader. Но что делать, если ты вы разработчик программного обеспечения и хотите отображать PDF-документы в своем приложении? Вы не хотите просить пользователя установить Adobe Reader и открыть документ там.
Вам также может потребоваться реализовать другие требования, связанные с PDF. Например, распечатать PDF-документы. Или создать миниатюры для загруженных PDF-документов. Или поддерживать редактирование PDF в настольном или веб-приложении.
Все, что вам нужно, — это библиотека PDF, которая может отображать и печатать PDF-документы.
Библиотека .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.
9.5.17664-dev 14,820 прошло Всего загрузок NuGet 4,998,853Получите библиотеку и бесплатный лицензионный ключ с ограниченным сроком действия на странице Скачать PDF библиотеку C# .NET.
Печать PDF в Windows Forms или приложении WPF
.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.
Печать PDF через конвертацию в изображение
Классы из пространства имен 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.
Связанные ресурсы
- Статья Конвертировать PDF в изображение на C# и VB.NET
- Примеры про Рендеринг и печать PDF