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

时间:2011-09-18 12:33:34

标签: c# printing printdialog

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

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页(使用此页面大小设置)。 我测试了它:printdialog出现了,我选择了一个页面范围(我在文本框中键入“1-3”)并单击print。在printdocument()之上我设置了断点并查看了printdialog-object。它说pd.PageRangeSelection = PageRangeSelection.UserPagepd.PageRange = {1-3}。我想这是对的,因为我只想打印出第1-3页。然后执行的printdocument()和输出pdf(用于测试我使用pdf打印机)有14页(打印整个文件)。

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

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

原因是FlowDocument的{​​{1}}无法处理DocumentPaginator。您可以看到FlowDocument实施创建了FlowDocumentPaginator,但没有考虑范围。

如果它确实处​​理了它,你会在FlowDocumentPaginator.(Async)GetPage中看到,代码检查以查看请求打印的页面是否在可用页面的索引中;或者,如果某个密钥存在于UserPageRange中,其值为Dictionary,则可以打印。

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

随时提出任何问题。

答案 1 :(得分:0)

在您的代码中手动设置:

pd.PageRangeSelection = PageRangeSelection.AllPages;

这就是您的代码打印所有页面的原因。