我试着打印出编辑器的内容:
PrintDialog pd = new PrintDialog();
pd.PageRangeSelection = PageRangeSelection.AllPages;
pd.UserPageRangeEnabled = true;
FlowDocument fd = DocumentPrinter.CreateFlowDocumentForEditor(CurrentDocument.Editor);
DocumentPaginator dp = ((IDocumentPaginatorSource)fd).DocumentPaginator;
bool? res = pd.ShowDialog();
if (res.HasValue && res.Value)
{
fd.PageHeight = pd.PrintableAreaHeight;
fd.PageWidth = pd.PrintableAreaWidth;
fd.PagePadding = new Thickness(50);
fd.ColumnGap = 0;
fd.ColumnWidth = pd.PrintableAreaWidth;
pd.PrintDocument(dp, CurrentDocument.Editor.FileName);
}
我使用的测试文档大约有14个页面(使用这个页面大小设置)。我测试了一下:打印对话框出现了,我选择了一个页面范围(我在文本框中输入"1-3"),然后点击print
。在printdocument()
上面,我设置了一个断点并查看了printdialog-object。上面写着pd.PageRangeSelection = PageRangeSelection.UserPage
和pd.PageRange = {1-3}
。我想这是对的,因为我只想打印1-3页。然后执行printdocument()
,在output-pdf(为了测试,我使用pdf打印机)中有14页(整个文档被打印)。
我错在哪里?为什么页面范围设置不起作用?
谢谢你的帮助
在您的代码中手动设置:
pd.PageRangeSelection = PageRangeSelection.AllPages;
这就是为什么你的代码打印所有的页面
这样做的原因是因为FlowDocument
的DocumentPaginator
不处理UserPageRange
s。您可以看到FlowDocument
实现创建了一个FlowDocumentPaginator
,并且它没有考虑范围。
如果它确实处理了它,在FlowDocumentPaginator.(Async)GetPage
中你会看到,代码检查以查看请求打印的页面是否在可用页面的索引中;或者如果Dictionary
中存在一个键,其值是要打印的DocumentPage
。
换句话说,PrintDialog
默认值将UserPageRangeEnabled
设置为false
的原因是,为了使用该功能,您通常必须编写自己的DocumentPaginator
,或者必须添加一些逻辑来编译一个新的临时文档,以仅保存您想要打印的页面。