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, kopieren 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-installation-directory>\lib\update
wrapper.java.classpath.2=<Intrexx-installation-directory>\lib\*.jar
wrapper.java.classpath.3=<Intrexx-installation-directory>\lib\remote\*.jar
wrapper.java.classpath.4=<Intrexx-installation-directory>\derby\lib\*.jar
wrapper.java.classpath.5=<Intrexx-installation-directory>\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 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

//URL to be converted
String recURL = g_record["5BD2494E2A4BD0AD0C427262CE4882C61F639EF3"].value /* datafield URL <string> */ 

//Size of the image in pixels 
int size = 125 

//Set error correction level 
Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>() 
hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L) 

//Initialize QR Code Writer 
QRCodeWriter qrCodeWriter = new QRCodeWriter() 

//Calculate QR code from URL 
BitMatrix byteMatrix = qrCodeWriter.encode(recURL,BarcodeFormat.QR_CODE, size, size, hintMap) 

//Adapt length unit of the image to QR code 
int CrunchifyWidth = byteMatrix.getWidth() 

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

//Color the entire image white
graphics.setColor(Color.WHITE)
graphics.fillRect(0, 0, CrunchifyWidth, CrunchifyWidth) 

//Change color to black
graphics.setColor(Color.BLACK)

//Read black points and set to image 
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)
        }
    }
}

// Convert image to image file
String fileType = "png"
String filePath = "internal/tmp/qrcode-${g_record.getRecId()}.png"
File qrFile = new File(filePath)
ImageIO.write(image, fileType, qrFile)

//Move image to data group
g_dgFile.move(guid: "F80E0F688327BCF0D35A91E5B4930E731861CCA4", id: g_record.getRecId(), file: qrFile, deleteAlways: true, triggerWorkflow: 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.