FlowDocument, вероятно, является лучшим решением для динамического содержимого и динамического размера печати, то есть либо неизвестен, либо может измениться. Для моей проблемы я знал и содержание и размер печати.
Первым делом я установил содержимое в ScrollViewer, в моем случае сетку, на размер A4, что можно легко сделать с помощью
<Grid x:Name="gridReport" Height="29.7cm" Width="21cm">
Это означает, что сетка отображается точно в области печати, все, что находится внутри сетки, не должно быть искажено при печати.
Это все равно отрубит верхнюю область, если ScrollViewer не был прокручен до вершины в точке использования PrintDialog. Чтобы решить эту проблему программно, перед печатью нажмите
Myscrollviewer.ScrollToTop();
PrintDialog printDialog = new PrintDialog();
if(printDialog.ShowDialog() == true)
{
printDialog.PrintVisual(gridReport, "Print Report");
}