Business Central HTML (RichContent) & Belegausgabe in RDLC

Von | 13. Dezember 2023

Mit Business Central 23 gibt es nun einen integrierten HTML Editor (Use the built-in rich text editor to enter data | Microsoft Learn). Diese wurde integriert für die Marketing Texte am Artikel. Dieser Editor kann aber auch in eigenen Entwicklungen genutzt werden.

Mir stellten sich folgende Fragen:

  • Wie kann neue HTML Editor in Individualisierungen genutzt werden?
  • Wie kann der HTML Text gespeichert und gelesen werden?
  • Wie sieht der HTML Text aus? Welche Logik wird für Zeilenumbrüche genutzt?
  • Welche HTML Tags werden durch das RDLC nicht unterstützt und was passiert im Druck mit nicht unterstützten Tags?
  • Gibt es eine Möglichkeit im HTML eingefügte Bilder im RDLC auszugeben?

Zur Nutzung des neuen HTML Editor benötigt man lediglich eine Textvariable und den ExtendedDataType = “RichContent”.

So sieht der HTML Editor dann aus. Es ist zu berücksichtigen, dass ein HTML Feld mit dem ExtendedDatatype = RichContent, das einzige Feld in der Gruppe sein soll, damit die Seite korrekt gerendert werden.

Dieser HTML Text hat keine Zeichenbegrenzung, daher empfiehlt es sich eine nicht begrenzte Textvariable zu nutzen. Muss der Text in der Datenbank gespeichert werden, dann kann dies in einem Blob gespeichert werden. Dafür können zum Lesen/Schreiben InStream und OutStream verwendet werden.

Speichern in ein Blob Feld:

Lesen aus einem Blob:

Schauen wir uns den HTML Text an, dann kann man sehen, dass dort das HTML Tag <div> für eine einzelne Zeile genutzt wird:

Damit kann der Text in einzelne Teiltexte getrennt werden. Dafür kann beispielsweise folgende Funktion genutzt werden, die dann den HTML Text in eine Liste überträgt:

Per Aktion können wir die Funktion nutzen um die Anzahl der Zeilen auszugeben:

In unserem Beispiel haben wir 4 Zeilen:

Eine neue Zeile wird nur bei Enter gebildet.

Die Ausgabe eines HTML Text in RDLC kann per Platzhalter ausgegeben werden.

Es werden allerdings nur die folgenden Tags in RDLC unterstützt:

  • Hyperlinks: <A href>
  • Fonts: <FONT>
  • Header, style and block elements: <H{n}>, <DIV>, <SPAN>,<P>, <DIV>, <LI>, <HN>
  • Text format: <B>, <I>, <U>, <S>
  • List handling: <OL>, <UL>, <LI>

Das bedeutet, dass Farben oder auch Bilder in einem Ausdruck nicht dargestellt werden. Außerdem sollte berücksichtigt werden, dass die Übergabe eines langen HTML Textes an eine Textbox mit aktivierter HTML Interpretierung auch zusammengehalten wird. Überschreitet der Text den auf einer Seite zur Verfügung stehenden Seite, dann wird dieser einfach abgeschnitten. Daher kann die oben gezeigte Funktion mit der Liste genutzt werden um eine zeilenbasierte Ausgabe zu entwickeln. Dadurch wird das Rendering und die Ausgabe verbessert und der Platz besser genutzt.

Testweise habe ich dazu einen Beleg angelegt. Dieser druckt die HTML Texte pro HTML Kopf und druckt die HTML Texte zeilenweise aus:

Im Layout wird dann eine Tabelle mit der zeilenbasierten Texten ausgegeben und der Platzhalter besitzt den Markuptyp “HTML – HTML Tags als Formate interpretieren”:

Im HTML Editor werden einige Zeilen erfasst mit unterschiedlichen Formatierungen:

Im Druck sieht, dass Ganze so aus:

Die Ränder wurden auf Schwarz gesetzt, damit man sehen kann, dass die Texte aufgeteilt in einzelnen Textboxen gedruckt werden. Außerdem kann man sehen, dass das Bild nicht gedruckt wurde und einige HTML Tags nicht interpretiert werden (beispielsweise Hintergrundfarbe / Schriftfarbe). Demnach sind nicht unterstützte HTML Tags grundsätzlich kein Problem, da diese ignoriert werden.

Zusätzlich gibt es die Möglichkeit Bilder aus dem HTML Text zu extrahieren und den Base64 Code an den RDLC Beleg zu übergeben. Hier kann dann ein Bildelement im RDLC genutzt werden um das Bild auszugeben. Dabei ist zu berücksichtigen, dass Bilder nur in separaten Zeilen ausgegeben werden können und nicht nebeneinander. Auch ist die Größe der Bilder nicht so einfach anpassbar. Bilder in RDLC sind statisch und können damit nicht “flexibel” groß sein.

Bilder können über den HTML Tag <img src=*> erkannt werden.

Allerdings ist es möglich über die Codeunit Image die Höhe und die Breite eines Bilder zu ermitteln. Mit diesen Informationen können in einer RDLC Tabelle mehrere Zeilen mit unterschiedlichen Höhen angegeben werden (Pixelhöhe 50, 100, 200, 300, 400, 500, …). Das Bild wird dennoch etwas skaliert, da die Höhe des Bildes nicht generisch wachsen oder schrumpfen kann. Dennoch ist es so möglich, dass ein Output die Bilder nahezu in der ursprünglichen Größe ausgegeben werden ohne leeren Platz im Druck zu erzeugen.

Hier gibt es ein Beispiel um die Größe des ersten Bildes des HTML Textes zu ermitteln:

Um eine Ausgabe eines Bildes im Bericht zu implementieren, wird eine Funktion benötigt, die die Bilder in einem HTML Text erkennt, extrahiert und separat an das RDLC Layout übergibt.

So könnte das aussehen:

Dies erstellt eine Liste mit den Base64 Codes der Bilder zu einem HTML Text. Im Bericht kann dann ein weiteres Integer DataItem eingefügt werden, welches die Bilder für eine einzelne HTML Zeile ermittelt und diese dann zusammen mit der Bildhöhe an RDLC übergibt.

Es ist zu beachten, dass diese Logik ihre Grenzen hat, aber für einige Anwendungsfälle evtl. nutzbar. Im RDLC gibt es dafür einfach mehrere Zeilen in der Tabelle mit unterschiedlich großen Bildern und das Bild wird dann in der Zeile gerendert, die ungefähr die gleiche Größe hat. Alle anderen Zeilen werden ausgeblendet:

Im Programmcode selbst muss nur geprüft werden, welche Höhe das Bild hat und basierend darauf die richtige Zeile gedruckt werden. Ich sehe sonst keinen anderen Weg Bilder aus dem HTML Editor ansatzweise in der richtigen Größe in RDLC zu drucken.

Persönliche Meinung

Der HTML Editor an sich ist top. Dies ohne Addin im Webclient nutzen zu können ist wirklich gut. Die Integration in Belege ist aber noch nicht vollständig möglich. Es gibt dazu bereits unterschiedlichste Anfragen in den BC Ideas. Wenn mehr HTML Tags im RDLC unterstützt werden, könnte diese Funktionalität tatsächlich interessant werden. Ansonsten sollte auf die Integration der HTML Texte im RDLC verzichtet oder nur in abgegrenzten Fällen genutzt werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert