# manuelbl/swissqrbill architecture

> Architecture diagram of the GitHub repository manuelbl/swissqrbill, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/manuelbl/swissqrbill
- Repository: https://github.com/manuelbl/swissqrbill

## Overview

This is a Java library for creating and decoding Swiss QR bills. Callers populate bill data and formatting options, then invoke QRBill to validate and normalize it, create QR payment data, lay out the payment slip, and produce PDF, SVG, or PNG bytes; QRBill also exposes parsing of embedded QR data. Separate capabilities include Swico S1 bill information and adding a bill to an existing PDF. Edges follow the README or references in the supplied source index; several implementation details were not sampled, so those relationships are omitted.

Main entry points: [`generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java) (QR bill API), [`generator/src/main/java/net/codecrete/qrbill/canvas/AbstractCanvas.java`](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/AbstractCanvas.java) (Canvas base), [`generator/src/main/java/net/codecrete/qrbill/generator/Validator.java`](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Validator.java) (Bill validation), [`generator/src/main/java/net/codecrete/qrbill/generator/Bill.java`](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Bill.java) (Bill model)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_bill_data["Bill data"]
  node_bill["Bill model<br/>[Bill.java]"]
  node_address["Address model<br/>[Address.java]"]
  node_format["Output options<br/>[BillFormat.java]"]
  node_swico["Swico S1 data"]
end

subgraph group_payment_rules["Payment data"]
  node_validator["Bill validation<br/>[Validator.java]"]
  node_validation_result["Validation results"]
  node_payment_rules["Payment rules<br/>[Payments.java]"]
  node_swico_codec["Swico codec"]
end

subgraph group_generation["Bill generation"]
  node_qr_text["QR data text<br/>[QRCodeText.java]"]
  node_qr_code["QR code<br/>[QRCode.java]"]
  node_layout["Bill layout<br/>[BillLayout.java]"]
  node_generator["QR bill API<br/>[QRBill.java]"]
end

subgraph group_graphics["Graphics output"]
  node_canvas["Canvas interface<br/>[Canvas.java]"]
  node_abstract_canvas["Canvas base"]
  node_pdf["PDF output<br/>[PDFCanvas.java]"]
  node_svg["SVG output<br/>[SVGCanvas.java]"]
  node_png["PNG output<br/>[PNGCanvas.java]"]
end

node_caller(("Library caller"))

node_caller -->|"calls"| node_generator
node_caller -->|"provides data"| node_bill
node_bill -->|"holds"| node_address
node_generator -->|"validates"| node_validator
node_validator -->|"records errors"| node_validation_result
node_validator -->|"checks"| node_payment_rules
node_generator -->|"parses data"| node_qr_text
node_generator -->|"creates"| node_qr_code
node_generator -->|"lays out"| node_layout
node_layout -->|"draws on"| node_canvas
node_abstract_canvas -->|"implements"| node_canvas
node_generator -->|"selects output"| node_pdf
node_generator -->|"selects output"| node_svg
node_generator -->|"selects output"| node_png
node_pdf -->|"extends"| node_abstract_canvas
node_svg -->|"extends"| node_abstract_canvas
node_png -->|"uses"| node_abstract_canvas
node_generator -.->|"handles information"| node_swico
node_swico -->|"encodes or decodes"| node_swico_codec

click node_bill "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Bill.java"
click node_address "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Address.java"
click node_format "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/BillFormat.java"
click node_swico "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/SwicoBillInformation.java"
click node_validator "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Validator.java"
click node_validation_result "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/ValidationResult.java"
click node_payment_rules "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Payments.java"
click node_swico_codec "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/SwicoS1Decoder.java"
click node_qr_text "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRCodeText.java"
click node_qr_code "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRCode.java"
click node_layout "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/BillLayout.java"
click node_generator "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java"
click node_canvas "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/Canvas.java"
click node_abstract_canvas "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/AbstractCanvas.java"
click node_pdf "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/PDFCanvas.java"
click node_svg "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/SVGCanvas.java"
click node_png "https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/PNGCanvas.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_bill,node_address,node_format,node_swico toneBlue
class node_validator,node_validation_result,node_payment_rules,node_swico_codec toneAmber
class node_qr_text,node_qr_code,node_layout,node_generator toneMint
class node_canvas,node_abstract_canvas,node_pdf,node_svg,node_png toneRose
class node_caller toneIndigo
```

## Components

### Bill data

- [Bill model](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Bill.java): `generator/src/main/java/net/codecrete/qrbill/generator/Bill.java`
- [Address model](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Address.java): `generator/src/main/java/net/codecrete/qrbill/generator/Address.java`
- [Output options](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/BillFormat.java): `generator/src/main/java/net/codecrete/qrbill/generator/BillFormat.java`
- [Swico S1 data](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/SwicoBillInformation.java): `generator/src/main/java/net/codecrete/qrbill/generator/SwicoBillInformation.java`

### Payment data

- [Bill validation](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Validator.java): `generator/src/main/java/net/codecrete/qrbill/generator/Validator.java`
- [Validation results](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/ValidationResult.java): `generator/src/main/java/net/codecrete/qrbill/generator/ValidationResult.java`
- [Payment rules](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/Payments.java): `generator/src/main/java/net/codecrete/qrbill/generator/Payments.java`
- [Swico codec](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/SwicoS1Decoder.java): `generator/src/main/java/net/codecrete/qrbill/generator/SwicoS1Decoder.java`

### Bill generation

- [QR data text](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRCodeText.java): `generator/src/main/java/net/codecrete/qrbill/generator/QRCodeText.java`
- [QR code](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRCode.java): `generator/src/main/java/net/codecrete/qrbill/generator/QRCode.java`
- [Bill layout](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/BillLayout.java): `generator/src/main/java/net/codecrete/qrbill/generator/BillLayout.java`
- [QR bill API](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java): `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`

### Graphics output

- [Canvas interface](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/Canvas.java): `generator/src/main/java/net/codecrete/qrbill/canvas/Canvas.java`
- [Canvas base](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/AbstractCanvas.java): `generator/src/main/java/net/codecrete/qrbill/canvas/AbstractCanvas.java`
- [PDF output](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/PDFCanvas.java): `generator/src/main/java/net/codecrete/qrbill/canvas/PDFCanvas.java`
- [SVG output](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/SVGCanvas.java): `generator/src/main/java/net/codecrete/qrbill/canvas/SVGCanvas.java`
- [PNG output](https://github.com/manuelbl/swissqrbill/blob/master/generator/src/main/java/net/codecrete/qrbill/canvas/PNGCanvas.java): `generator/src/main/java/net/codecrete/qrbill/canvas/PNGCanvas.java`

### Other components

- **Library caller**

## Connections

- Library caller → QR bill API: calls (evidence: `README.md`)
- Library caller → Bill model: provides data (evidence: `README.md`)
- Bill model → Address model: holds (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/Bill.java`)
- QR bill API → Bill validation: validates (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- Bill validation → Validation results: records errors (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/Validator.java`)
- Bill validation → Payment rules: checks (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/Validator.java`)
- QR bill API → QR data text: parses data (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- QR bill API → QR code: creates (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- QR bill API → Bill layout: lays out (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- Bill layout → Canvas interface: draws on (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/BillLayout.java`)
- Canvas base → Canvas interface: implements (evidence: `generator/src/main/java/net/codecrete/qrbill/canvas/AbstractCanvas.java`)
- QR bill API → PDF output: selects output (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- QR bill API → SVG output: selects output (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- QR bill API → PNG output: selects output (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/QRBill.java`)
- PDF output → Canvas base: extends (evidence: `generator/src/main/java/net/codecrete/qrbill/canvas/PDFCanvas.java`)
- SVG output → Canvas base: extends (evidence: `generator/src/main/java/net/codecrete/qrbill/canvas/SVGCanvas.java`)
- PNG output → Canvas base: uses (evidence: `generator/src/main/java/net/codecrete/qrbill/canvas/PNGCanvas.java`)
- QR bill API → Swico S1 data: handles information
- Swico S1 data → Swico codec: encodes or decodes (evidence: `generator/src/main/java/net/codecrete/qrbill/generator/SwicoBillInformation.java`)
