C# 在Awesomium中打印到打印机?

C# 在Awesomium中打印到打印机?,c#,printing,awesomium,C#,Printing,Awesomium,如何在Awesomium中将window.print()事件处理为实际打印(而不是打印为PDF)?我知道它将使用WebView.PrintRequest事件,但我不知道如何做到这一点 Awesomium不支持打印到打印机设备。相反,Awesomium支持打印到PDF文件 “正确”的方法 我对在Windows中打印的有限理解是,您通常需要使用 GDI+图形表面传递到打印事件的自定义事件处理程序中。很好地提供了一个示例实现 我想人们可以使用Awesomium.NETSDK实现这种较低级别的打印,但是

如何在Awesomium中将window.print()事件处理为实际打印(而不是打印为PDF)?我知道它将使用WebView.PrintRequest事件,但我不知道如何做到这一点


Awesomium不支持打印到打印机设备。相反,Awesomium支持打印到PDF文件

“正确”的方法 我对在Windows中打印的有限理解是,您通常需要使用 GDI+图形表面传递到打印事件的自定义事件处理程序中。很好地提供了一个示例实现

我想人们可以使用Awesomium.NETSDK实现这种较低级别的打印,但是,这可能是一场没有支持的艰苦战斗 来自Awesomium的开发者

选择 一个体面的“黑客”可能是将Awesomium的打印到PDF功能与打印PDF文件粘在一起。我可以想出至少3种方法从C#打印PDF文件:

  • 在最终用户的计算机上使用Acrobat Reader,围绕Acrobat的COM自动化对象使用.Net运行时可调用包装器(RCW)处理打印。看

  • 使用用户机器上的任何PDF阅读器来处理打印。看

  • 使用Windows公用对话框选择打印机,然后将PDF发送到打印机进行原始(直接)打印。(这类似于将PostScript[.ps]文件直接发送到打印机)。这仅适用于直接接受PDF文件的打印机

  • 使用#3的示例实现 下面是解决方案选项#3的示例,使用将Awesomium PDF文件直接发送到最终用户选择的打印机

    这个答案结合了两个现有的例子:a和an

    运行演示加载Microsoft知识库的URL,其中包括一个“打印”UI按钮,该按钮调用
    window.Print()

    使用系统;
    使用系统诊断;
    使用系统图;
    使用系统、绘图、打印;
    使用System.IO;
    使用System.Runtime.InteropServices;
    使用System.Windows.Forms;
    使用冬虫夏草;
    名称空间演示
    {
    静态类程序
    {
    [状态线程]
    静态void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Run(newprinterdemo());
    }
    }
    公共类PrinterDemo:表单
    {
    私有Awesomium.Windows.Forms.WebControl WebControl;
    私人打印机设置打印机设置;
    私有字符串printerName;
    公共PrinterDemo()
    {
    初始化组件();
    WindowState=FormWindowState.Maximized;
    }
    私有void InitializeComponent()
    {
    this.webControl=新建Awesomium.Windows.Forms.webControl();
    这个.SuspendLayout();
    // 
    //网络控制1
    // 
    this.webControl.Dock=System.Windows.Forms.DockStyle.Fill;
    this.webControl.Location=新系统.图纸.点(0,0);
    this.webControl.Size=新系统图纸尺寸(784562);
    this.webControl.Source=new System.Uri(“http://support.microsoft.com/kb/322091“,System.UriKind.Absolute);
    this.webControl.TabIndex=0;
    this.webControl.PrintRequest+=webControl\u PrintRequest;
    this.webControl.PrintComplete+=webControl\u PrintComplete;
    this.webControl.printfiled+=webControl\u printfiled;
    // 
    //PrinterDemo
    // 
    此.AutoScaleDimensions=新系统.Drawing.SizeF(6F,13F);
    this.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize=新系统图尺寸(784562);
    this.Controls.Add(this.webControl);
    this.Name=“PrinterDemo”;
    this.Text=“PrinterDemo”;
    此选项为.resume布局(false);
    }
    ///句柄`window.print()`事件
    私有void WebControl_PrintRequest(对象发送方,PrintRequestEventArgs e)
    {
    这个.Print();
    e、 已处理=正确;
    }
    ///成功打印的事件处理程序
    private void WebControl_PrintComplete(对象发送方,PrintCompleteEventTargets e)
    {
    //将文件打印到打印机上。
    if(String.IsNullOrWhiteSpace(printerName))
    {
    返回;
    }
    foreach(e.Files中的字符串文件)
    {
    System.Diagnostics.Debug.Print(“打印文件{0}”,文件);
    RawPrinterHelper.SendFileTopPrinter(printerName,文件);
    }
    }
    ///打印失败的事件处理程序
    private void WebControl_PrintFailed(对象发送方,PrintOperationEventArgs e)
    {
    MessageBox.Show(“MyApp”,“打印失败”,MessageBoxButtons.OK,MessageBoxIcon.叹号);
    }
    ///将PDF文件发送到打印机
    私人作废打印()
    {
    打印对话框打印对话框;
    int请求id;
    字符串路径=System.IO.path.GetTempPath();
    如果(!webControl.IsLive)
    返回;
    printerDialog=新建PrintDialog();
    printerSettings=新的printerSettings();
    printerDialog.PrinterSettings=PrinterSettings;
    if(DialogResult.OK==printerDialog.ShowDialog(此))
    {
    printerName=printerDialog.PrinterSettings.printerName;
    requestId=webControl.PrintToFile(路径,PrintConfig.Default);
    }
    }
    }
    公共类RawPrinterHelper
    {
    //结构和API偏差:
    [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
    公共类DOCINFOA
    {
    [Marshallas(UnmanagedType.LPStr)]
    公共字符串pDocName;
    [Marshallas(UnmanagedType.LPStr)]
    公共字符串pOutputFile;
    [M]