Доступ к установленным принтерам и печать необработанных данных на принтер этикеток с помощью собственного клиента 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 для связи с ним, передавая ему любые данные с веб-страницы.