我遇到了一个似乎在网络上几乎没有信息的问题,并且在过去的两天里一直给我带来麻烦。当我打印到 8.5 x 11" 的纸张时,所有打印机上的输出都是正确的。当我打印到 11 x 17" 时,所有虚拟(doPDF7、XPS Document Writer)打印机上的输出都是正确的。实际物理打印机 (Xerox WorkCentre 7535) 上的输出仅从左上角将我控制的 8.5 x 11" 值渲染到 11 x 17" 纸上。我的控件尺寸合适(尺寸为 11 x 17"),只是没有完全渲染。
我实现了一个打印预览控件,用户可以在其中选择打印机 ( PrintQueue
) 和所选打印机的设置 ( PrintCapabilities
)。更改这些设置将在运行时显示,以便用户确切知道他们正在打印什么。
然后,当用户想要打印他们的文档时,我PrintQueue
通过将票证(他们在打印预览中的选择)与以下内容合并来准备所选内容PrintQueue.CurrentJobSettings.CurrentPrintTicket
:
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
我的控制中有一个,过去我在使用 *-size 间距列时遇到了麻烦,但它们都是固定宽度,所以我不确定它是否相关。