有些日子,我一直在努力将XPS打印到没有对话框的文件中。 我已经在CodeGuru和冯远(MSDN)上阅读了有关此事的帖子,以及这里的许多讨论主题,我仍然迷失了。
具体来说,我的方案是我必须使用第三方API,并将其打印到默认打印机(例如Microsoft XPS Document Writer)。我希望能够在打印过程之前“应用”文件名,当然也没有对话框。
我尝试过使用WinDDK - XPSDRV和LOCALMON样本,但无法弄清楚如何操作代码来实现我的目标。 (或者甚至完全理解我是否需要新的打印机驱动程序或新的端口类型)
答案 0 :(得分:1)
我遇到了同样的需要。以下是为我提供所需功能的一些逻辑:
//
// 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)
答案 1 :(得分:0)
您将删除管道xml中的过滤器以及inf文件中的相关dll。但是,正如我所做的那样,我猜你会遇到打印画布(图形)的问题。我无法将此画布转换/转换为字形以获取其内容。
如果您有其他问题,请告诉我
亲切的问候