4

我一直在寻找一种在客户端从网络打印的解决方案(https://medium.com/@yehandjoe/angular-2-raw-printing-service-56614d358754)是我一直遵循的建议使用qz托盘以获得打印机的访问权限。我已经按原样复制了代码,但它不起作用。

每当执行 getprinters() 函数时,它都会显示“未定义 qz”

我已经使用这些 npm 命令导入了包

npm install qz-tray sha ws

npm install rsvp,这是我的打印机服务代码:

import { Injectable } from '@angular/core';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/map';


declare var qz: any;
@Injectable()
export class PrinterService {
constructor() { }

errorHandler(error: any): Observable<any> {
    return Observable.throw(error);
}

// Get list of printers connected
getPrinters(): Observable<string[]> {
    return Observable
        .fromPromise(qz.websocket.connect().then(() => qz.printers.find()))
        .map((printers: string[]) => printers)
        .catch(this.errorHandler);
}

// Get the SPECIFIC connected printer
getPrinter(printerName: string): Observable<string> {
    return Observable
        .fromPromise(qz.websocket.connect().then(() => qz.printers.find(printerName)))
        .map((printer: string) => printer)
        .catch(this.errorHandler);
}

// Print data to chosen printer
printData(printer: string, data: any): Observable<any> {
    // Create a default config for the found printer
    const config = qz.configs.create(printer);
    return Observable.fromPromise(qz.print(config, data))
        .map((anything: any) => anything)
        .catch(this.errorHandler);
}

// Disconnect QZ Tray from the browser
removePrinter(): void {
    qz.websocket.disconnect();
}

}

如果我犯了任何错误,请纠正,或者我真的很感激任何其他替代解决方案

4

3 回答 3

2

看起来您需要将 qz 托盘导入您的提供商。

我使用SHA.jshttps ://www.npmjs.com/package/sha.js进行加密并使用本机承诺。

因此,我将以下行添加到现有导入下方的文件顶部:

import * as shajs from 'sha.js';
import * as qz from 'qz-tray';

为 QZ 设置 SHA

记得告诉 QZ 使用新的 sha.js 包:

qz.api.setSha256Type(function (data) {
    return shajs('sha256').update(data).digest('hex')
});

为 QZ 设置原生 Promise

记得告诉 QZ 使用新的 sha.js 包:

qz.api.setPromiseType(function (resolver) {
    return new Promise(resolver);
});
于 2018-04-23T19:22:24.197 回答
0

尝试在构造函数中或之前声明它,你在声明服务类之前变量,它看不到变量

于 2018-01-10T06:44:58.790 回答
0

我还需要使用这个 QZ 服务,它看起来是从 javascript 应用程序与打印机通信的唯一方法。

无论如何,多亏了上面的答案和一些文章,我成功地制作了一个小的angular 7应用程序,可以很容易地与打印机连接。

我想分享这段代码,以防有人不得不走同样的流程。看起来这是关于 QZ Tray 的唯一帖子。首先,您应该通过执行以下命令来安装必要的依赖项:

npm install qz-tray js-sha256 rsvp --save

其次,您应该创建一个打印服务,这是它的代码:

import { Injectable } from '@angular/core';
import { from as fromPromise, Observable, throwError } from 'rxjs';
import { HttpErrorResponse } from '@angular/common/http';
import { catchError, map } from 'rxjs/operators';

import * as qz from 'qz-tray';
import { sha256 } from 'js-sha256';

@Injectable({
  providedIn: 'root'
})
export class PrinterService {

  //npm install qz-tray js-sha256 rsvp --save
  constructor() {
    qz.api.setSha256Type(data => sha256(data));
    qz.api.setPromiseType(resolver => new Promise(resolver));
  }
  // Get the list of printers connected
  getPrinters(): Observable<string[]> {
    console.log('+++++++++PrinterService+++++');
    return fromPromise(
      qz.websocket.connect().then(() => qz.printers.find())
    )
    map((printers: string[]) => printers)
      , catchError(this.errorHandler);
  }

  // Get the SPECIFIC connected printer
  getPrinter(printerName: string): Observable<string> {
    return fromPromise(
      qz.websocket.connect()
        .then(() => qz.printers.find(printerName))
    )
    map((printer: string) => printer)
      , catchError(this.errorHandler);
  }

  // Print data to chosen printer
  printData(printer: string, data: any): Observable<any> {
    const config = qz.configs.create(printer);

    return fromPromise(qz.print(config, data))
    map((anything: any) => anything)
      , catchError(this.errorHandler);
  }

  private errorHandler(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      console.log(error.error);
      console.log('An error occurred:', error.status);
      return throwError(error.error);
    } else {
      console.log('An error occurred:', error.status);
      console.log(error.error);
      return throwError(error.error);
    }
  };
}

最后,您应该只从某个组件调用您的服务,并执行功能,在这种情况下,我使用了应用程序组件:

import { Component } from '@angular/core';
import { PrinterService } from './printer.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'qz-tray-example';
  printers: string[];

  constructor(public _printerService: PrinterService) {

  }

  ngOnInit() {
    this.printers = [];
    console.log('AppComponent____________');
    this._printerService.getPrinters().subscribe(
      data => {
        console.log(data);
        // this.printers = data;
        this.print();
      },
      err => {
        console.log(err);
      }
    );
  }

  print() {



    let content1 = `
    <html>
        <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        </head>

        <body>
            <div> 
                <h3>Printing Test 1</h3>
            </div>
        </body>
    </html>`;

    let content2 = `
    <html>
        <head>
            <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        </head>

        <body>
            <div> 
                <h3>Printing Test 2</h3>
            </div>
        </body>
    </html>`;
    var data = [{
      type: 'html',
      format: 'plain', // or 'plain' if the data is raw HTML
      data: content1
    },
    {
      type: 'html',
      format: 'plain', // or 'plain' if the data is raw HTML
      data: content2
    }];
    data[0].data = content1;
    this._printerService.printData('zebra', data).subscribe(
      data => {
        console.log('ok print');
      },
      err => {
        console.log(err);
      }
    );
  }
}

希望这个答案可以帮助某人开始使用他的应用程序,祝你好运;)。

于 2019-03-09T14:45:10.927 回答