Наше веб-приложение имеет поток, в котором при нажатии кнопки печати на странице необработанные данные с сервера печатаются на компьютере клиента на выбранном пользователем принтер (принтер этикеток Zebra). После последовательности взаимодействий участвуют между браузером и сервером:
щелчков 1) Пользователя по печати на странице
2) Сервер отправляет обратно апплет
3) Этот апплет делает соединение URL-адрес к серверу для получения данных печати
4) Затем апплет просматривает список принтеров, установленных на машине клиента, и отображает диалоговое окно выбора принтера. Весь поиск принтера выполняется с помощью javax.print
5) Когда пользователь выбирает принтер этикеток, апплет создает задание на печать и отправляет его на выбранный принтер. Ярлык печатается
Теперь, когда Google удалил NPAPI с хром, мы смотрели, какие альтернативы нам нужны, чтобы получить ту же функциональность на хроме и, в частности, на окнах. Изначально, несмотря на то, что Google поддерживает клиентские документы, мы подумали, что мы можем реализовать вышеупомянутый вариант использования с использованием PNACL. После кода из MSDN, который является обычным для печати необработанных данных на принтер по умолчанию с помощью winspool.h
Доступ к принтерам установлен и печать необработанных данных на принтер для этикеток с использованием собственного клиента Google
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 (..).
Однако из того, что мы понимаем на форумах, является то, что Native-клиент не сможет получить доступ к принтеру и искать в нем необработанные данные для выбранного принтера. Это не позволит вам вызывать что-либо вне портов api, которое они Предоставить
Правильно ли это понимание? Если да, то есть ли альтернатива для реализации вышеупомянутого варианта использования хром? если нет и выше, есть ли доступные порты, которые позволяют доступ к принтерам, установленным на компьютере клиента, и позволяют нам печатать данные на выбранном принтере?
как вы решили эту проблему? У меня есть аналогичное требование. Благодаря! –
мы решили это с использованием хромированного расширения времени выполнения api. https://developer.chrome.com/apps/nativeMessaging – Jitesh
мы решили это, используя hrome extension runtime api. https://developer.chrome.com/apps/nativeMessaging. Мы разработали расширение chrome, которое будет действовать как мост между нашей веб-страницей приложения и родным приложением (разработанным с использованием VC++). Веб-страница будет подключаться к расширению chrome, чтобы отправить информацию о задании печати как json в расширение. Расширение, в свою очередь, будет подключаться к приложению exe exe и передавать данные json, полученные с веб-страницы. приложение native exe будет отвечать за чтение json-данных из стандартного ввода-вывода, а затем поиск принтера – Jitesh