在不使用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
在我的控制,我有*大小的间距列在过去的麻烦,但他们都是固定的宽度,所以我不确定是否相关。
结果证明这一定是打印机驱动程序问题。我重新安装了同一台打印机的驱动程序,之后一切正常。
我直接联系了施乐公司的固件团队,他们让我知道打印机有固件更新,并且可以提供服务来解决这个问题。他们不能确切地指出问题是什么,但问题现在在他们的bug系统中。
如果有疑问,请重新安装打印机驱动程序,并在呈现问题时再次尝试打印。我不确定是什么引起了这种不良行为,但打印到任何其他打印机工作正常;这就是我如何将问题缩小到驱动程序的问题。