1

我们的 Web 应用程序有一个流程,在单击页面上的打印按钮时,来自服务器的原始数据会在用户选择的打印机(Zebra 标签打印机)上打印在客户端机器上。浏览器和服务器之间的交互顺序如下:
1)用户点击页面上的打印
2)服务器返回一个小程序
3)这个小程序与服务器建立 url 连接以检索打印数据
4)小程序然后查找列出安装在客户端机器上的打印机并显示打印机选择对话框。所有的打印机查找都是使用 javax.print 完成的。
5) 一旦用户选择了标签打印机,applet 就会创建一个打印作业并将其发送到选定的打印机。标签被打印出来

现在,由于谷歌已经从 chrome 中删除了 NPAPI,我们正在研究我们必须有哪些替代方案才能在 chrome 上获得相同的功能,特别是在 windows 上。最初通过 Google 本地客户端文档,我们认为我们可以使用 PNACL 实现上述用例。以下代码来自 MSDN,它是使用 winspool.h 将原始数据打印到默认打印机的例程

BOOL RawDataToPrinter(LPBYTE lpData, DWORD dwCount) {

   HANDLE       hPrinter;
   DOC_INFO_1       DocInfo;
   DWORD      dwJob;
   DWORD      dwBytesWritten;

               TCHAR result[ MAX_PATH ] = {'\0'};
                            DWORD length = MAX_PATH;
                            GetDefaultPrinter( result, &length );


    // Need a handle to the printer.
    if( ! OpenPrinter(result, &hPrinter, NULL ) )
      return FALSE;

    // Fill in the structure with info about this "document."
    DocInfo.pDocName = L"Demo Page";
    DocInfo.pOutputFile = NULL;
    DocInfo.pDatatype = L"RAW";
    // Inform the spooler the document is beginning.
    if( (dwJob = StartDocPrinter( hPrinter, 1, (BYTE *)&DocInfo )) == 0 )
    {
      ClosePrinter( hPrinter );
      return FALSE;
    }
    // Start a page.
    if( ! StartPagePrinter( hPrinter ) )
    {
      EndDocPrinter( hPrinter );
      ClosePrinter( hPrinter );
      return FALSE;
    }
    // Send the data to the printer.
    if( !WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
    {
      EndPagePrinter( hPrinter );
      EndDocPrinter( hPrinter );
      ClosePrinter( hPrinter );
      return FALSE;
    }
    // End the page.
    if( ! EndPagePrinter( hPrinter ) )
    {
      EndDocPrinter( hPrinter );
      ClosePrinter( hPrinter );
      return FALSE;
    }
    // Inform the spooler that the document is ending.
    if( ! EndDocPrinter( hPrinter ) )
    {
      ClosePrinter( hPrinter );
      return FALSE;
    }
    // Tidy up the printer handle.
    ClosePrinter( hPrinter );
    // Check to see if correct number of bytes were written.
    if( dwBytesWritten != dwCount )
      return FALSE;
    return TRUE;
  }

最初我们认为我们可以从一个辣椒插件中调用上述例程。页面上的 javascript 将检索标签数据并将其传递给本机客户端实例,这将调用 RawDataToPrinter(..) 例程。
但是,根据我们从论坛中了解到的情况,本机客户端将无法访问/查找打印机并将原始数据假脱机到选定的打印机。它不允许您调用它们提供的 api 端口之外的任何东西
是这种理解正确吗?如果是,那么是否有任何替代方法可以在 chrome 上实现上述用例?如果否且上述情况可行,是否有任何可用端口允许访问安装在客户端计算机上的打印机并允许我们将数据打印到所选打印机?

4

1 回答 1

0

简短的回答是否定的,这在 Native Client 中是不可能的,因为它的安全沙箱旨在防止网站使用系统 API。您可以在客户端上安装本机 Windows 应用程序,并使用带有 Javascript 的本机消息传递与它进行通信,将您想要的任何来自网页的数据传递给它。

于 2016-03-16T03:00:12.623 回答