Печать PDF-файлов С#

Многие компании в значительной степени сокращают использование бумаги. Однако в некоторых случаях печать важна. Например, система может содержать детали онлайн-заказа в формате PDF. Им необходимо распечатать PDF-файл при отправке онлайн-заказа на доставку. Они обрабатывают элементы в больших масштабах, поэтому печать каждого документа вручную может быть довольно сложной задачей. Aspose.PDF for .NET API, в дополнение ко многим другим функциям обработки и преобразования файлов, поддерживает эффективную печать файлов PDF. Давайте рассмотрим следующие варианты использования, связанные с печатью PDF-файлов в приложениях .NET с помощью C#:

Распечатать файл PDF с помощью С#

Печать файлов PDF можно автоматизировать в приложениях .NET с помощью C# или VB.net. Вы можете распечатать PDF-файлы, выполнив следующие простые действия:

  1. Создайте объект класса PdfViewer
  2. Загрузить входной PDF-документ
  3. Распечатать PDF-файл

Фрагмент кода ниже показывает, как распечатать файл PDF с помощью C#:

//Создать объект PdfViewer
PdfViewer viewer = new PdfViewer();
//Открыть исходный PDF-файл
viewer.BindPdf(dataDir + "Test.pdf");
//Распечатать PDF-документ
viewer.PrintDocument();
//Закрыть PDF-файл
viewer.Close();

Печать нескольких PDF-файлов с помощью C#

Если вам необходимо распечатать несколько файлов из-за характера вашего бизнеса, эта функция уже поддерживается Aspose.PDF для .NET API. Печать нескольких PDF-файлов один за другим с помощью приведенного выше фрагмента кода может быть немного медленной. Поэтому давайте сделаем PDF-печать еще на один шаг вперед, чтобы упростить процесс. Здесь мы будем использовать список при добавлении имени каждого файла PDF в этот список. Следующие шаги объясняют, как мы будем печатать несколько файлов PDF:

  1. Инициализировать список строкового типа
  2. Добавить файлы PDF в список
  3. Загрузить исходный PDF-файл
  4. Печать нескольких PDF-файлов

Фрагмент кода показывает, как распечатать несколько PDF-файлов с помощью C#:

var files = new List<string>();
files.Add(dataDir + "First.pdf");
files.Add(dataDir + "Second.pdf");

foreach (String file in files)
{
    //Создать объект PdfViewer
    PdfViewer viewer = new PdfViewer();
    //Открыть исходный PDF-файл
    viewer.BindPdf(file);
    //Распечатать PDF-документ
    viewer.PrintDocument();
    //Закрыть PDF-файл
    viewer.Close();
}

Печать определенных страниц PDF с помощью С#

Функция печати определенных страниц PDF-документов доступна в API. Мы рассмотрим пример, включающий печать нескольких диапазонов страниц. Вам необходимо указать номера страниц от и до, как описано в следующих шагах:

  • Установите пути ввода и вывода файла
  • Установите печать определенных страниц, указав диапазон
  • Укажите параметры печати
  • Распечатайте страницы, как указано ранее

Фрагмент кода ниже показывает, как распечатать определенные страницы документа с помощью C#:

string inPdf = dataDir + "Test.pdf";
string output = dataDir;
IList<PrintingJobSettings> printingJobs = new List<PrintingJobSettings>();
PrintingJobSettings printingJob1 = new PrintingJobSettings();
printingJob1.FromPage = 2;
printingJob1.ToPage = 3;
printingJobs.Add(printingJob1);

PrintingJobSettings printingJob2 = new PrintingJobSettings();
printingJob2.FromPage = 5;
printingJob2.ToPage = 7;
printingJobs.Add(printingJob2);

{
    for (var printingJobIndex = 0; printingJobIndex < printingJobs.Count; printingJobIndex++)
    {
        System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
        System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
        ps.PrinterName = "Microsoft Print to PDF";
        ps.PrintRange = System.Drawing.Printing.PrintRange.SomePages;
        ps.FromPage = printingJobs[printingJobIndex].FromPage;
        ps.ToPage = printingJobs[printingJobIndex].ToPage;
        System.Console.WriteLine(ps.FromPage);
        System.Console.WriteLine(ps.ToPage);
        System.Console.WriteLine(printingJobIndex);
        using (var theViewer = new Aspose.Pdf.Facades.PdfViewer())
        {
            // Здесь находится код печати документа
            // Печать документа с использованием настроек принтера и страницы                    
            theViewer.BindPdf(inPdf);
            theViewer.AutoResize = true;
            theViewer.AutoRotate = true;
            theViewer.PrintPageDialog = false;
            theViewer.PrintDocumentWithSettings(pgs, ps);
            theViewer.Close();
        }
    }
}

