WPF预览并打印FlowDocument

在前面的文章中,介绍过通过FixedDocument进行预览并打印。

https://www.cnblogs.com/zhaotianff/p/18254574

 

但是有时候我们可能使用的是FlowDocument,例如在RichTextBox中时。

如何对FlowDocument进行预览并打印呢。

 

可以将FlowDocument转换成XpsDocument,然后再使用DocumentViewer进行预览并打印。

 

注意:需要引用 ReachFramework程序集

 

 

例如我们有如下 的FlowDocument

 1 <FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 2               xmlns:local="clr-namespace:FlowDocumentPreviewAndPrint"
 3               ColumnWidth="400" FontSize="14" FontFamily="Georgia">
 4     <Paragraph>
 5         <Image Source="jk.png"></Image>
 6     </Paragraph>
 7     <Paragraph>
 8         <Run>Hello World</Run>
 9     </Paragraph>
10 </FlowDocument>

 

然后在主窗口中增加一个DocumentViewer

 1 <wd:Window x:Class="FlowDocumentPreviewAndPrint.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:FlowDocumentPreviewAndPrint"
 7         xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers"
 8         mc:Ignorable="d"
 9         Title="MainWindow" Height="450" Width="800">
10     <Grid>
11         <Grid.RowDefinitions>
12             <RowDefinition/>
13             <RowDefinition Height="40"/>
14         </Grid.RowDefinitions>
15 
16         <DocumentViewer Name="docv">
17 
18         </DocumentViewer>
19 
20         <Grid Grid.Row="1">
21             <Button Content="加载" HorizontalAlignment="Center" VerticalAlignment="Center" Width="88" Height="28" Click="Button_Click"></Button>
22         </Grid>
23     </Grid>
24 </wd:Window>

 

当点击打印时,我们将FlowDocument转换成XpsDocument,并设置到DocumentViewer的Document中去。

 1 private void Button_Click(object sender, RoutedEventArgs e)
 2 {
 3     try
 4     {
 5         FlowDocument flowDocument = (FlowDocument)Application.LoadComponent(new Uri("FlowDocument1.xaml", UriKind.RelativeOrAbsolute));
 6 
 7         string temp = System.IO.Path.GetTempFileName();
8 if (File.Exists(temp) == true) 9 File.Delete(temp); 10 11 XpsDocument xpsDoc = new XpsDocument(temp, FileAccess.ReadWrite); 12 13 XpsDocumentWriter xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc); 14 15 xpsWriter.Write((flowDocument as IDocumentPaginatorSource).DocumentPaginator); 16 17 docv.Document = xpsDoc.GetFixedDocumentSequence(); 18 19 xpsDoc.Close(); 20 } 21 catch (Exception ex) 22 { 23 MessageBox.Show(ex.Message); 24 } 25 }

 

示例代码

下载

 

参考资料

https://bryanwilhite.github.io/the-funky-knowledge-base/entry/kb2076072263/

posted @ 2025-03-07 16:27  zhaotianff  阅读(54)  评论(0)    收藏  举报