静静地使用Microsoft XPS Document Writer打印机来创buildXPS

几天以来,我一直在打印XPS文件,而没有对话框。 我已经阅读了CodeGuru和冯源(MSDN)关于这个问题的post,还有很多讨论话题,但我仍然迷失了。

具体来说,我的scheme是,我有一个第三方API,我必须使用,并打印到默认打印机(如微软的XPS文档作家)。 我希望能够在打印过程之前“申请”一个文件名,当然不会有对话框。

我已经尝试使用WinDDK – XPSDRV和LOCALMON示例,但无法弄清楚如何操作代码来实现我的目标。 (甚至完全理解是否需要新的打印机驱动程序或新的端口types)

您将删除管道xml中的过滤器以及相关的dll在inf文件中。 但是,正如我所做的,我想你会面临打印画布(图形)的问题。 我无法将此画布转换/转换为字形以获取其内容。

如果您还有其他问题,请告诉我

亲切的问候

我遇到了同样的需求。 以下是为我提供所需功能的一些逻辑:

// // PrintDocument_inst // this.PrintDocument_inst.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.k_line_PrintPage); private void Print( string align_file_name ) { if ( plot_metafile == null ) { MessageBox.Show( "you need to load offset data before printing a plot" ); return; } try { PrintDocument_inst.DefaultPageSettings = PageSettings_inst; PrintDialog_inst = new PrintDialog( ); PrintDialog_inst.Document = PrintDocument_inst; PrintDialog_inst.UseEXDialog = true; // this must be set true or dialog won't show on 64 bit Vista PrintDialog_inst.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; PrintDialog_inst.PrinterSettings.PrintToFile = true; PrintDialog_inst.PrinterSettings.PrintFileName = align_file_name; i_page_to_print_next = 1; n_pages_still_to_print = 1; PrintDocument_inst.Print( ); } catch ( Exception e ) { MessageBox.Show( e.ToString( ) ); } finally { } } // end of function Print( string align_file_name ) //PrintPage event handler private void k_line_PrintPage(object sender,PrintPageEventArgs ppea) { int leftMargin = ppea.MarginBounds.Left; int topMargin = ppea.MarginBounds.Top ; try { float _scale_f; if ( PrintDialog_inst != null ) { string str_printer_name = PrintDialog_inst.PrinterSettings.PrinterName.ToString ( ); if ( str_printer_name.CompareTo ( "Adobe PDF" ) == 0 ) { _scale_f = 0.61F; // 0.85F; } else { _scale_f = 0.59F; // 0.82F; } } else // case of print preview { _scale_f = 0.59F; // 0.82F; } if ( _scale_f != 1.0F ) ppea.Graphics.ScaleTransform ( _scale_f, _scale_f ); ppea.Graphics.DrawImage ( plot_metafile, leftMargin, topMargin ); ppea.HasMorePages = ( --n_pages_still_to_print > 0 ? true : false ); } finally { } } // end of private void k_line_PrintPage(object sender,PrintPageEventArgs ppea)