在不使用PrintDialog的情况下打印WPF控件无法在大于北美字母大小的纸张上完全呈现

本文关键字:大于 PrintDialog 情况下 打印 控件 WPF | 更新日期: 2023-09-27 18:10:58

我遇到了一个问题,网上似乎没有什么信息,这两天一直给我带来麻烦。当我打印到一张8.5 x 11英寸的纸上时,所有打印机的输出都是正确的。当我打印到11 × 17英寸时,所有虚拟打印机(doPDF7、XPS Document Writer)的输出都是正确的。实际的物理打印机(Xerox WorkCentre 7535)的输出只能从左上角将价值8.5 x 11"的控件渲染到11 x 17"的纸上。我的控件大小合适(尺寸为11 x 17"),只是没有完全渲染。

我有一个打印预览控件实现,其中用户可以选择打印机(PrintQueue)和设置(PrintCapabilities)为他们选择的打印机。更改这些设置将在运行时显示出来,以便用户确切地知道他们正在打印什么。

当用户想要打印他们的文档时,我通过将票据(他们在打印预览中的选择)与PrintQueue.CurrentJobSettings.CurrentPrintTicket合并来准备选中的PrintQueue:

public void Prepare(PrintTicket ticketToMerge)
{
    // _printer is the PrintQueue
    // I've also tried to merge with UserPrintTicket, DefaultPrintTicket, and created a PrintTicket using XPS Document Writer printer default print ticket
    System.Printing.ValidationResult result = _printer.MergeAndValidatePrintTicket(_printer.CurrentJobSettings.CurrentPrintTicket, ticketToMerge);
    _printer.CurrentJobSettings.CurrentPrintTicket = result.ValidatedPrintTicket;
    _printer.Commit();
    // _printer.Refresh(); // This doesn't help it seems
}

然后我调用打印我的DocumentPaginator:

public void Print(DocumentPaginator paginator)
{
    var writer = PrintQueue.CreateXpsDocumentWriter(_printer);
    writer.Write(paginator, _printer.CurrentJobSettings.CurrentPrintTicket);
}

和实际的打印机调用DocumentPaginator.GetPage:

public override DocumentPage GetPage(int pageNumber)
{
    var view = new PrintingContent
    {
        // Create my control and make it the biggest size it can be without
        // going into the margins
        // Subtract the margins since they can't be printed in, these come from
        // _printerCapabilities.PageImageableArea
        Width = this.PageSize.Width - this.Margin.Left - this.Margin.Right,
        Height = this.PageSize.Height - this.Margin.Top - this.Margin.Bottom,
        // This might be a problem since the print preview control
        // is also using "this" but haven't found any evidence to conclude this thought
        DataContext = this 
    };
    view.Measure(new Size(view.Width, view.Height));
    view.Arrange(new Rect(new Point(), new Size(view.Width, view.Height)));
    view.UpdateLayout();
    var dg = UItilities.FindVisualChildren<DataGrid>(view).First();
    // dg.ItemsSource = (File as ParameterCollectionShell).GetParametersByPage(pageNumber) 
    // This didn't work so I tried giving the datagrid a new instance of List - this might be causing problems?
    var parameters = new List<ParameterViewModel>((File as ParameterCollectionShell).GetParametersByPage(pageNumber));
    dg.ItemsSource = parameters;
    // Doesn't seem to help
    // view.Measure(new Size(view.Width, view.Height));
    // view.Arrange(new Rect(new Point(), new Size(view.Width, view.Height)));
    view.UpdateLayout();
    //return new DocumentPage(view, 
    //                        this.PageSize, 
    //                        new Rect(new Point(), new Size(view.Width, view.Height)),  
    //                        new Rect(new Point(this.Margin.Left, this.Margin.Top), 
    //                        new Size(view.Width, view.Height)));
    return new DocumentPage(view);
}

当然,我已经调试了这个,并检查了大小,以确保他们是他们应该是什么。打印成。xps文件或。pdf文件都可以;但是为什么当它被发送到物理打印机时不能工作呢?

对于它的价值,有一个DataGrid在我的控制,我有*大小的间距列在过去的麻烦,但他们都是固定的宽度,所以我不确定是否相关。

在不使用PrintDialog的情况下打印WPF控件无法在大于北美字母大小的纸张上完全呈现

结果证明这一定是打印机驱动程序问题。我重新安装了同一台打印机的驱动程序,之后一切正常。

我直接联系了施乐公司的固件团队,他们让我知道打印机有固件更新,并且可以提供服务来解决这个问题。他们不能确切地指出问题是什么,但问题现在在他们的bug系统中。

如果有疑问,请重新安装打印机驱动程序,并在呈现问题时再次尝试打印。我不确定是什么引起了这种不良行为,但打印到任何其他打印机工作正常;这就是我如何将问题缩小到驱动程序的问题。