2010-06-13 26 views
5

Tôi gần như đã hoàn tất việc triển khai chức năng in, nhưng tôi gặp sự cố khi thực hiện xong trở ngại cuối cùng.Xác định vị trí trên trang mà tài liệu luồng tôi đang in sẽ 'bắt đầu' và 'kết thúc'

Vấn đề của tôi là tôi đang in một số báo cáo, bao gồm tiêu đề (có thông tin về người báo cáo), chân trang (có số trang) và nội dung ở giữa, là tài liệu FlowDocument . Kể từ khi flowdocuments có thể được khá dài, rất có thể là họ sẽ span nhiều trang.

Cách tiếp cận của tôi là tạo một FlowDocumentPaginator tùy chỉnh xuất phát từ DocumentPaginator.

Trong đó tôi xác định đầu trang và chân trang của tôi.

Tuy nhiên, khi tôi in trang của mình, flowdocument và đầu trang và chân trang của tôi nằm trên đầu trang của eachother.

Vì vậy, câu hỏi của tôi là đơn giản và đơn giản - làm thế nào để tôi xác định từ đâu và đến nơi phần flowdocument trên các trang sẽ được đặt?

đây là mã từ Paginator custommade tôi:

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

Và đây là cuộc gọi 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 
    } 
} 

Trả lời

6

tôi thấy nó bản thân mình - đó là một chức năng gọi là pagepadding, nơi tôi có thể thiết lập khoảng cách từ bốn mặt giấy :)

Giải pháp khá dễ dàng - Tôi không biết phải tìm gì

Ví dụ:

Flowdocument fd = new FlowDocument(); 

fd.PagePadding = new Thickness(0.25,160,0.25,45); 
Các vấn đề liên quan