2010-06-13 3 views
5

J'ai presque terminé la mise en œuvre d'une fonctionnalité d'impression, mais j'ai du mal à faire le dernier obstacle. Mon problème est que j'imprime quelques rapports, composé d'un en-tête (avec des informations sur la personne dont traite le rapport), un pied de page (avec un numéro de page) et le contenu au milieu, qui est un FlowDocument . Puisque les documents d'écoulement peuvent être assez longs, il est très possible qu'ils couvrent plusieurs pages.Définir où sur la page le flowdocument que j'imprime va «commencer» et «fin»

Mon approche consiste à créer un FlowDocumentPaginator personnalisé dérivé de DocumentPaginator.

Là, je définis mon en-tête et mon pied de page. Cependant, lorsque j'imprime ma page, le flowdocument et mon en-tête et pied de page sont l'un sur l'autre. Donc, ma question est simple: comment puis-je définir où et à quel endroit sera placé le document flowdocument sur les pages?

ici est le code de mon custommade Paginator:

public class HeaderedFlowDocumentPaginator : DocumentPaginator 
{ 
    private DocumentPaginator flowDocumentpaginator; 

    public HeaderedFlowDocumentPaginator(FlowDocument document) 
    { 
     flowDocumentpaginator = ((IDocumentPaginatorSource) document).DocumentPaginator; 
    } 

    public override bool IsPageCountValid 
    { 
     get { return flowDocumentpaginator.IsPageCountValid; } 
    } 

    public override int PageCount 
    { 
     get { return flowDocumentpaginator.PageCount; } 
    } 

    public override Size PageSize 
    { 
     get { return flowDocumentpaginator.PageSize; } 
     set { flowDocumentpaginator.PageSize = value; } 
    } 

    public override IDocumentPaginatorSource Source 
    { 
     get { return flowDocumentpaginator.Source; } 
    } 

    public override DocumentPage GetPage(int pageNumber) 
    { 
     DocumentPage page = flowDocumentpaginator.GetPage(pageNumber); 

     ContainerVisual newVisual = new ContainerVisual(); 
     newVisual.Children.Add(page.Visual); 

     DrawingVisual header = new DrawingVisual(); 
     using (DrawingContext dc = header.RenderOpen()) 
     { 
      //Header data 
     } 
     newVisual.Children.Add(header); 

     DrawingVisual footer = new DrawingVisual(); 
     using (DrawingContext dc = footer.RenderOpen()) 
     { 
      Typeface typeface = new Typeface("Trebuchet MS"); 
      FormattedText text = new FormattedText("Page " + (pageNumber + 1).ToString(), CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, 14, Brushes.Black); 

      dc.DrawText(text, new Point(page.Size.Width - 100, page.Size.Height-30)); 
     } 

     newVisual.Children.Add(footer); 

     DocumentPage newPage = new DocumentPage(newVisual); 
     return newPage; 
    } 
} 

Et voici l'appel printdialogue:

private void btnPrint_Click(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     PrintDialog printDialog = new PrintDialog(); 
     if (printDialog.ShowDialog() == true) 
     { 
      FlowDocument fd = new FlowDocument(); 
      MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(<My string of text - RTF formatted>)); 

      TextRange tr = new TextRange(fd.ContentStart, fd.ContentEnd); 
      tr.Load(stream, DataFormats.Rtf); 

      stream.Close(); 
      fd.ColumnWidth = printDialog.PrintableAreaWidth; 

      HeaderedFlowDocumentPaginator paginator = new HeaderedFlowDocumentPaginator(fd); 

      printDialog.PrintDocument(paginator, "myReport"); 
     } 
    } 
    catch (Exception ex) 
    { 
     //Handle 
    } 
} 

Répondre

6

Je l'ai trouvé moi-même - il y a une fonction appelée pagepadding, où je peux mettre la distance des quatre côtés du papier :)

Assez facile solution - Je ne savais pas quoi chercher

Exemple:

Flowdocument fd = new FlowDocument(); 

fd.PagePadding = new Thickness(0.25,160,0.25,45);