2016-03-15 6 views
1

Наше веб-приложение имеет поток, в котором при нажатии кнопки печати на странице необработанные данные с сервера печатаются на компьютере клиента на выбранном пользователем принтер (принтер этикеток 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, которое они Предоставить
Правильно ли это понимание? Если да, то есть ли альтернатива для реализации вышеупомянутого варианта использования хром? если нет и выше, есть ли доступные порты, которые позволяют доступ к принтерам, установленным на компьютере клиента, и позволяют нам печатать данные на выбранном принтере?

+0

как вы решили эту проблему? У меня есть аналогичное требование. Благодаря! –

+0

мы решили это с использованием хромированного расширения времени выполнения api. https://developer.chrome.com/apps/nativeMessaging – Jitesh

+0

мы решили это, используя hrome extension runtime api. https://developer.chrome.com/apps/nativeMessaging. Мы разработали расширение chrome, которое будет действовать как мост между нашей веб-страницей приложения и родным приложением (разработанным с использованием VC++). Веб-страница будет подключаться к расширению chrome, чтобы отправить информацию о задании печати как json в расширение. Расширение, в свою очередь, будет подключаться к приложению exe exe и передавать данные json, полученные с веб-страницы. приложение native exe будет отвечать за чтение json-данных из стандартного ввода-вывода, а затем поиск принтера – Jitesh

ответ

0

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

+0

Спасибо за ваш ответ Дерек. Однако я чувствую, что это победит цель веб-приложения, когда мы попросим пользователей установить все больше и больше программного обеспечения для достижения функциональности приложения. Мы попробуем Native Messaging. Другим вариантом было бы расширение IE-tab для chrome. еще раз спасибо – Jitesh

 Смежные вопросы

  • Нет связанных вопросов^_^