Как распечатать определенные страницы из PrintDocument программно? - PullRequest
1 голос
/ 14 октября 2011

Есть ли способ печатать только выбранные страницы из System.Drawing.Printing.PrintDocument программно (например, стр. 3-5)?Я использую этот код:

        myPrintDocument.Print();

Но этот способ не может пропускать страницы программно.Я подумал о возможности показать модифицированную версию класса PrintDialog (с индексами страниц, которые я хочу в качестве аргумента), пропустить страницы, которые мне не нужны, напечатать документ, как япрограммно закройте окно PrintDialog (чтобы оно только мигало).Но я понимаю, что это действительно больно и грязно.Должен быть более простой способ, верно?

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 29 октября 2014

Вы можете установить PrinterSettings в событии PrintDocument.BeginPrint.

Событие PrintDocument.PrintPage, в которое вы помещаете свой код печати, будет вызываться контроллером печати для каждой страницы до последней страницы, заданной в параметрах PrinterSettings. Например, если у вас есть 10-страничный PrintDocument и вы установили PrintDocument.PrinterSettings.ToPage = 5, тогда контроллер печати будет вызывать событие PrintPage для каждой страницы, пока не обработает 5-ю страницу.

Если вы пропускаете страницы, например PrinterSettings.FromPage = 3 до ToPage = 5, то контроллер печати вызовет событие PrintPage 3 раза. Это одно событие PrintPage на счет от 3 до 5 включительно.

Контроллер печати не решает, какой Контент будет напечатан событием PrintPage. Это вызывает событие только один раз для каждой просчитанной страницы в вашем диапазоне. Например, если вы укажете FromPage = 4 - FromPage = 6, контроллер печати вызовет точно такое же количество событий PrintPage, и он даже не узнает разницу! Он не знает, какую страницу он печатает с событием PrintPage. Он знает только, чтобы вызвать событие PrintPage 3 раза.

Суть в том, что ваш код в событии PrintPage должен обрабатывать все пропущенные страницы без рисования. Затем ваш код в том же самом событии PrintPage должен обработать и нарисовать «текущую страницу», которую вы хотите распечатать, а затем вернуться, чтобы контроллер печати мог вызвать следующее событие PrintPage.

Вот псевдокод:

void Setup_Printing()
{
  myPrintDocument.BeginPrint += On_BeginPrint;
  myPrintDocument.PrintPage += On_PrintPage;
}

// Page Index variable
int indexCuurentPage = 0;

void On_BeginPrint(object sender, PrintEventArgs e)
{
  indexCuurentPage = 0;
  ((PrintDocument)sender).PrinterSettings.PrintRange = PrintRange.SomePages;
  ((PrintDocument)sender).PrinterSettings.FromPage = 3;
  ((PrintDocument)sender).PrinterSettings.ToPage = 5;
}


void On_PrintPage(object sender, PrintPageEventArgs ppea)
{
  // Set up a loop to process pages.
  bool bProcessingPages = true;
  while (bProcessingPages)
  {
    indexCurrentPage++;

    // Set isPageInRange flag to true if this indexCurrentPage is in the selected range of pages
    bool isPageInRange = (theCurrentPage >= ppea.PageSettings.PrinterSettings.FromPage);
    isPageInRange = isPageInRange && (theCurrentPage =< ppea.PageSettings.PrinterSettings.ToPage);

    if (isPageInRange)
    {
      // Process your data and print this page then exit the loop.  
      try
      {
        //// TO DO - Process Data ////
        //// TO DO - Draw Data to ppea.Graphics ////
        // Note:  Do not set the ppea.HasMorePages to true.  Let the Printer Controller do it.
      }
      catch
      {
        // Abort printing more pages if there was an error.
        ppea.HasMorePages = false;
      }
      // Set the loop exit flag.  We could use "return;" instead if we do not want to do more.
      bProcessingPages = false;
    }
    else
    {
      // Process your data and Do Not Draw on the ppea.Graphics.
      try
      {
        //// TO DO - Process Data ////
      }
      catch
      {
        // Abort printing more pages if there was an error.
        ppea.HasMorePages = false;
        // Set the loop exit flag.  We could use "return;" instead if we do not want to do more.
        bProcessingPages = false;
      }
      // Stay in the processing loop until you either need to actually Print a Page
      // or until you run out of data and pages to print.
    }

    // check to see if we ran out of pages to print
    if (indexCurrentPage >= ppea.PageSettings.PrinterSettings.ToPage)
    {
      // Done.  We do not need to set the HasMorePages = false
      bProcessingPages = false;
    }
  } // end while processing pages

  // The print controller will decide to raise the next PrintPage event if it needs to.
  // If You set the ppea.HasMorePages = false, then it will stop any more page events. 
  // If You set the ppea.HasMorePages = true, 
  //    then I'm not sure what the print controller will do if it ran out of pages!
}
1 голос
/ 14 октября 2011

А как насчет этого?

PrinterSettings printSettings = new PrinterSettings()
            {
                FromPage = 3,
                ToPage = 5
            };
PrintDocument myPrintDocument = new PrintDocument()
            {
                PrinterSettings = printSettings
            };
myPrintDocument.Print();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...