Tipps & Tricks - QR-Codes erzeugen

QR-Codes sind kleine Bilder und repräsentieren meist eine URL. Durch das Abfotografieren des QR-Codes oder mit speziellen Apps kann zur URL navigiert werden. Die ZXing-Java-Bibliothek bietet die Möglichkeit, solche QR-Codes selbst zu erzeugen. Wie man diese Bibliothek einbindet und mit Groovy nutzt, um Eingaben in einen QR-Code umzuwandeln, zeigt dieser Beitrag. Die Beispielapplikation können Sie hier herunterladen. Anschließend können Sie sie wie gewohnt importieren. Aktivieren Sie die Experten-Optionen, damit alle Dialoge, die in diesem Beispiel genannt werden, erreichbar sind. Kenntnisse in Groovy-Skript sind bei diesem Beitrag von Vorteil.

Bibliothek einbinden

Zunächst muss die Bibliothek unter https://repo1.maven.org/maven2/com/google/zxing/core/3.1.0/core-3.1.0.jar heruntergeladen und Intrexx zur Verfügung gestellt werden. Da der Dateiname nicht sehr aussagekräftig ist, wird die Datei in "zxing-3.1.0.jar" umbenannt. Prinzipiell können Java-Bibliotheken entweder für ein einzelnes oder alle Portale zur Verfügung gestellt werden. Um die Bibliothek in allen Portalen nutzen zu können, kopiert Sie diese in das Installationsverzeichnis lib/extensions. Jetzt muss dem Portal noch mitgeteilt werden, wo es nach dieser Bibliothek suchen soll. Dazu wird die Datei "portal.wcf", die Sie im Portalverzeichnis internal/cfg finden, bearbeitet. Fügen Sie im folgenden Abschnitt die unterste Zeile hinzu:
# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
wrapper.java.classpath.1=<Intrexx-Installationsverzeichnis>\lib\update
wrapper.java.classpath.2=<Intrexx-Installationsverzeichnis>\lib\*.jar
wrapper.java.classpath.3=<Intrexx-Installationsverzeichnis>\lib\remote\*.jar
wrapper.java.classpath.4=<Intrexx-Installationsverzeichnis>\derby\lib\*.jar
wrapper.java.classpath.5=<Intrexx-Installationsverzeichnis>\lib\extensions\*.jar
Wichtig hierbei ist das Hochzählen des Wertes in wrapper.java.classpath.* als fortlaufende Nummer. Starten Sie dann den Portaldienst neu.

Applikation




Hier sehen Sie die Eingabeseite der Beispielapplikation, auf der die URL eingegeben und gespeichert werden kann. In der Datengruppe gibt es das Datei-Datenfeld "Bild".



Auf der Seite "Übersicht" finden Sie eine Ansichtstabelle, die die Daten aus der Datengruppe anzeigt. Wenn Sie die Spalte "Bild" bearbeiten, sehen Sie, dass hier die zweite Vorlage von links ausgewählt ist. Mit dieser Auswahl wird der erstellte QR-Code später in der Tabelle angezeigt.

Prozess




Im zugehörigen Prozess gibt es einen Datengruppen-Ereignisbehandler, der auf das Einfügen von Datensätzen in die Datengruppe der Beispielapplikation reagiert.



Mit dem Ereignisbehandler ist eine Groovy-Aktion mit dem folgenden Groovy-Skript verbunden:
import de.uplanet.lucy.server.businesslogic.util.FileUCHelper

import java.awt.Color
import java.awt.Graphics2D
import java.awt.image.BufferedImage
import java.io.File
import java.util.Hashtable

import javax.imageio.ImageIO
import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.common.BitMatrix 
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel

//Zu konvertierende URL
String recURL = g_record["5BD2494E2A4BD0AD0C427262CE4882C61F639EF3"].value /* datafield URL <string> */ 

//Größe des Bildes in Pixel 
int size = 125 

//Fehlerkorrekturlevel setzen 
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>() 
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L) 

//QR-Code Writer initialisieren 
QRCodeWriter qrCodeWriter = new QRCodeWriter() 

//QR-Code aus URL berechnen 
BitMatrix byteMatrix = qrCodeWriter.encode(recURL,BarcodeFormat.QR_CODE, size, size, hintMap) 

//Längeneinheit des Bildes an QR-Code anpassen 
int CrunchifyWidth = byteMatrix.getWidth() 

BufferedImage image = new BufferedImage(CrunchifyWidth, CrunchifyWidth,BufferedImage.TYPE_INT_RGB)
image.createGraphics()
Graphics2D graphics = (Graphics2D) image.getGraphics() 

//Komplettes Bild weiss einfärben
graphics.setColor(Color.WHITE)
graphics.fillRect(0, 0, CrunchifyWidth, CrunchifyWidth) 

//Farbe auf Schwarz wechseln
graphics.setColor(Color.BLACK)

//Schwarze Punkte auslesen und auf Bild setzen 
for (int i = 0; i < CrunchifyWidth; i++) 
{
    for (int j = 0; j < CrunchifyWidth; j++) 
	{
        if (byteMatrix.get(i, j)) {
            graphics.fillRect(i, j, 1, 1)
        }
    }
}

// Image in Bild-Datei umwandeln
String fileType = "png"
String filePath = "internal/tmp/qrcode-${g_record.getRecId()}.png"
File qrFile = new File(filePath)
ImageIO.write(image, fileType, qrFile)

//Bild in Datengruppe verschieben
FileUCHelper.moveFileToIntrexx(g_context, qrFile, "F80E0F688327BCF0D35A91E5B4930E731861CCA4", g_record.getRecId(), false)
Falls Sie das Skript in anderen Applikationen verwenden wollen, ersetzen Sie bitte die GUID "5BD2494E2A4BD0AD0C427262CE4882C61F639EF3" mit der GUID Ihres URL-Datenfeldes und die GUID "F80E0F688327BCF0D35A91E5B4930E731861CCA4" mit der GUID Ihres Bild-Datei-Datenfeldes.

Applikation im Browser




Wenn Sie die Applikation im Browser öffnen, eine URL auf der Eingabeseite eintragen und speichern, wird automatisch ein QR-Code erzeugt und auf der Seite "Übersicht" angezeigt. Das Bild kann von dort z.B. ganz einfach in die Zwischenablage kopiert werden.