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.
Die Importdatei enthält auch einen Prozess, der im Import eingeschlossen werden muss. Der Prozess ist nach dem Import deaktiviert. Wenn Sie diesen Tipps & Tricks-Beitrag testen möchten, aktivieren Sie den Prozess.
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. Kopieren Sie die Datei in das Portalverzeichnis "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 eine Vorlage für die Anzeige des QR-Codes in der Tabelle ausgewählt ist.
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.