Печать защищенного PDF-файла с помощью С#

Файл PDF может быть защищен и защищен паролем. Однако пароль может быть двух типов, т.е. пароль пользователя и пароль владельца. Для PDF-файлов, защищенных паролем пользователя, требуется пароль для открытия и просмотра зашифрованного PDF-файла. С другой стороны, пароль владельца требуется для изменения содержимого защищенного и защищенного паролем PDF-файла. Следующие шаги объясняют печать защищенного PDF:

  1. Загрузить защищенный PDF с паролем
  2. Создать объект PdfViewer
  3. Распечатать защищенный файл PDF

В следующем фрагменте кода показано, как распечатать защищенный PDF-файл с помощью C#:

//Загрузить защищенный PDF-документ, указав пароль пользователя или владельца
Document document = new Document(dataDir + "Password.pdf" , "userORowner");
//Создать объект PdfViewer
PdfViewer viewer = new PdfViewer();
//Открыть исходный PDF-файл
viewer.BindPdf(document);
//Распечатать PDF-документ
viewer.PrintDocument();
//Закрыть PDF-файл
viewer.Close();

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

Вы можете распечатать PDF-файл на определенном лотке для бумаги с помощью Aspose.PDF для .NET API. Например, вы можете распечатать PDF-файл с большим количеством фотографий на другом лотке для бумаги, а текстовый PDF-файл — на другом лотке для бумаги. Выполните следующие действия, чтобы настроить выходной лоток или лоток для печати PDF-файлов:

  1. Загрузить исходный PDF-файл
  2. Установить атрибуты для печати
  3. Укажите PageSettings и PaperSource.
  4. Вызов метода PrintDocumentWithSettings

Здесь примечательно, что вы можете изменить имя принтера. Здесь мы будем использовать Microsoft Print to PDF в качестве примера. Следующий фрагмент кода следует этим шагам и показывает, как распечатать документ в определенный лоток или корзину принтера с помощью C#:

Document doc = new Document("Test.pdf");
PdfViewer viewer = new PdfViewer();
viewer.BindPdf(doc);
viewer.PrinterJobName = System.IO.Path.GetFileName(doc.FileName);
viewer.Resolution = 110;
// Установить атрибуты для печати
viewer.AutoResize = true; // Print the file with adjusted size
viewer.AutoRotate = false; // Print the file with adjusted rotation
viewer.PrintPageDialog = false; // Do not produce the page number dialog when printing
viewer.RenderingOptions.UseNewImagingEngine = true;
// Создание объектов для настроек принтера и страницы и PrintDocument
System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
// Установить имя принтера
ps.PrinterName = "Microsoft Print to PDF";
pgs.PaperSize = new System.Drawing.Printing.PaperSize(paperTypeName, paperWidth, paperHeight);
pgs.Margins = new System.Drawing.Printing.Margins(margins.Left, margins.Right, margins.Top, margins.Bottom);
pgs.PaperSource = GetPaperSource(printerName, trayName);
// Печать документа с использованием настроек принтера и страницы
viewer.PrintDocumentWithSettings(pgs, ps);

///<summary>
/// Вернуть объект PaperSource для указанного принтера и имени лотка.
///</summary>
///<param name="printerName"></param>
///<param name="trayName"></param>
///<returns></returns>
public static System.Drawing.Printing.PaperSource GetPaperSource(string printerName, string trayName)
{
    System.Drawing.Printing.PaperSource ps = null;
    System.Drawing.Printing.PrintDocument prtDoc = new System.Drawing.Printing.PrintDocument();
    prtDoc.PrinterSettings.PrinterName = printerName;
    for (int i = 0; i < prtDoc.PrinterSettings.PaperSources.Count; i++)
    {
        if (prtDoc.PrinterSettings.PaperSources[i].SourceName.ToLower().Equals(trayName.ToLower()))
        {
            ps = prtDoc.PrinterSettings.PaperSources[i];
            break;
        }
    }
    return ps;
}

Печать диапазона страниц в разные источники бумаги с использованием С#

Могут быть сценарии, в которых вам может потребоваться распечатать разные страницы одного документа PDF в разные лотки для бумаги или корзину. Например, другой источник бумаги для титульной страницы и другой для других страниц. Вы, безусловно, можете выполнить следующие шаги, чтобы распечатать диапазоны страниц на разных источниках бумаги в рамках одного задания на печать:

  1. Инициализировать объект класса PdfViewer
  2. Использовать делегат обработчика событий PdfQueryPageSettings
  3. Установка параметров страницы и принтера
  4. Вызвать метод PrintDocumentWithSettings.

В следующем фрагменте кода показано, как выполнить эти шаги и распечатать разные диапазоны страниц на разные источники бумаги или лотки с помощью C#:

