Доступ к установленным принтерам и печать необработанных данных на принтер этикеток с помощью собственного клиента Google

В нашем веб-приложении есть поток, в котором при нажатии кнопки печати на странице необработанные данные с сервера печатаются на клиентском компьютере на выбранном пользователем принтере (принтер этикеток Zebra). Следующая последовательность взаимодействий между браузером и сервером:
1) Пользователь нажимает на печать на странице
2) Сервер отправляет обратно апплет
3) Этот апплет устанавливает URL-соединение с сервером для получения данных печати.
4) Затем апплет просматривает список принтеров, установленных на клиентском компьютере, и отображает диалоговое окно выбора принтера. Весь поиск принтера выполняется с использованием javax.print
5) Как только пользователь выбирает принтер этикеток, апплет создает задание на печать и отправляет его на выбранный принтер. Этикетка печатается

Теперь, так как Google удалил NPAPI из Chrome, мы искали, какие альтернативы у нас есть, чтобы получить ту же функциональность в 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? если нет и выше возможно, существуют ли какие-либо доступные порты, которые позволяют доступ к принтерам, установленным на клиентском компьютере, и позволяют распечатывать данные на выбранном принтере?

1 ответ

Короткий ответ - нет, это невозможно из Native Client, потому что его песочница безопасности предназначена для предотвращения использования веб-сайтов системными API. Вы можете установить собственное приложение Windows на клиенте и использовать Native Messaging с Javascript для связи с ним, передавая ему любые данные с веб-страницы.

Другие вопросы по тегам