setReceiptSheet method

Future<void> setReceiptSheet(
  1. ReceiptLayout layout, {
  2. bool brandMark = false,
  3. bool cut = true,
  4. QrPrintMode qrMode = QrPrintMode.imageRaster,
  5. QrModuleSize qrModuleSize = QrModuleSize.auto,
})

Druckt das Blatt (Zwilling von escPosLayoutBytes ab npm 0.14.0): Rasterzeilen, Firmenlogo nach dem fuehrenden Rahmen, QR im eingestellten Modus, Marke am Ende -- dieselbe Folge wie Bildschirm und PDF.

Wirft ArgumentError, wenn das Rasterbild von logo nicht so gross ist, wie das Blatt das Logo setzt -- vor dem ersten Byte, das Papier bleibt dann unangetastet.

Implementation

Future<void> setReceiptSheet(ReceiptLayout layout,
    {PrintLogo? logo,
    bool brandMark = false,
    bool cut = true,
    QrPrintMode qrMode = QrPrintMode.imageRaster,
    QrModuleSize qrModuleSize = QrModuleSize.auto}) async {
  final blatt = receiptSheet(
    _druckbaresLayout(layout),
    charsPerLine: paperSize.defaultCharCount,
    logo: logo == null ? null : SheetLogo(size: logo.size, pixelWidth: logo.pixelWidth, pixelHeight: logo.pixelHeight),
    brandMark: brandMark,
    qrModuleSize: qrModuleSize,
  );
  if (logo != null) {
    // Das Rasterbild muss so gross sein, wie das Blatt das Logo setzt --
    // sonst stuende am Bon ein anderes Logo als am Schirm. Vor dem ersten Byte.
    final block = blatt.blocks.whereType<SheetLogoBlock>().single;
    final soll = logoRasterSize(LogoDimensions(widthFraction: block.widthFraction, heightLines: block.heightLines), blatt.charsPerLine);
    if (logo.raster.width != soll.width || logo.raster.height != soll.height) {
      throw ArgumentError('Logo-Raster ${logo.raster.width}x${logo.raster.height} passt nicht zum Blatt (${soll.width}x${soll.height})');
    }
  }
  reset();
  for (final b in blatt.blocks) {
    switch (b) {
      case SheetLine():
        if (b.blank) {
          addFeed(lines: 1);
        } else {
          addText(b.text.trimRight(), styles: PosStyles(align: PosAlign.left, bold: b.bold));
        }
      case SheetLogoBlock():
        await addImage(logo!.raster.toRasterImage(), align: PosAlign.center);
      case SheetBrandMark():
        await addImage(brandMarkImage(paperSize).toRasterImage(), align: PosAlign.center);
      case SheetQr():
        // Das Layout liefert beim QR NUR die Nutzlast; wie daraus ein QR
        // wird, entscheidet der Renderer -- am Drucker also der Modus, den
        // der Chef fuer sein Geraet eingestellt hat. Fest `addQrCode` zu
        // rufen hiesse `native` fuer alle, und Drucker ohne `GS ( k` drucken
        // dann GAR KEINEN QR. Auf einer oesterreichischen Kassa ist der QR
        // die maschinenlesbare Signatur -- er darf nie stillschweigend
        // wegfallen, nur weil das Blatt aus dem Zeilenmodell kommt.
        // Anteil 0 bei nicht leerer Nutzlast: der Inhalt passt in keine
        // QR-Version -- weder Befehl noch Bild koennen ihn setzen. Der Beleg
        // geht ohne QR hinaus und meldet es ueber [qrError] (npm: `qrError`).
        if (b.payload.isNotEmpty && b.widthFraction <= 0) {
          _qrAusfall(b.payload, 'QR-Inhalt passt in keine QR-Version -- Beleg ohne QR');
          break;
        }
        await _qrNachModus(b.payload, qrMode, groesse: qrModuleSize, blattAnteil: b.widthFraction);
    }
  }
  if (cut) addCut();
}