import type { PosPaperSize } from '../printing/escpos.js'; import { type QrModuleSize } from '../printing/index.js'; import type { ReceiptLayout } from './layout.js'; /** * Das Beleg-Blatt: die vollstaendige Folge dessen, was auf dem Papier steht -- * Rasterzeilen, Firmenlogo, QR und Marke, mit Groessen als Anteil der * Blattbreite und in Zeilen. * * Bis 0.13 setzte jeder Zeichner das Raster selbst zusammen und entschied * Logo-Ort, Logo-Groesse, Rahmen und QR-Groesse fuer sich. Heraus kamen * fuenf verschiedene Belege (Panel: Logo ueber dem Testkassen-Rahmen, PDF: * Logo auf dem Rahmen, App: kein Logo). Hier steht das jetzt einmal. * * Masseinheit ist der Druckkopf (Epson Font A, 203 dpi): ein Zeichen ist 12 * Punkte breit, eine Zeile 24 Punkte hoch. Am Bildschirm ist eine Zeile `2ch`, * im PDF zwei Zeichenbreiten. */ export type SheetLogoSize = 'S' | 'M' | 'L' | 'XL'; /** Kasten je Stufe: Anteil der Blattbreite und Hoehe in Zeilen (Werte der Web-Kasse). */ export declare const SHEET_LOGO_SIZES: Readonly>; export declare const DOTS_PER_CHAR = 12; export declare const DOTS_PER_LINE = 24; export interface SheetLogo { size: SheetLogoSize; /** Pixelmass des Originalbilds -- ohne das laesst sich nicht einpassen. */ pixelWidth: number; pixelHeight: number; } export interface LogoDimensions { /** Anteil der Blattbreite (0..1). */ widthFraction: number; /** Hoehe in Zeilen (nicht ganzzahlig). */ heightLines: number; } export type SheetBlock = { readonly kind: 'line'; readonly text: string; readonly bold: boolean; readonly blank: boolean; /** * Die ersten n Spalten sind EINE Zelle, deren Inhalt (ohne Leerraum) * doppelt breit und doppelt hoch steht -- die Zeile ist dann zwei * Zeilen hoch. Nur das Testblatt des Zeichensatzes setzt das (Nummern * links); fehlt es, ist alles einfach gross. Ein Zeichner, der das Feld * nicht kennt, zeigt die Zeile in einfacher Groesse, die Spalten * bleiben dieselben. */ readonly doubleSizeLead?: number; } | { readonly kind: 'logo'; readonly widthFraction: number; readonly heightLines: number; } | { readonly kind: 'qr'; readonly payload: string; readonly widthFraction: number; } | { readonly kind: 'brandMark'; readonly width: number; readonly height: number; }; export interface ReceiptSheet { readonly charsPerLine: number; readonly blocks: readonly SheetBlock[]; } export interface ReceiptSheetOptions { /** Zeichen je Zeile; Vorgabe nach `layout.paperSize` (32/48). */ charsPerLine?: number; /** Firmenlogo; ohne Angabe kein Logo-Block. */ logo?: SheetLogo | null; /** Das Kasseneck-Logo am Ende (Konto-Flag `kreiseck_logo`). */ brandMark?: boolean; /** Geraete-Einstellung fuer die QR-Modulgroesse; Vorgabe `auto` (hoechstens 6 Punkte je Modul) — wie die Druckwege. */ qrModuleSize?: QrModuleSize; } /** * 32 Zeichen sind 58 mm, 48 sind 80 mm; andere Breiten behalten das Papier des * Layouts. Der QR-Anteil (`qrSheetWidthFraction`) wird dann fuer die Kopfbreite * DIESES Papiers gerechnet, nicht fuer die gewaehlte Zeichenzahl. */ export declare function paperSizeForChars(chars: number, fallback: PosPaperSize): PosPaperSize; /** * Obergrenze der Logo-Pixel, die der Bildschirm noch anzeigen darf -- exakt * dieselbe Grenze wie im Druck-Kit (`LOGO_MAX_PIXELS` in `druck-logo.ts`): * Bon und ePOS lehnen ein Logo ueber 4096x4096px schon beim Rastern ab (ein * grosses Bild blockiert das Geraet). Ohne diese Grenze wuerde der * Bildschirm ein Logo zeigen, das der Bon nie druckt -- Bildschirm und * Papier waeren sich uneins, genau das soll das Beleg-Blatt verhindern. */ export declare const LOGO_MAX_PIXELS = 4096; /** Reine Pruefung, ob ein Logo dieser Pixelmasse noch angezeigt/gedruckt werden darf. */ export declare function isLogoPixelSizeAllowed(width: number, height: number): boolean; /** * Das Logo in den Kasten seiner Stufe einpassen -- **nie hochrechnen**: ein * Bildpixel wird hoechstens ein Druckpunkt. Ein kleines Logo bleibt klein, * statt am Bon verwaschen zu werden (so hielten es PDF und Web-Kasse schon). */ export declare function logoDimensions(logo: SheetLogo, chars: number): LogoDimensions; /** Das Mass in ganzen Druckpunkten -- so gross muss das Rasterbild fuer den Bon sein. */ export declare function logoRasterSize(dimensions: LogoDimensions, chars: number): { width: number; height: number; }; /** * Anteil der Blattbreite, den der QR am Drucker einnimmt -- dieselbe Rechnung * wie der Druckweg (nativ, sonst der Bildweg). Bildschirm und PDF zeigen den * QR in genau dieser Groesse. Leere Nutzlast: 0 (kein Symbol). * * Der Kasten **schliesst die Ruhezone von 4 Modulen je Seite ein** und setzt * Fehlerkorrektur M voraus. Ein Zeichner (`renderQr`, PDF) muss das Symbol * darum mit Fehlerkorrektur M und einer Ruhezone von 4 Modulen zeichnen, die * den Kasten ganz ausfuellt -- sonst stimmt die Modulgroesse nicht mit dem Bon. */ export declare function qrSheetWidthFraction(payload: string, paperSize: PosPaperSize, size?: QrModuleSize): number; export declare function receiptSheet(layout: ReceiptLayout, options?: ReceiptSheetOptions): ReceiptSheet;