Попытка распечатать документ в формате base64 завершается неудачей с сообщением “параметр недействителен”.

Вопрос или проблема

Я пробую следующее:

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

Объяснение кода:

  1. Конвертация Base64 в байты: Мы начинаем с преобразования строки Base64 в байтовый массив.
  2. Загрузка PDF-документа: Используется библиотека PdfiumViewer для загрузки PDF-документа из потока памяти.
  3. Создание PrintDocument: Настраивается объект PrintDocument, который обрабатывает печать.
  4. Обработка события PrintPage: В этом событии происходит рендеринг каждой страницы PDF и её печать. Поля и размеры сохраняются с помощью e.MarginBounds.
  5. Исключение: Ошибки логгируются для решения возможных проблем.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...