BoDOC Programmierer-Referenz

Bonit Document print & pdf engine — geräteunabhängiges Dokumentmodell in Millimeter, Vorschau, Druck und PDF aus einer gemeinsamen Renderquelle. Reines .NET, kein NuGet, keine externen DLLs.

Namespace BoDoc BoDOC.dll net10.0-windows net48 WinForms / System.Drawing

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.dll hinzufügen.
  • Imports BoDoc in 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-windows und <UseWindowsForms>true</UseWindowsForms> setzen.
  • <Reference> auf BoDOC.dll (oder Projektverweis) — das net10.0-windows-Asset wird automatisch gewählt.
  • Imports BoDoc bzw. 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
Left0Linksbündig (Standard).
Center1Zentriert.
Right2Rechtsbündig.
BoDocVAlignEnumVertikale Textausrichtung in der Textbox (nur bei fester TextHeight).
Werte
Top0Oben (Standard).
Middle1Vertikal zentriert.
Bottom2Unten.
BoDocQrEcLevelEnumQR-Fehlerkorrekturstufe (Anteil wiederherstellbarer Daten).
Werte
L0~7 %.
M1~15 % (Standard, EPC-Norm für Zahlungs-QR).
Q2~25 %.
H3~30 %.
BoDocPaperEnumVordefinierte Papierformate. Bon-Formate sind Endlos (Höhe aus dem Inhalt).
Werte
A40210 × 297 mm.
A51148 × 210 mm.
Bon80280-mm-Thermorolle, endlos (bedruckbar 72 mm).
Bon58358-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)
Helvetica0~ Arial in der Vorschau.
Times1~ Times New Roman.
Courier2~ Courier New (monospace).
Symbol3Sonderzeichensatz.
ZapfDingbats4Sonderzeichensatz.
System-Fonts (5–19)
Arial5
Calibri6
Verdana7
Tahoma8
SegoeUI9→ "Segoe UI".
TrebuchetMS10→ "Trebuchet MS".
ComicSansMS11→ "Comic Sans MS".
Georgia12
Cambria13
BookAntiqua14→ "Book Antiqua".
Garamond15
PalatinoLinotype16→ "Palatino Linotype".
Consolas17monospace.
LucidaConsole18→ "Lucida Console".
Impact19
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.Add0 = 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
NameTypBeschreibung
TextContentStringAnzuzeigender Text (Zeilenumbrüche erlaubt).
TextFontNameStringFontname; leer ⇒ Dokument-Default bzw. "Arial".
TextSizePtSingleSchriftgröße in pt; 0 ⇒ Dokument-Default bzw. 10.
TextBoldBooleanFett.
TextItalicBooleanKursiv.
TextUnderlineBooleanUnterstrichen.
TextColorColorTextfarbe (Standard Schwarz).
TextHAlignBoDocHAlignHorizontale Ausrichtung.
TextVAlignBoDocVAlignVertikale Ausrichtung (nur bei fester Höhe).
TextXDoubleLinke Rahmenkante (mm).
TextYDoubleObere Rahmenkante (mm).
TextWidthDoubleBreite (mm); ≤ 0 = automatisch.
TextHeightDoubleHöhe (mm); ≤ 0 = automatisch aus dem Font.
TextWordWrapBooleanWortumbruch (Standard True).
TextEffectiveFontNamegetStringTatsächlich verwendeter Fontname (Rückfall "Arial").
TextEffectiveSizePtgetSingleTatsä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 / LineY1DoubleStartpunkt (mm).
LineX2 / LineY2DoubleEndpunkt (mm).
LinePenWidthDoubleStrichstärke (mm, Standard 0,2).
LineColorColorLinienfarbe (Standard Schwarz).
BoDocRectNotInheritable: BoDocPrimitiveRechteck (mm) mit optionalem Rand und optionaler Füllung.
Konstruktoren
New()
New(x, y, width, height As Double)
Properties
RectX / RectYDoubleObere linke Ecke (mm).
RectWidth / RectHeightDoubleMaße (mm).
RectHasBorderBooleanRand zeichnen (Standard True).
RectBorderColorColorRandfarbe (Standard Schwarz).
RectPenWidthDoubleRandstärke (mm, Standard 0,2).
RectFilledBooleanFläche füllen (Standard False).
RectFillColorColorFüllfarbe (Standard Weiß).
RectCornerRadiusMmDoubleEckenradius (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
ImageDataByte()Original-Dateibytes.
ImageFileNameStringLade-/Pfad oder logischer Name (z. B. "logo.jpg").
ImageX / ImageYDoublePlatzierung (mm).
ImageWidth / ImageHeightDoubleMaße (mm); ≤ 0 = automatisch.
ImageKeepAspectRatioBooleanBei beiden Maßen > 0 zentriert einpassen (Letterbox). Standard True.
ImageAutoHeightBooleanLegacy-Flag: Höhe aus Breite ableiten (Vorrang vor KeepAspectRatio).
ImagePixelWidthgetIntegerPixelbreite des Originals (lazy; 0 ohne gültiges Bild).
ImagePixelHeightgetIntegerPixelhö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
EanDataString12 oder 13 Ziffern.
EanX / EanYDoublePlatzierung (mm).
EanWidth / EanHeightDoubleMaße (mm).
EanShowTextBooleanKlarschrift-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
QrDataStringNutztext.
QrX / QrYDoublePlatzierung (mm).
QrWidth / QrHeightDoubleMaße (mm).
QrErrorCorrectionBoDocQrEcLevelFehlerkorrektur (Standard M).
QrQuietModulesIntegerRuhezone 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
Code128DataStringNutzdaten (druckbares ASCII 32–126).
Code128X / Code128YDoublePlatzierung (mm).
Code128Width / Code128HeightDoubleMaße (mm).
Code128ShowTextBooleanKlarschrift 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 / A4HeightMmDouble210 / 297.
A5WidthMm / A5HeightMmDouble148 / 210.
Bon80PaperWidthMm / Bon80PrintWidthMmDouble80 / 72.
Bon58PaperWidthMm / Bon58PrintWidthMmDouble58 / 48.
BonStartHeightMmDouble100 (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
PageWidthMmgetDoubleBreite (mm) — vom Dokument bzw. Standalone.
PageHeightMmgetDoubleHöhe (mm).
PageContinuousgetBooleanEndlosformat.
PagePrimitivesgetList(Of BoDocPrimitive)Geordnete Primitivliste (Reihenfolge = Z-Ordnung).
PageContentBottomMmDoubleUnterkante 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
BookmarkTitleStringAnzeigetext.
BookmarkPageIntegerZielseite (1-basiert).
BookmarkYmmDoubleZiel-Y (mm von oben); 0 = Seitenoberkante.
BookmarkLevelIntegerEinrü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
DocumentPageWidthMmDoubleBreite aller Seiten (Standard 210).
DocumentPageHeightMmDoubleHöhe aller Seiten (Standard 297); bei Endlos nur Startwert.
DocumentContinuousBooleanEndlosformat (Thermorolle) — Höhe folgt aus dem Inhalt.
DocumentTitleStringPDF: Title (auch Druckjob-Name).
DocumentAuthorStringPDF: Author.
DocumentSubjectStringPDF: Subject.
DocumentKeywordsStringPDF: Keywords (kommagetrennt).
DocumentCreatorStringPDF: Creator (Standard "BoDOC").
DocumentProducerStringPDF: Producer (Standard "BoDOC").
DocumentCreatedAtDatePDF: CreationDate.
DocumentModifiedAtDatePDF: ModDate.
DocumentDefaultFontNameStringDefault-Font für TextBoxen ohne eigenen Font (Standard "Arial").
DocumentDefaultFontSizePtSingleDefault-Größe (Standard 10 pt).
DocumentCurrentPageNoIntegerAktuelle Seite (1-basiert; 0 = keine). Setzen legt fehlende Seiten an.
DocumentPagesgetList(Of BoDocPage)Geordnete Seitenliste.
DocumentBookmarksgetList(Of BoDocBookmark)Flache Lesezeichenliste.
DocumentIsDisposedgetBooleanTrue 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
PayNameStringEmpfängername (Pflicht, max. 70).
PayIbanStringEmpfänger-IBAN (Pflicht, mod-97-geprüft).
PayBicStringBIC (optional, 8 oder 11 Zeichen).
PayAmountDecimalBetrag EUR; 0 = keiner, sonst 0,01…999999999,99.
PayRemittanceStringUnstrukturierter Verwendungszweck (max. 140). Alternativ zu Referenz.
PayStructuredReferenceStringStrukturierte Referenz (max. 35). Alternativ zu Remittance.
PayPurposeCodeStringPurpose Code (optional, max. 4, z. B. "GDDS").
PayErrorCorrectionBoDocQrEcLevelQR-Fehlerkorrektur (EPC-Standard M).
PayPageIntegerZielseite (1-basiert); 0 = aktuelle.
Properties — Layout
PayCaptionTextStringCaption unter dem QR (Default "Zahlen mit Code"; leer = keine).
PayCaptionFontNameStringCaption-Font (Default "Arial").
PayCaptionSizePtSingleCaption-Größe (Default 9).
PayCaptionBoldBooleanCaption fett (Default True).
PayCaptionColorColorCaption-Farbe.
PayCaptionHeightMmDoubleCaption-Höhe (mm); 0 = automatisch.
PayCaptionBgMarginMmDoubleSeitlicher Rand des weißen Caption-Hintergrunds (mm).
PayPaddingMmDoubleInnenabstand rundum (mm, Default 2).
PayGapMmDoubleAbstand QR→Caption (mm); im aktuellen Layout ungenutzt (Kompatibilität).
PayCornerRadiusMmDoubleEckenrundung des Rahmens (mm); 0 = eckig.
PayShowFrameBooleanRahmenlinie zeichnen.
PayFrameColorColorRahmenfarbe.
PayFramePenWidthMmDoubleRahmenstärke (mm).
PayFillColorColorFü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
PayResultFrameBoDocRectDer Rahmen (weiße Füllung).
PayResultQrBoDocQrDas QR-Primitiv (trägt den EPC-Payload).
PayResultCaptionBoDocTextBoxCaption-TextBox (Nothing ohne Caption-Text).
PayResultTotalHeightMmDoubleGesamthöhe des Blocks (mm).
PayResultBottomMmgetDoubleUnterkante (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
ViewerPrintRequestedEventHandler"Drucken" geklickt — hier BoDocPrint.PrintDialogFor anhängen.
ViewerPdfRequestedEventHandler"PDF" geklickt — PDF erzeugen und im Standardviewer öffnen.
ViewerSaveRequestedEventHandler"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
ViewerAutoDisposeDocumentBooleanVorheriges Dokument beim Neusetzen/Dispose automatisch freigeben (Standard True). False, wenn der Aufrufer die Lebensdauer selbst verwaltet.
ViewerPageCountgetIntegerSeitenanzahl im aktuellen Dokument.
ViewerCurrentPageIntegerAktuell angezeigte Seite (1-basiert). Setzen springt zur Seite.
ViewerToolbarVisibleBooleanGanze Toolbar sichtbar (Standard True).
Properties — Beschriftungen (Default englisch)
ViewerCaptionFirst / Prev / Next / LastStringBlätter-Buttons ("|<", "<", ">", ">|").
ViewerCaptionZoomOut / ZoomInStringZoom-Buttons ("−", "+").
ViewerCaptionPrint / Pdf / SaveStringAktions-Buttons ("Print", "PDF", "Save").
ViewerCaptionFitPage / FitWidthStringZoom-Listeneinträge ("Fit page", "Fit width").
ViewerPageLabelFormatStringSeitenanzeige, {0}=aktuell {1}=gesamt (Default "Page {0} / {1}").
Properties — Tooltips
ViewerTipFirst / Prev / Next / LastStringTooltips der Blätter-Buttons.
ViewerTipZoomOut / ZoomInStringTooltips der Zoom-Buttons.
ViewerTipPrint / Pdf / SaveStringTooltips der Aktions-Buttons.
Properties — Sichtbarkeit einzelner Elemente (Standard True)
ViewerShowFirst / Prev / Next / LastBooleanBlätter-Buttons.
ViewerShowPageLabelBooleanSeitenanzeige "Seite N / M".
ViewerShowZoomOut / ZoomCombo / ZoomInBooleanZoom-Elemente.
ViewerShowPrint / Pdf / SaveBooleanAktions-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
PrintForcePaperSizeBooleanPapiergröße pro Seite aus dem Modell setzen (Standard True; nötig für Thermobons). False = Treiber-/Dialogwahl.
PrintPrinterNameStringVorab gewählter Drucker (leer = Standard). Wirkt bei PrintDirect.
PrintCopiesShortKopienzahl für PrintDirect (Standard 1).
PrintCopiesByRepeatBooleanTrue = Job N-mal wiederholen statt PrinterSettings.Copies (EPSON-Bontreiber-Workaround).
PrintShowStatusDialogBooleanWindows-Druckstatusfenster anzeigen (Standard False = unterdrückt).
PrintOffsetXmm / PrintOffsetYmmDoubleDruck-Offset (mm); positiv = nach rechts/unten. Rand-Workaround.
PrintScaleDoubleDruck-Skalierung (1.0 = keine; geklemmt 0,01…6,0). Nur der Druckpfad; Vorschau/PDF bleiben 1:1.
PrintDocumentRefgetPrintDocumentZugriff 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
PdfCompressStreamsBooleanContent-Streams mit FlateDecode komprimieren (Default True).
PdfAutoHeightForContinuousBooleanEndlos-Seiten: Höhe aus dem Inhalt statt DocumentPageHeightMm (Default False = 1:1 zum Druck).
PdfContinuousBottomPaddingMmDoubleUnterer Rand (mm) bei AutoHeight (Default 4).
PdfImageQualityIntegerJPEG-Qualität 1–100 (Default 80). 0 = keine Neukomprimierung (JPEG 1:1, sonst RGB/Flate). Sinnvoll 70–85.
PdfImageMaxDpiIntegerObergrenze 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
BoDocLicenseWatermarkTitleStringErste Zeile des Wasserzeichens ("DEMO * BoDOC").
BoDocLicenseWatermarkUrlStringZweite Zeile ("www.bonit.at").
BoDocLicenseFreePagesIntegerFreistufe: max. Seiten ohne Lizenz (1).
BoDocLicenseFreeElementsIntegerFreistufe: max. Elemente gesamt ohne Lizenz (25).
Properties
BoDocLicenseIsLicensedgetBooleanTrue, wenn in dieser Sitzung ein gültiger Schlüssel gesetzt wurde.
BoDocLicenseNamegetStringÜ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 „“.