Вопрос или проблема
Я пробую следующее:
try
{
using (var memoryStream = new MemoryStream(pdfBytes))
{
// Загружаем PDF документ
PdfSharp.Pdf.PdfDocument pdfDocument = PdfReader.Open(memoryStream, PdfDocumentOpenMode.ReadOnly);
// Печатаем каждую страницу
for (int i = 0; i < pdfDocument.PageCount; i++)
{
using (var printDocument = new PrintDocument())
{
printDocument.PrinterSettings.PrinterName = printerName;
// Обрабатываем событие PrintPage
printDocument.PrintPage += (sender, e) =>
{
PdfSharp.Events.RenderEvents renderEvents = new PdfSharp.Events.RenderEvents();
XGraphics graphics = XGraphics.FromGraphics(e.Graphics, new XSize(e.MarginBounds.Width, e.MarginBounds.Height), renderEvents);
// Получаем текущую страницу для печати
var page = pdfDocument.Pages[i];
var pageWidth = page.Width;
var pageHeight = page.Height;
// Рассчитываем масштаб, чтобы вписать страницу
var scaleX = e.MarginBounds.Width / pageWidth;
var scaleY = e.MarginBounds.Height / pageHeight;
var scale = Math.Min(scaleX, scaleY);
// Центрируем страницу на принтере
var xPos = e.MarginBounds.Left + (e.MarginBounds.Width - (pageWidth * scale)) / 2;
var yPos = e.MarginBounds.Top + (e.MarginBounds.Height - (pageHeight * scale)) / 2;
// Рисуем содержимое страницы PDF
XImage xImage = XImage.FromStream(memoryStream);
graphics.DrawImage(xImage, xPos, yPos, pageWidth * scale, pageHeight * scale);
// Рисуем прямоугольник для границы страницы
graphics.DrawRectangle(XPens.Black, xPos, yPos, pageWidth * scale, pageHeight * scale);
};
// Запускаем задание на печать
printDocument.Print();
}
}
}
}
Но когда начинается фактическая печать, возникает ошибка
Параметр недействителен
Теперь я предполагаю, что это связано с событиями отрисовки, которые я оставил пустыми, но я правда не смог найти что-то, что хотел бы туда добавить; но возможно, это вовсе не проблема.
У кого-нибудь есть какие-либо советы?
Спасибо!
Я не знаю, откуда возникает ошибка “Параметр недействителен”.
Но строка graphics.DrawImage(xImage, [...]
никогда не выполнит то, что вы ожидаете, потому что объект graphics
был создан для объекта Graphics GDI+, в то время как объект xImage
был создан для PDF файла.
GDI+ не может рисовать изображения PDF.
Объекты XGraphics, созданные для страниц PDF, могут рисовать страницы PDF.
Но, кратко говоря: PDFsharp не может печатать PDF файлы и не может отображать PDF файлы.
Ответ или решение
Ваш вопрос касается проблемы с печатью PDF-документа из массива байтов в формате Base64 с использованием библиотеки PdfSharp. Ошибка "Parameter is not valid" возникает из-за неправильного использования объектов для отрисовки, поскольку PdfSharp не поддерживает печать документов PDF напрямую. В данном ответе я предоставлю вам правильный подход к решению данной проблемы.
1. Проблема с использованием XImage
Как упомянуто в вашем вопросе, строка, где вызывается graphics.DrawImage(xImage, ...)
, может вызывать ошибку, так как xImage
был создан для работы с PDF-файлом, а graphics
был создан для GDI+ графики. Это несовместимые подходы. PdfSharp не может отобразить PDF-страницы непосредственно, так как это не предназначение этой библиотеки.
2. Альтернативное решение
Чтобы напечатать PDF-документ, лучше всего использовать библиотеку, которая предназначена для работы с PDF-файлами и имеет возможности печати. Вы можете рассмотреть использование библиотеки, такой как PdfiumViewer или Ghostscript. Ниже я приведу пример, как можно реализовать печать с использованием PdfiumViewer.
Пример кода с использованием PdfiumViewer
using PdfiumViewer;
using System;
using System.Drawing.Printing;
using System.IO;
using System.Windows.Forms;
// ...
try
{
byte[] pdfBytes = Convert.FromBase64String(base64PdfString); // Преобразование Base64 в байтовый массив
using (var memoryStream = new MemoryStream(pdfBytes))
{
using (var pdfDocument = PdfiumViewer.PdfDocument.Load(memoryStream))
{
PrintDocument printDocument = new PrintDocument();
printDocument.PrinterSettings.PrinterName = printerName;
printDocument.PrintPage += (sender, e) => {
var pageNumber = e.PageSettings.PrinterSettings.ToPage - 1;
if (pageNumber < pdfDocument.PageCount)
{
pdfDocument.Render(pageNumber, e.Graphics, e.MarginBounds, PdfRenderFlags.Annotations);
e.HasMorePages = pageNumber + 1 < pdfDocument.PageCount;
}
else
{
e.HasMorePages = false;
}
};
printDocument.Print();
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Произошла ошибка: {ex.Message}");
}
Объяснение кода:
- Конвертация Base64 в байты: Мы начинаем с преобразования строки Base64 в байтовый массив.
- Загрузка PDF-документа: Используется библиотека PdfiumViewer для загрузки PDF-документа из потока памяти.
- Создание PrintDocument: Настраивается объект
PrintDocument
, который обрабатывает печать. - Обработка события PrintPage: В этом событии происходит рендеринг каждой страницы PDF и её печать. Поля и размеры сохраняются с помощью
e.MarginBounds
. - Исключение: Ошибки логгируются для решения возможных проблем.
Заключение
Использование PdfiumViewer обеспечит корректный рендеринг и печать PDF-документов. Убедитесь, что у вас установлены все необходимые зависимости и библиотеки для работы с PdfiumViewer, чтобы избежать дополнительных проблем. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать.