package com.itextpdf.samples.sandbox.pdfhtml.qrcodetag;
import com.itextpdf.barcodes.BarcodeQRCode;
import com.itextpdf.barcodes.qrcode.EncodeHintType;
import com.itextpdf.barcodes.qrcode.ErrorCorrectionLevel;
import com.itextpdf.html2pdf.attach.ITagWorker;
import com.itextpdf.html2pdf.attach.ProcessorContext;
import com.itextpdf.layout.IPropertyContainer;
import com.itextpdf.layout.element.Image;
import com.itextpdf.styledxmlparser.node.IElementNode;
import java.util.HashMap;
import java.util.Map;
/**
* Example of a custom tagworker implementation for pdfHTML.
* The tagworker processes a tag using iText Barcode functionality
*/
public class QRCodeTagWorker implements ITagWorker {
private static String[] allowedErrorCorrection = {"L", "M", "Q", "H"};
private static String[] allowedCharset = {"Cp437", "Shift_JIS", "ISO-8859-1", "ISO-8859-16"};
private BarcodeQRCode qrCode;
private Image qrCodeAsImage;
public QRCodeTagWorker(IElementNode element, ProcessorContext context) {
// Retrieve all necessary properties to create the barcode
Map hints = new HashMap<>();
// Character set
String charset = element.getAttribute("charset");
if (checkCharacterSet(charset)) {
hints.put(EncodeHintType.CHARACTER_SET, charset);
}
// Error-correction level
String errorCorrection = element.getAttribute("errorcorrection");
if (checkErrorCorrectionAllowed(errorCorrection)) {
ErrorCorrectionLevel errorCorrectionLevel = getErrorCorrectionLevel(errorCorrection);
hints.put(EncodeHintType.ERROR_CORRECTION, errorCorrectionLevel);
}
// Create the QR-code
qrCode = new BarcodeQRCode("placeholder", hints);
}
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
// Transform barcode into image
qrCodeAsImage = new Image(qrCode.createFormXObject(context.getPdfDocument()));
}
@Override
public boolean processContent(String content, ProcessorContext context) {
// Add content to the barcode
qrCode.setCode(content);
return true;
}
@Override
public boolean processTagChild(ITagWorker childTagWorker, ProcessorContext context) {
return false;
}
@Override
public IPropertyContainer getElementResult() {
return qrCodeAsImage;
}
private static boolean checkErrorCorrectionAllowed(String toCheck) {
for (int i = 0; i < allowedErrorCorrection.length; i++) {
if (toCheck.toUpperCase().equals(allowedErrorCorrection[i])) {
return true;
}
}
return false;
}
private static boolean checkCharacterSet(String toCheck) {
for (int i = 0; i < allowedCharset.length; i++) {
if (toCheck.equals(allowedCharset[i])) {
return true;
}
}
return false;
}
private static ErrorCorrectionLevel getErrorCorrectionLevel(String level) {
switch (level) {
case "L":
return ErrorCorrectionLevel.L;
case "M":
return ErrorCorrectionLevel.M;
case "Q":
return ErrorCorrectionLevel.Q;
case "H":
return ErrorCorrectionLevel.H;
}
return null;
}
}