2014-01-29 7 views
0

Я использую WPF Flowdocument для печати содержимого в таблице с верхним и нижним колонтитулом.Динамическая область содержимого для печати

Однако, когда данные занимают только пару строк в таблице, нижний колонтитул все еще отображается на последней странице, и вся страница печатается, оставляя половину страницы пустой.

Могу ли я ожидать, что контент (заголовок + контент + нижний колонтитул) займет только половину страницы, если данные меньше и одна полная страница (страница A4/Letter), если данные больше половины страницы? И если данные больше, чем полная страница, она также должна охватывать вторую страницу.

Спасибо ..

ответ

0

Я могу решить эту проблему путем переопределения OnPrintCommand для DocumentViewer

public class CustomDocumentViewer : DocumentViewer 
{ 
    protected override void OnPrintCommand() 
    { 
     // get a print dialog, defaulted to default printer and default printer's preferences. 
     PrintDialog printDialog = new PrintDialog(); 
     printDialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue(); 
     printDialog.PrintTicket = printDialog.PrintQueue.DefaultPrintTicket; 

     // get a reference to the FixedDocumentSequence for the viewer. 
     FixedDocumentSequence docSeq = this.Document as FixedDocumentSequence; 

     if (Globals.PRINT_COMMAND_PAGEHEIGHT == "FULL") 
      printDialog.PrintTicket.PageMediaSize = new PageMediaSize(960, 1152); 
     else 
      printDialog.PrintTicket.PageMediaSize = new PageMediaSize(960, 576); 

     if (printDialog.ShowDialog() == true) 
     { 
      // set the print ticket for the document sequence and write it to the printer. 
      docSeq.PrintTicket = printDialog.PrintTicket; 

      XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(printDialog.PrintQueue); 
      writer.WriteAsync(docSeq, printDialog.PrintTicket); 
     } 
    } 
} 

Window_Activated функции:

  //Set Page Height and Width dynamically 

      MemoryStream mem = new MemoryStream(); 
      byte[] buf = Encoding.UTF8.GetBytes(strXmlData); 
      mem.Write(buf, 0, buf.Length); 
      mem.Position = 0; 
      FlowDocument res = XamlReader.Load(mem) as FlowDocument; 

      //1152 = 12in * 96 DPI 

      if (Utils.GetPageHeight(strOrderNo.Substring(0, 2)) == "FULL") 
      { 
       res.PageHeight = Globals.FULL_PAGE_HEIGHT; 
       Globals.PRINT_COMMAND_PAGEHEIGHT = "FULL"; 
      } 
      else 
      { 
       res.PageHeight = Globals.HALF_PAGE_HEIGHT; 
       Globals.PRINT_COMMAND_PAGEHEIGHT = "HALF"; 
      } 
      res.PageWidth = Globals.PAGE_WIDTH; 

      reportDocument.XamlData = XamlWriter.Save(res); 

в XAML файле DocumentViewer:

<Grid> 
    <spu:CustomDocumentViewer x:Name="documentViewer" /> 
</Grid> 

и в FlowDocument Шаблон:

PageHeight="0.0cm" PageWidth="0.0cm" ColumnWidth="21.0cm" 

Спасибо, ~ Ravi