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

6
我试图打印出我的编辑器的内容:
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()之前,我设置了断点并查看了打印对话框对象。它显示pd.PageRangeSelection = PageRangeSelection.UserPagepd.PageRange = {1-3}。我想这是正确的,因为我只想打印第1-3页。然后执行printdocument(),输出PDF文件(为了测试我使用PDF打印机)有14页(整个文档都被打印了)。
我的错误在哪里?为什么页面范围设置不起作用?
感谢您的帮助。
2个回答

1

在你的代码中,你手动设置了:

pd.PageRangeSelection = PageRangeSelection.AllPages;

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

这不是原因。我已经说过我已经调试过了,而且在执行PrintDocument()方法之前,PageRangeSelection属性已设置为UserPages。 - 0xDEADBEEF

1
这是因为FlowDocumentDocumentPaginator不能处理UserPageRange。你可以看到FlowDocument实现创建了一个FlowDocumentPaginator,但没有考虑范围。
如果它能够处理,那么在FlowDocumentPaginator.(Async)GetPage中,会看到代码检查所请求打印的页面是否在可用页面的索引中;或者可能存在一个键的Dictionary,其值是要打印的DocumentPage
换句话说,PrintDialog 默认将 UserPageRangeEnabled 设置为 false 的原因是,为了使用该功能,通常需要编写自己的 DocumentPaginator 或添加一些逻辑来编译一个新的临时文档,以仅包含要打印的页面。请随意提问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接