Einbindung
Multi-Target-DLL BoDOC.dll (net10.0-windows;net48, UseWindowsForms=true). Alle Typen liegen im Namespace BoDoc. Zeichenlogik nutzt System.Drawing/WinForms — Wiederverwendung nur in Windows-Desktop-Projekten.
📦 Nur eine einzige DLL-Datei — ca. 150 kB groß. Kein NuGet, keine externen Abhängigkeiten.
.NET Framework 4.8 (VB.NET, WinForms)
- WinForms-Projekt → Verweis auf
BoDOC.dllhinzufügen. Imports BoDocin jeder Datei, die die Typen nutzt.- Der Viewer ist ein
UserControl: per Code in ein Panel (Dock = Fill) legen — er hat keine Designer-/.resx-Datei.
.NET 10 (net10.0-windows)
- Projekt-TFM
net10.0-windowsund<UseWindowsForms>true</UseWindowsForms>setzen. <Reference>aufBoDOC.dll(oder Projektverweis) — dasnet10.0-windows-Asset wird automatisch gewählt.Imports BoDocbzw.using BoDoc;.
Quer durch die API sind Public-Member klassenübergreifend eindeutig präfixiert:
Text* Line* Rect* Image* Ean* Qr* Code128* Page* Document* Viewer* Print* Pdf* Pay* BoDocLicense*. Alle Maße in mm, Schriftgrößen in pt. Seitengröße ist eine Dokument-Eigenschaft — alle Seiten eines Dokuments sind gleich groß.Beispiel — Dokument mit Text, Boxen, Grafik, Bild, QR & Barcodes
' Dokument A4 anlegen + Default-Font/Metadaten setzen Dim doc As New BoDocDocument(BoDocPaper.A4) doc.DocumentTitle = "Rechnung 2026-0001" doc.DocumentSetDefaultFont(BoDocFont.Calibri) doc.DocumentDefaultFontSizePt = 10.0F ' --- Kopfzeile: gefülltes Rechteck mit runden Ecken + weißer Titeltext --- doc.Add(New BoDocRect(15, 12, 180, 16) With { .Page = 1, .RectFilled = True, .RectFillColor = Color.FromArgb(31, 78, 110), .RectHasBorder = False, .RectCornerRadiusMm = 2.0}) doc.Add(New BoDocTextBox("RECHNUNG", 20, 12, 120, 16) With { .TextSizePt = 15.0F, .TextBold = True, .TextColor = Color.White, .TextVAlign = BoDocVAlign.Middle}) ' --- Firmenlogo (Bild aus Datei; Höhe automatisch aus Seitenverhältnis) --- doc.Add(New BoDocImage("C:\Firma\logo.png", 150, 32, 45, 0)) ' --- Fließtext, rechtsbündig, eigene Farbe --- doc.Add(New BoDocTextBox("Musterkunde GmbH" & vbCrLf & "Beispielweg 1" & vbCrLf & "1010 Wien", 15, 34, 100, 0) With {.TextColor = Color.FromArgb(90, 90, 90)}) ' --- Info-Box (leichte Füllung + Rahmen), Text darin zentriert --- doc.Add(New BoDocRect(15, 60, 180, 12) With { .RectFilled = True, .RectFillColor = Color.FromArgb(238, 243, 248), .RectCornerRadiusMm = 1.5}) doc.Add(New BoDocTextBox("Zahlbar bis 14 Tage netto", 15, 60, 180, 12) With { .TextHAlign = BoDocHAlign.Center, .TextVAlign = BoDocVAlign.Middle, .TextBold = True}) ' --- Trennlinie unter dem aktuellen Inhalt (GetPos verfolgt die Unterkante) --- doc.Add(New BoDocLine(15, doc.GetPos(1) + 4, 195, doc.GetPos(1) + 4) With {.LinePenWidth = 0.4}) ' --- Selbst gezeichnete Grafik: einfaches Balkendiagramm aus Rechtecken --- Dim werte() As Double = {20, 45, 30, 60} For i As Integer = 0 To werte.Length - 1 doc.Add(New BoDocRect(20 + i * 14, 150 - werte(i), 10, werte(i)) With { .RectFilled = True, .RectFillColor = Color.FromArgb(214, 90, 30), .RectHasBorder = False}) Next ' --- QR-Code (freier Inhalt) und EAN-13-Barcode --- doc.Add(New BoDocQr("https://www.bonit.at", 150, 160, 30, 30) With { .QrErrorCorrection = BoDocQrEcLevel.M}) doc.Add(New BoDocEan13("9012345678903", 15, 165, 45, 22)) ' --- Zahlungs-QR / GiroCode (EPC069-12) — Builder legt Rahmen+QR+Caption --- Dim pay As New BoDocPayQr() With { .PayName = "Max Mustermann", .PayIban = "AT61 1904 3002 3457 3201", .PayAmount = 199.90D, .PayRemittance = "Rechnung 2026-0001"} Dim r = pay.PayBuild(doc, 70, 160, 55) ' x, y, Breite (mm) → r.PayResultBottomMm = Unterkante ' --- Lesezeichen (nur im PDF sichtbar) --- doc.DocumentAddBookmark("Seite 1", 1) ' === Ausgabe === viewer1.ViewerSetDocument(doc) ' a) im Viewer anzeigen BoDocPdfWriter.PdfWriteToFile(doc, "C:\Temp\rechnung.pdf") ' b) als PDF BoDocPrint.PrintDialogFor(doc, Me) ' c) drucken doc.Dispose() ' gibt Ressourcen frei; der Viewer erledigt das sonst automatisch
Lizenz: ohne gültigen Schlüssel bleibt die Ausgabe frei bis 1 Seite und 25 Elemente; darüber stempeln PDF und Druck ein DEMO-Wasserzeichen (die Vorschau nie). Einmalig beim Start
BoDocLicense.BoDocLicenseSetLicense(key) aufrufen.1 · Aufzählungen & Helfer
BoDocHAlignEnumHorizontale Textausrichtung in der Textbox.
Werte
| Left | 0 | Linksbündig (Standard). |
| Center | 1 | Zentriert. |
| Right | 2 | Rechtsbündig. |
BoDocVAlignEnumVertikale Textausrichtung in der Textbox (nur bei fester TextHeight).
Werte
| Top | 0 | Oben (Standard). |
| Middle | 1 | Vertikal zentriert. |
| Bottom | 2 | Unten. |
BoDocQrEcLevelEnumQR-Fehlerkorrekturstufe (Anteil wiederherstellbarer Daten).
Werte
| L | 0 | ~7 %. |
| M | 1 | ~15 % (Standard, EPC-Norm für Zahlungs-QR). |
| Q | 2 | ~25 %. |
| H | 3 | ~30 %. |
BoDocPaperEnumVordefinierte Papierformate. Bon-Formate sind Endlos (Höhe aus dem Inhalt).
Werte
| A4 | 0 | 210 × 297 mm. |
| A5 | 1 | 148 × 210 mm. |
| Bon80 | 2 | 80-mm-Thermorolle, endlos (bedruckbar 72 mm). |
| Bon58 | 3 | 58-mm-Thermorolle, endlos (bedruckbar 48 mm). |
BoDocFontEnumAuswahl gängiger Schriften für TextFontName / DocumentDefaultFontName.
Gruppe 1 = PDF-Standard-14 (in jedem Viewer ohne Einbettung vorhanden; die Vorschau zeigt den metrisch gleichen Systemfont). Gruppe 2 = verbreitete System-Fonts (mit echtem Namen ins PDF, Ersatzschrift durch den Viewer möglich). Fett/Kursiv immer über
TextBold/TextItalic. Jeder weitere Font ist per String möglich.Standard-14 (0–4)
| Helvetica | 0 | ~ Arial in der Vorschau. |
| Times | 1 | ~ Times New Roman. |
| Courier | 2 | ~ Courier New (monospace). |
| Symbol | 3 | Sonderzeichensatz. |
| ZapfDingbats | 4 | Sonderzeichensatz. |
System-Fonts (5–19)
| Arial | 5 | |
| Calibri | 6 | |
| Verdana | 7 | |
| Tahoma | 8 | |
| SegoeUI | 9 | → "Segoe UI". |
| TrebuchetMS | 10 | → "Trebuchet MS". |
| ComicSansMS | 11 | → "Comic Sans MS". |
| Georgia | 12 | |
| Cambria | 13 | |
| BookAntiqua | 14 | → "Book Antiqua". |
| Garamond | 15 | |
| PalatinoLinotype | 16 | → "Palatino Linotype". |
| Consolas | 17 | monospace. |
| LucidaConsole | 18 | → "Lucida Console". |
| Impact | 19 |
BoDocFontHelperModuleWandelt BoDocFont in den Fontnamen (String).
Funktionen
BoDocFontToName(font As BoDocFont) As String
Liefert den zu einem
BoDocFont gehörenden Fontnamen, wie er TextFontName/DocumentDefaultFontName zugewiesen wird. Unbekannte Werte → "Helvetica".2 · Zeichenprimitive
Jedes Primitiv erbt die Property
Page (Integer): Zielseite beim Einfügen über doc.Add — 0 = aktuelle Seite, sonst 1-basiert. Reiner Authoring-Hinweis, von den Renderern ignoriert.BoDocTextBoxNotInheritable: BoDocPrimitiveTextblock in einem Rahmen (mm) mit Wortumbruch.
Auto-Maße:
TextWidth ≤ 0 ⇒ Breite bis zur rechten Papierkante (Seitenbreite − TextX). TextHeight ≤ 0 ⇒ Höhe automatisch aus dem Font (V-Ausrichtung entfällt, Block beginnt bei TextY). Font/Größe werden beim Add aus den Dokument-Defaults gefüllt, falls nicht gesetzt.Konstruktoren
New()
New(content As String, x, y, width, height As Double)
Text plus Rahmen (mm).
Properties
| Name | Typ | Beschreibung |
|---|---|---|
| TextContent | String | Anzuzeigender Text (Zeilenumbrüche erlaubt). |
| TextFontName | String | Fontname; leer ⇒ Dokument-Default bzw. "Arial". |
| TextSizePt | Single | Schriftgröße in pt; 0 ⇒ Dokument-Default bzw. 10. |
| TextBold | Boolean | Fett. |
| TextItalic | Boolean | Kursiv. |
| TextUnderline | Boolean | Unterstrichen. |
| TextColor | Color | Textfarbe (Standard Schwarz). |
| TextHAlign | BoDocHAlign | Horizontale Ausrichtung. |
| TextVAlign | BoDocVAlign | Vertikale Ausrichtung (nur bei fester Höhe). |
| TextX | Double | Linke Rahmenkante (mm). |
| TextY | Double | Obere Rahmenkante (mm). |
| TextWidth | Double | Breite (mm); ≤ 0 = automatisch. |
| TextHeight | Double | Höhe (mm); ≤ 0 = automatisch aus dem Font. |
| TextWordWrap | Boolean | Wortumbruch (Standard True). |
| TextEffectiveFontNameget | String | Tatsächlich verwendeter Fontname (Rückfall "Arial"). |
| TextEffectiveSizePtget | Single | Tatsächlich verwendete Größe (Rückfall 10 pt). |
Methoden
Sub TextSetFont(font As BoDocFont)
Setzt
TextFontName aus der Enum (String-Zuweisung bleibt möglich).BoDocLineNotInheritable: BoDocPrimitiveGerade Linie zwischen zwei Punkten (mm).
Konstruktoren
New()
New(x1, y1, x2, y2 As Double)
Properties
| LineX1 / LineY1 | Double | Startpunkt (mm). |
| LineX2 / LineY2 | Double | Endpunkt (mm). |
| LinePenWidth | Double | Strichstärke (mm, Standard 0,2). |
| LineColor | Color | Linienfarbe (Standard Schwarz). |
BoDocRectNotInheritable: BoDocPrimitiveRechteck (mm) mit optionalem Rand und optionaler Füllung.
Konstruktoren
New()
New(x, y, width, height As Double)
Properties
| RectX / RectY | Double | Obere linke Ecke (mm). |
| RectWidth / RectHeight | Double | Maße (mm). |
| RectHasBorder | Boolean | Rand zeichnen (Standard True). |
| RectBorderColor | Color | Randfarbe (Standard Schwarz). |
| RectPenWidth | Double | Randstärke (mm, Standard 0,2). |
| RectFilled | Boolean | Fläche füllen (Standard False). |
| RectFillColor | Color | Füllfarbe (Standard Weiß). |
| RectCornerRadiusMm | Double | Eckenradius (mm); 0 = eckig. Renderer begrenzt auf halbe kürzere Seite. |
BoDocImageNotInheritable: BoDocPrimitiveBild an einem Platzierungsrechteck (mm). Hält die Original-Bytes.
JPEG wird im PDF 1:1 als DCTDecode eingebettet. Fehlende Maße werden aus dem Seitenverhältnis ergänzt (beide ≤ 0 = native Größe aus Pixeln/DPI). Bytes werden entweder direkt übergeben oder lazy aus
ImageFileName geladen (nur gültige Bilddateien).Konstruktoren
New()
New(data As Byte(), fileName As String, x, y, width, height As Double)
Aus Bytes; ist
data leer, wird aus fileName geladen.New(fileName As String, x, y, width, height As Double)
Nur über Dateiname (Bytes werden geladen).
Properties
| ImageData | Byte() | Original-Dateibytes. |
| ImageFileName | String | Lade-/Pfad oder logischer Name (z. B. "logo.jpg"). |
| ImageX / ImageY | Double | Platzierung (mm). |
| ImageWidth / ImageHeight | Double | Maße (mm); ≤ 0 = automatisch. |
| ImageKeepAspectRatio | Boolean | Bei beiden Maßen > 0 zentriert einpassen (Letterbox). Standard True. |
| ImageAutoHeight | Boolean | Legacy-Flag: Höhe aus Breite ableiten (Vorrang vor KeepAspectRatio). |
| ImagePixelWidthget | Integer | Pixelbreite des Originals (lazy; 0 ohne gültiges Bild). |
| ImagePixelHeightget | Integer | Pixelhöhe des Originals. |
Methoden
Function ImageEnsureData() As Byte()
Lädt Bytes bei Bedarf aus
ImageFileName und merkt sie; gibt die Bytes zurück (Nothing, wenn keine Quelle) — z. B. zum Prüfen, ob ein Bild geladen werden konnte.BoDocEan13NotInheritable: BoDocPrimitiveEAN-13-Barcode (12/13 Ziffern; Prüfziffer im Encoder).
Konstruktoren
New()
New(data As String, x, y, width, height As Double)
Properties
| EanData | String | 12 oder 13 Ziffern. |
| EanX / EanY | Double | Platzierung (mm). |
| EanWidth / EanHeight | Double | Maße (mm). |
| EanShowText | Boolean | Klarschrift-Ziffern unter dem Code (Standard True). |
BoDocQrNotInheritable: BoDocPrimitiveQR-Code. Modulmatrix liefert der Encoder.
Konstruktoren
New()
New(data As String, x, y, width, height As Double)
Properties
| QrData | String | Nutztext. |
| QrX / QrY | Double | Platzierung (mm). |
| QrWidth / QrHeight | Double | Maße (mm). |
| QrErrorCorrection | BoDocQrEcLevel | Fehlerkorrektur (Standard M). |
| QrQuietModules | Integer | Ruhezone in Modulen je Seite innerhalb der QR-Fläche (Standard 4). Nur auf 0 setzen, wenn außen bereits eine helle Fläche liegt. |
BoDocCode128NotInheritable: BoDocPrimitiveCode-128-Barcode (Ziffern & Buchstaben, variable Länge).
Konstruktoren
New()
New(data As String, x, y, width, height As Double)
Properties
| Code128Data | String | Nutzdaten (druckbares ASCII 32–126). |
| Code128X / Code128Y | Double | Platzierung (mm). |
| Code128Width / Code128Height | Double | Maße (mm). |
| Code128ShowText | Boolean | Klarschrift unter dem Code (Standard True). |
3 · Seite, Lesezeichen & Dokument
BoDocPageNotInheritableEine Dokumentseite: geordnete Primitivliste. Größe delegiert ans Dokument.
Größe ist eine Dokument-Eigenschaft: bei zugeordneter Seite liefern
PageWidthMm/PageHeightMm/PageContinuous die Werte des Dokuments (alle Seiten gleich groß). Eine freistehende Seite nutzt ihre Standalone-Startmaße.Konstanten (mm)
| A4WidthMm / A4HeightMm | Double | 210 / 297. |
| A5WidthMm / A5HeightMm | Double | 148 / 210. |
| Bon80PaperWidthMm / Bon80PrintWidthMm | Double | 80 / 72. |
| Bon58PaperWidthMm / Bon58PrintWidthMm | Double | 58 / 48. |
| BonStartHeightMm | Double | 100 (vorläufige Starthöhe für Endlos). |
Konstruktoren & Factory
New()
Freistehende A4-Seite.
New(widthMm, heightMm As Double)
Shared Function Create(paper As BoDocPaper) As BoDocPage
Freistehende Seite im vordefinierten Format (Bon = Endlos).
Properties
| PageWidthMmget | Double | Breite (mm) — vom Dokument bzw. Standalone. |
| PageHeightMmget | Double | Höhe (mm). |
| PageContinuousget | Boolean | Endlosformat. |
| PagePrimitivesget | List(Of BoDocPrimitive) | Geordnete Primitivliste (Reihenfolge = Z-Ordnung). |
| PageContentBottomMm | Double | Unterkante des tiefsten Inhalts (mm); Basis für GetPos. Bei Auto-Höhe real inkl. Wortumbruch vermessen. |
BoDocBookmarkNotInheritablePDF-Lesezeichen (Outline). Nur der PDF-Writer wertet es aus.
Baumstruktur ergibt sich aus der flachen Liste am Dokument plus
BookmarkLevel (0 = oberste Ebene; höhere Zahl = Kind des letzten Eintrags mit kleinerem Level).Konstruktoren
New()
New(title As String, page As Integer, Optional ymm As Double = 0, Optional level As Integer = 0)
Properties
| BookmarkTitle | String | Anzeigetext. |
| BookmarkPage | Integer | Zielseite (1-basiert). |
| BookmarkYmm | Double | Ziel-Y (mm von oben); 0 = Seitenoberkante. |
| BookmarkLevel | Integer | Einrücktiefe (0-basiert). |
BoDocDocumentNotInheritable: IDisposableKernobjekt: Seiten, dokumentweite Größe, Metadaten, Lesezeichen, Authoring-API.
Konstruktoren
New()
Format A4.
New(paper As BoDocPaper)
New(widthMm, heightMm As Double)
Eigenes festes Seitenmaß.
Properties — Format & Metadaten
| DocumentPageWidthMm | Double | Breite aller Seiten (Standard 210). |
| DocumentPageHeightMm | Double | Höhe aller Seiten (Standard 297); bei Endlos nur Startwert. |
| DocumentContinuous | Boolean | Endlosformat (Thermorolle) — Höhe folgt aus dem Inhalt. |
| DocumentTitle | String | PDF: Title (auch Druckjob-Name). |
| DocumentAuthor | String | PDF: Author. |
| DocumentSubject | String | PDF: Subject. |
| DocumentKeywords | String | PDF: Keywords (kommagetrennt). |
| DocumentCreator | String | PDF: Creator (Standard "BoDOC"). |
| DocumentProducer | String | PDF: Producer (Standard "BoDOC"). |
| DocumentCreatedAt | Date | PDF: CreationDate. |
| DocumentModifiedAt | Date | PDF: ModDate. |
| DocumentDefaultFontName | String | Default-Font für TextBoxen ohne eigenen Font (Standard "Arial"). |
| DocumentDefaultFontSizePt | Single | Default-Größe (Standard 10 pt). |
| DocumentCurrentPageNo | Integer | Aktuelle Seite (1-basiert; 0 = keine). Setzen legt fehlende Seiten an. |
| DocumentPagesget | List(Of BoDocPage) | Geordnete Seitenliste. |
| DocumentBookmarksget | List(Of BoDocBookmark) | Flache Lesezeichenliste. |
| DocumentIsDisposedget | Boolean | True nach Dispose. |
Methoden — Format setzen
Sub DocumentSetPaper(paper As BoDocPaper)
Dokumentweite Größe aus einem Papierformat.
Sub DocumentSetSize(widthMm, heightMm As Double)
Festes Maß; schaltet Endlos aus.
Sub DocumentSetDefaultFont(font As BoDocFont)
Setzt
DocumentDefaultFontName aus der Enum.Methoden — Seiten & Inhalt
Function Add(Of T As BoDocPrimitive)(p As T) As T
Kern-Authoring: fügt ein Primitiv ein. Zielseite aus
p.Page (0 = aktuelle); fehlende Seiten werden angelegt, Text-Defaults gefüllt. Gibt p typ-erhaltend zurück.Function AddPage() As BoDocPage
Neue Seite im Dokumentformat anlegen, zur aktuellen machen, zurückgeben.
Function AddPage(widthMm, heightMm As Double) As BoDocPage
Setzt das dokumentweite Maß und legt danach eine Seite an (gilt für ALLE Seiten).
Function AddPage(paper As BoDocPaper) As BoDocPage
Setzt das dokumentweite Format und legt eine Seite an.
Sub AddPage(page As BoDocPage)
Bestehende Seite anhängen. Als erste Seite übernimmt das Dokument deren Format.
Function NewPage() As BoDocPage
Alias für
AddPage().Function EnsurePage(pageNo As Integer) As BoDocPage
Stellt sicher, dass Seite
pageNo existiert (legt fehlende davor an); setzt sie als aktuelle. ≤ 0 = aktuelle bzw. Seite 1.Function GetPos(Optional pageNo As Integer = 0) As Double
Unterkante (mm) des tiefsten Inhalts der Seite — für mehrseitige Listen und "Seite N von M". ≤ 0 = aktuelle Seite.
Function DocumentAddBookmark(title As String, page As Integer, Optional ymm = 0, Optional level = 0) As BoDocBookmark
Hängt ein Lesezeichen an und gibt es zurück.
Methoden — Lebenszyklus
Sub DocumentClear()
Leert das Dokument zur WIEDERVERWENDUNG: gibt Ressourcen frei, entfernt Seiten. Format & Metadaten bleiben — sofort wieder befüllbar. War es disposed, wird es wieder nutzbar.
Sub Dispose()
Gibt alle Ressourcen (v. a. Bild-Bytes) endgültig frei und leert die Seiten. Idempotent. Normaler Weg: erstellen → anzeigen → Dispose.
4 · Authoring-Helfer
BoDocHelperModuleKomfortfunktionen über dem Modell.
Funktionen
Sub BoDocHR(doc As BoDocDocument)
Zeichnet eine dünne Trennlinie knapp unter den aktuellen Inhalt von Seite 1 (Bequemlichkeit für einfache Listen).
Function BoDocDemoDocument(Optional paper As BoDocPaper = BoDocPaper.A4) As BoDocDocument
Erzeugt ein dreiseitiges, sich selbst erklärendes Handbuch-Dokument, das alle Bausteine zeigt (Text, Formen, Diagramm, EAN-13, Code 128, QR, Zahlungs-QR, Lesezeichen, Metadaten). Ohne Lizenz tragen PDF/Druck das DEMO-Wasserzeichen — zugleich Sichttest der Lizenzierung.
BoDocPayQrNotInheritableBuilder für den Zahlungs-QR-Block (EPC-QR / GiroCode, "Zahlen mit Code").
Legt drei Primitive ins Dokument: Rahmen (weißer Hintergrund), zentrierter QR, Caption darunter. Pflicht sind
PayName und PayIban. Payload nach EPC069-12 (SCT, UTF-8, Version 002, max. 331 Bytes); IBAN wird per mod-97 geprüft.Konstruktor
New()
Properties — Zahlungsdaten
| PayName | String | Empfängername (Pflicht, max. 70). |
| PayIban | String | Empfänger-IBAN (Pflicht, mod-97-geprüft). |
| PayBic | String | BIC (optional, 8 oder 11 Zeichen). |
| PayAmount | Decimal | Betrag EUR; 0 = keiner, sonst 0,01…999999999,99. |
| PayRemittance | String | Unstrukturierter Verwendungszweck (max. 140). Alternativ zu Referenz. |
| PayStructuredReference | String | Strukturierte Referenz (max. 35). Alternativ zu Remittance. |
| PayPurposeCode | String | Purpose Code (optional, max. 4, z. B. "GDDS"). |
| PayErrorCorrection | BoDocQrEcLevel | QR-Fehlerkorrektur (EPC-Standard M). |
| PayPage | Integer | Zielseite (1-basiert); 0 = aktuelle. |
Properties — Layout
| PayCaptionText | String | Caption unter dem QR (Default "Zahlen mit Code"; leer = keine). |
| PayCaptionFontName | String | Caption-Font (Default "Arial"). |
| PayCaptionSizePt | Single | Caption-Größe (Default 9). |
| PayCaptionBold | Boolean | Caption fett (Default True). |
| PayCaptionColor | Color | Caption-Farbe. |
| PayCaptionHeightMm | Double | Caption-Höhe (mm); 0 = automatisch. |
| PayCaptionBgMarginMm | Double | Seitlicher Rand des weißen Caption-Hintergrunds (mm). |
| PayPaddingMm | Double | Innenabstand rundum (mm, Default 2). |
| PayGapMm | Double | Abstand QR→Caption (mm); im aktuellen Layout ungenutzt (Kompatibilität). |
| PayCornerRadiusMm | Double | Eckenrundung des Rahmens (mm); 0 = eckig. |
| PayShowFrame | Boolean | Rahmenlinie zeichnen. |
| PayFrameColor | Color | Rahmenfarbe. |
| PayFramePenWidthMm | Double | Rahmenstärke (mm). |
| PayFillColor | Color | Füllfarbe (Weiß = QR-Kontrast/Ruhezone). |
Methoden
Function PayBuild(doc As BoDocDocument, x, y, widthMm As Double) As BoDocPayQrResult
Baut den Block und fügt Rahmen, QR und Caption in
doc ein. x/y = obere linke Ecke, widthMm = Gesamtbreite (Höhe automatisch). Wirft ArgumentException bei ungültiger IBAN/Betrag, Feldüberlänge, gleichzeitig Remittance UND Referenz, oder Payload > 331 Bytes.Function PayBuildPayload() As String
Baut/validiert nur den EPC-Payload (ohne Zeichnen). Selbe Prüfungen/Exceptions wie
PayBuild.BoDocPayQrResultNotInheritableErgebnis von PayBuild: Verweise auf die drei Primitive plus belegte Höhe.
Properties
| PayResultFrame | BoDocRect | Der Rahmen (weiße Füllung). |
| PayResultQr | BoDocQr | Das QR-Primitiv (trägt den EPC-Payload). |
| PayResultCaption | BoDocTextBox | Caption-TextBox (Nothing ohne Caption-Text). |
| PayResultTotalHeightMm | Double | Gesamthöhe des Blocks (mm). |
| PayResultBottomMmget | Double | Unterkante (mm) = Y + Höhe — direkt darunter weiterzeichnen. |
5 · Ausgabe — Viewer, Druck, PDF
BoDocViewerUserControlEingebetteter Dokument-Viewer: Blättern, Zoom, Druck/PDF/Speichern. Komplett in Code, keine Designer-Datei.
In ein Panel legen (
Dock = Fill) und mit ViewerSetDocument füttern. Jede Seite wird einmal als EMF-Vektor gerendert und nahtlos scrollbar untereinander geblittet (vektortreuer Zoom). Alle Beschriftungen sind überschreibbar (Default englisch), jedes Toolbar-Element einzeln ausblendbar.Grundgerüst (kopierfertig)
Vollständiges Muster für ein Formular mit eingebettetem
viewer1 (BoDocViewer, Dock = Fill): Befüllen, Drucken, Speichern und als PDF anzeigen. Die drei Toolbar-Buttons lösen Events aus — hier werden sie mit Aktionen verbunden.' Ein dauerhaft gehaltenes Dokument (immer wieder neu befüllbar) Private _doc As BoDocDocument Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' Toolbar-Buttons des Viewers mit Aktionen verbinden AddHandler viewer1.ViewerPrintRequested, AddressOf Viewer_Print AddHandler viewer1.ViewerSaveRequested, AddressOf Viewer_Save AddHandler viewer1.ViewerPdfRequested, AddressOf Viewer_Pdf ' optional: deutsche Beschriftung viewer1.ViewerCaptionPrint = "Drucken" viewer1.ViewerCaptionSave = "Speichern" viewer1.ViewerPageLabelFormat = "Seite {0} / {1}" Fill() ' Dokument befüllen und anzeigen End Sub ' 1) BEFÜLLEN: Dokument bauen und im Viewer anzeigen Private Sub Fill() _doc = New BoDocDocument(BoDocPaper.A4) _doc.DocumentTitle = "Rechnung 2026-0001" _doc.Add(New BoDocTextBox("Hallo Welt", 15, 20, 180, 0) With { .TextSizePt = 14.0F, .TextBold = True}) ' ... weitere Primitive (Rect, Line, Image, Qr, Ean13, PayQr ...) ... viewer1.ViewerSetDocument(_doc) ' gibt ein vorheriges Dokument automatisch frei End Sub ' 2) DRUCKEN (Dialog) Private Sub Viewer_Print(sender As Object, e As EventArgs) BoDocPrint.PrintDialogFor(_doc, Me) End Sub ' 3) SPEICHERN als PDF Private Sub Viewer_Save(sender As Object, e As EventArgs) Using dlg As New SaveFileDialog() With {.Filter = "PDF|*.pdf", .FileName = "Rechnung.pdf"} If dlg.ShowDialog(Me) = DialogResult.OK Then BoDocPdfWriter.PdfWriteToFile(_doc, dlg.FileName) End If End Using End Sub ' 4) ALS PDF ANZEIGEN (im Standard-PDF-Viewer öffnen) Private Sub Viewer_Pdf(sender As Object, e As EventArgs) Dim path As String = IO.Path.Combine(IO.Path.GetTempPath(), "vorschau.pdf") BoDocPdfWriter.PdfWriteToFile(_doc, path) Process.Start(New ProcessStartInfo(path) With {.UseShellExecute = True}) End Sub
Konstruktor
New()
Events
| ViewerPrintRequested | EventHandler | "Drucken" geklickt — hier BoDocPrint.PrintDialogFor anhängen. |
| ViewerPdfRequested | EventHandler | "PDF" geklickt — PDF erzeugen und im Standardviewer öffnen. |
| ViewerSaveRequested | EventHandler | "Speichern" geklickt — PDF per Speicherdialog ablegen. |
Methoden
Sub ViewerSetDocument(doc As BoDocDocument)
Dokument setzen, alle Seiten rendern, an den Anfang springen. Gibt bei
ViewerAutoDisposeDocument=True ein vorheriges Dokument automatisch frei.Sub ViewerRedraw()
Alle Seiten neu rendern (nach Inhaltsänderung).
Properties — Zustand
| ViewerAutoDisposeDocument | Boolean | Vorheriges Dokument beim Neusetzen/Dispose automatisch freigeben (Standard True). False, wenn der Aufrufer die Lebensdauer selbst verwaltet. |
| ViewerPageCountget | Integer | Seitenanzahl im aktuellen Dokument. |
| ViewerCurrentPage | Integer | Aktuell angezeigte Seite (1-basiert). Setzen springt zur Seite. |
| ViewerToolbarVisible | Boolean | Ganze Toolbar sichtbar (Standard True). |
Properties — Beschriftungen (Default englisch)
| ViewerCaptionFirst / Prev / Next / Last | String | Blätter-Buttons ("|<", "<", ">", ">|"). |
| ViewerCaptionZoomOut / ZoomIn | String | Zoom-Buttons ("−", "+"). |
| ViewerCaptionPrint / Pdf / Save | String | Aktions-Buttons ("Print", "PDF", "Save"). |
| ViewerCaptionFitPage / FitWidth | String | Zoom-Listeneinträge ("Fit page", "Fit width"). |
| ViewerPageLabelFormat | String | Seitenanzeige, {0}=aktuell {1}=gesamt (Default "Page {0} / {1}"). |
Properties — Tooltips
| ViewerTipFirst / Prev / Next / Last | String | Tooltips der Blätter-Buttons. |
| ViewerTipZoomOut / ZoomIn | String | Tooltips der Zoom-Buttons. |
| ViewerTipPrint / Pdf / Save | String | Tooltips der Aktions-Buttons. |
Properties — Sichtbarkeit einzelner Elemente (Standard True)
| ViewerShowFirst / Prev / Next / Last | Boolean | Blätter-Buttons. |
| ViewerShowPageLabel | Boolean | Seitenanzeige "Seite N / M". |
| ViewerShowZoomOut / ZoomCombo / ZoomIn | Boolean | Zoom-Elemente. |
| ViewerShowPrint / Pdf / Save | Boolean | Aktions-Buttons. |
BoDocPrintNotInheritableDruckt ein Dokument über PrintDocument und die zentrale RenderPage (massgetreu zur Vorschau).
Instanz hält ein wiederverwendbares
PrintDocument. Die Shared-Bequemlichkeit PrintDialogFor erledigt den häufigen Fall in einer Zeile. Offset-/Scale-Werte pro Drucker hält die Wirtsanwendung.Konstruktor
New()
Properties
| PrintForcePaperSize | Boolean | Papiergröße pro Seite aus dem Modell setzen (Standard True; nötig für Thermobons). False = Treiber-/Dialogwahl. |
| PrintPrinterName | String | Vorab gewählter Drucker (leer = Standard). Wirkt bei PrintDirect. |
| PrintCopies | Short | Kopienzahl für PrintDirect (Standard 1). |
| PrintCopiesByRepeat | Boolean | True = Job N-mal wiederholen statt PrinterSettings.Copies (EPSON-Bontreiber-Workaround). |
| PrintShowStatusDialog | Boolean | Windows-Druckstatusfenster anzeigen (Standard False = unterdrückt). |
| PrintOffsetXmm / PrintOffsetYmm | Double | Druck-Offset (mm); positiv = nach rechts/unten. Rand-Workaround. |
| PrintScale | Double | Druck-Skalierung (1.0 = keine; geklemmt 0,01…6,0). Nur der Druckpfad; Vorschau/PDF bleiben 1:1. |
| PrintDocumentRefget | PrintDocument | Zugriff auf das zugrunde liegende PrintDocument (Drucker/Kopien/Bereich programmatisch setzen). |
Methoden
Sub PrintSetDocument(doc As BoDocDocument)
Zu druckendes Dokument setzen (Jobname = DocumentTitle).
Function PrintWithDialog(owner As IWin32Window) As Boolean
Zeigt den Druckdialog (Drucker/Kopien/Bereich) und druckt bei OK. True, wenn gedruckt.
Function PrintDirect() As Boolean
Druckt sofort ohne Dialog (nutzt
PrintPrinterName/PrintCopies bzw. Wiederhol-Fallback).Function PrintShowPrinterDialog(owner As IWin32Window) As Boolean
Zeigt NUR den Druckerdialog und merkt die Wahl (wirkt auf nächstes
PrintDirect) — druckt nicht.Function PrintShowPageSetupDialog(owner As IWin32Window) As Boolean
Zeigt NUR den Seiteneinrichtungs-Dialog — druckt nicht. (Bei
PrintForcePaperSize=True überschreibt BoDOC Papier/Ränder pro Seite.)Shared Function PrintDialogFor(doc As BoDocDocument, owner As IWin32Window) As Boolean
One-Liner: Instanz erzeugen, Dokument setzen, Druckdialog zeigen. Ideal am
ViewerPrintRequested-Hook.BoDocPdfWriterSharedErzeugt aus einem Dokument eine PDF-Datei. Nur Shared-Methoden.
Methoden
Shared Function PdfCreateBytes(doc As BoDocDocument, Optional options As BoDocPdfOptions = Nothing) As Byte()
Erzeugt das PDF als Byte-Array.
Nothing-Options = Standardverhalten.Shared Sub PdfWriteToStream(doc As BoDocDocument, stream As Stream, Optional options = Nothing)
Schreibt das PDF in einen Stream.
Shared Sub PdfWriteToFile(doc As BoDocDocument, path As String, Optional options = Nothing)
Schreibt das PDF in eine Datei (überschreibt vorhandene).
BoDocPdfOptionsNotInheritableOptionen für die PDF-Erzeugung (alle mit sinnvollen Vorgaben).
Konstruktor
New()
Properties
| PdfCompressStreams | Boolean | Content-Streams mit FlateDecode komprimieren (Default True). |
| PdfAutoHeightForContinuous | Boolean | Endlos-Seiten: Höhe aus dem Inhalt statt DocumentPageHeightMm (Default False = 1:1 zum Druck). |
| PdfContinuousBottomPaddingMm | Double | Unterer Rand (mm) bei AutoHeight (Default 4). |
| PdfImageQuality | Integer | JPEG-Qualität 1–100 (Default 80). 0 = keine Neukomprimierung (JPEG 1:1, sonst RGB/Flate). Sinnvoll 70–85. |
| PdfImageMaxDpi | Integer | Obergrenze der effektiven Bildauflösung bezogen auf die Anzeigegröße (Default 200; Bildschirm 96–150). 0 = kein Downsampling. |
6 · Lizenzierung
BoDocLicenseSharedProzessweiter Lizenzstatus + DEMO-Wasserzeichenregel. Reine Shared-Klasse.
BoDOC bleibt konfigurationsfrei — die Wirtsanwendung persistiert den Schlüssel und ruft beim Start einmal
BoDocLicenseSetLicense. Standard = nicht lizenziert.Konstanten
| BoDocLicenseWatermarkTitle | String | Erste Zeile des Wasserzeichens ("DEMO * BoDOC"). |
| BoDocLicenseWatermarkUrl | String | Zweite Zeile ("www.bonit.at"). |
| BoDocLicenseFreePages | Integer | Freistufe: max. Seiten ohne Lizenz (1). |
| BoDocLicenseFreeElements | Integer | Freistufe: max. Elemente gesamt ohne Lizenz (25). |
Properties
| BoDocLicenseIsLicensedget | Boolean | True, wenn in dieser Sitzung ein gültiger Schlüssel gesetzt wurde. |
| BoDocLicenseNameget | String | Übergebener Lizenznehmer-Name (fließt in den PDF-Producer-Fingerprint). |
Methoden
Shared Function BoDocLicenseSetLicense(licenseKey As String, Optional licenseName As String = Nothing) As Boolean
Setzt/prüft den Schlüssel für die Sitzung (getrimmt, Großbuchstaben, SHA-256). True = gültig. Name wird unabhängig übernommen.
Kein Treffer für „“.