Я почти завершил реализацию функции печати, но у меня возникли проблемы с преодолением последнего препятствия.
Моя проблема в том, что я печатаю некоторые отчеты, состоящие из заголовка (с информацией олицо, о котором говорится в отчете), нижний колонтитул (с номером страницы) и содержимое в середине, которое является FlowDocument.Поскольку потоковые документы могут быть довольно длинными, вполне возможно, что они будут занимать несколько страниц.
Мой подход заключается в создании пользовательского FlowDocumentPaginator, производного от DocumentPaginator.
Там я определяю свой заголовоки мой нижний колонтитул.
Однако, когда я печатаю свою страницу, потоковый документ и мой верхний и нижний колонтитулы находятся сверху друг друга.
Так что мой вопрос прост и понятен - как мне определить изгде и где будет размещена часть потокового документа на страницах?
вот код из моего пользовательского 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;
}
}
А вот вызов 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
}
}