Aspose.Pdf.Facades.PdfViewer pdfv = new Aspose.Pdf.Facades.PdfViewer();

pdfv.PdfQueryPageSettings += PdfvOnPdfQueryPageSettings;

System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
System.Drawing.Printing.PrinterSettings prin = new System.Drawing.Printing.PrinterSettings();

pdfv.BindPdf(dataDir + "Print-PageRange.pdf");
prin.PrinterName = "HP LaserJet M9050 MFP PCL6";
prin.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);

Aspose.Pdf.Facades.PdfPageEditor pageEditor = new Aspose.Pdf.Facades.PdfPageEditor();
pageEditor.BindPdf(dataDir + "input.pdf");

pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
pgs.PaperSize = prin.DefaultPageSettings.PaperSize;

pdfv.PrintDocumentWithSettings(pgs, prin);
pdfv.Close();

private static void PdfvOnPdfQueryPageSettings(object sender, System.Drawing.Printing.QueryPageSettingsEventArgs queryPageSettingsEventArgs, PdfPrintPageInfo currentPageInfo)
{
    bool isOdd = currentPageInfo.PageNumber % 2 != 0;

    System.Drawing.Printing.PrinterSettings.PaperSourceCollection paperSources = queryPageSettingsEventArgs.PageSettings.PrinterSettings.PaperSources;

    if (isOdd)
        queryPageSettingsEventArgs.PageSettings.PaperSource = paperSources[0];
    else
        queryPageSettingsEventArgs.PageSettings.PaperSource = paperSources[1];
}

Проверка состояния задания печати при печати PDF с помощью С#

Вы можете распечатывать PDF-файлы на разных принтерах. Например, Microsoft Print to PDF, Microsoft XPS Document Writer или любой физический принтер. Однако печать больших PDF-документов может занять много времени или по какой-то причине печать может завершиться неудачно. Поэтому API предлагает функцию, позволяющую проверить состояние задания на печать, выполнив следующие действия:

  1. Загрузить исходный PDF-файл
  2. Укажите параметры страницы
  3. Установить имя принтера
  4. Распечатайте документ PDF с помощью PrintDocumentWithSettings

Ниже фрагмент кода показывает, как проверить статус задания печати или ход печати PDF с помощью C#:

// Создать экземпляр объекта PdfViewer
PdfViewer viewer = new PdfViewer();

// Привязать исходный PDF-файл
viewer.BindPdf(dataDir + "Sample Document with Bookmark.pdf");
viewer.AutoResize = true;

// Скрыть диалоговое окно печати
viewer.PrintPageDialog = false;

// Создать объект настроек принтера
System.Drawing.Printing.PrinterSettings ps = new System.Drawing.Printing.PrinterSettings();
System.Drawing.Printing.PageSettings pgs = new System.Drawing.Printing.PageSettings();
System.Drawing.Printing.PrintDocument prtdoc = new System.Drawing.Printing.PrintDocument();

// Укажите имя принтера
//ps.PrinterName = "Средство записи документов Microsoft XPS";
ps.PrinterName = "Microsoft Print to PDF";

// Результирующее название распечатки
//ps.PrintFileName = "ResultantPrintout.xps";
ps.PrintFileName = "ResultantPrintout.pdf";

// Распечатать вывод в файл
ps.PrintToFile = true;
ps.FromPage = 1;
ps.ToPage = 2;
ps.PrintRange = System.Drawing.Printing.PrintRange.SomePages;

// Укажите размер страницы распечатки
pgs.PaperSize = new System.Drawing.Printing.PaperSize("A4", 827, 1169);
ps.DefaultPageSettings.PaperSize = pgs.PaperSize;
pgs.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);

// Распечатать документ с указанными выше настройками
viewer.PrintDocumentWithSettings(pgs, ps);

// Проверьте состояние печати
if (viewer.PrintStatus != null)
{
    // Было выброшено исключение
    Exception ex = viewer.PrintStatus as Exception;
    if (ex != null)
    {
        // Получить сообщение об исключении
    }
}
else
{
    // Ошибок не обнаружено. Задание на печать успешно завершено
    Console.WriteLine("printing completed without any issue..");
}

В результате этот фрагмент кода выводит на консоль приложения .NET статус печати файла PDF:

С# Печать PDF

Вывод

Подводя итог, мы изучили различные подходы и варианты использования печати файлов PDF, защищенных и незащищенных паролем, с помощью C# или VB NET в ваших приложениях для программирования. Кроме того, мы изучили возможность печати целых PDF-документов. Точно так же мы научились печатать некоторые диапазоны страниц по определенным лоткам для страниц, корзинам или источникам бумаги. Кроме того, мы также проверили, как отслеживать состояние печати или ход печати документов с помощью C#.

Смотрите также