打印文档时出现的页面范围问题

本文关键字:范围 问题 文档 打印 | 更新日期: 2023-09-27 18:08:50

我试着打印出编辑器的内容:

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.UserPagepd.PageRange = {1-3}。我想这是对的,因为我只想打印1-3页。然后执行printdocument(),在output-pdf(为了测试,我使用pdf打印机)中有14页(整个文档被打印)。

我错在哪里?为什么页面范围设置不起作用?

谢谢你的帮助

打印文档时出现的页面范围问题

在您的代码中手动设置:

pd.PageRangeSelection = PageRangeSelection.AllPages;

这就是为什么你的代码打印所有的页面

这样做的原因是因为FlowDocumentDocumentPaginator不处理UserPageRange s。您可以看到FlowDocument实现创建了一个FlowDocumentPaginator,并且它没有考虑范围。

如果它确实处理了它,在FlowDocumentPaginator.(Async)GetPage中你会看到,代码检查以查看请求打印的页面是否在可用页面的索引中;或者如果Dictionary中存在一个键,其值是要打印的DocumentPage

换句话说,PrintDialog默认值将UserPageRangeEnabled设置为false的原因是,为了使用该功能,您通常必须编写自己的DocumentPaginator,或者必须添加一些逻辑来编译一个新的临时文档,以仅保存您想要打印的页面。