Я хочу разместить штрих-код на своей странице и просмотреть его. Генератор штрих-кода — google.zxing, а мой инструмент отчетности — iReport.
Но я не знаю, как настроить Image Expression
и Expression Class
изображения в iReport.
Я хочу разместить штрих-код на своей странице и просмотреть его. Генератор штрих-кода — google.zxing, а мой инструмент отчетности — iReport.
Но я не знаю, как настроить Image Expression
и Expression Class
изображения в iReport.
Две ключевые идеи заключаются в том, чтобы сначала написать немного кода Java для создания соответствующего изображения, а затем спроектировать отчет с соответствующей ссылкой на этот код. Возможно, самый простой способ сгенерировать изображение — это скриптлет вроде этого:
package com.jaspersoft.alliances.mdahlman;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
public class QRCodeScriptlet extends JRDefaultScriptlet {
public void afterDetailEval() throws JRScriptletException {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix matrix = null;
try {
matrix = writer.encode(getFieldValue("barcode_text").toString(), BarcodeFormat.QR_CODE, 256, 256);
this.setVariableValue("BarCodeImage", MatrixToImageWriter.toBufferedImage(matrix) );
} catch (WriterException e) {
e.printStackTrace();
}
}
}
Это полно жестко закодированного уродства, но показаны все ключевые идеи. Затем вам нужно определить отчет следующим образом:
select 'some text' as barcode_text
Я включил это только для того, чтобы подчеркнуть тот факт, что мой сценарий жестко кодирует имя поля barcode_text
. (Это плохо.)BarCodeImage
типа java.awt.image.BufferedImage
с вычислением System
. Это имя также жестко запрограммировано в скриптлете. (Это одинаково плохо.)$V{BarCodeImage}
.Результатом является счастливый счастливый QR-код в вашем сгенерированном JasperReport:
Я вспоминаю образец, который я видел, который делает вещи намного чище. На самом деле он включал в себя хороший подключаемый модуль, так что вы могли легко установить эту функцию в iReport с минимальными усилиями. Если я смогу отследить это, я обновлю этот пост. Но до тех пор это, по крайней мере, охватывает все критические точки.
Выражение изображения должно возвращать любой подкласс java.awt.Image
. Самый простой способ добиться этого — использовать собственный вспомогательный класс для создания изображения. Вы можете создать статический метод, который генерирует штрих-код из String
и вызывать этот метод из IReport.
В случае ZXing я не знаю, какой метод использовать, но я могу сказать, что я использую в качестве ImageExpression, используя библиотеку Barbecue.
net.sourceforge.barbecue.BarcodeImageHandler.getImage(
MyBarcodeGenerator.getFromString($F{field})
MyBarcodeGenerator
содержит метод getFromString(...)
, который возвращает net.sourceforge.barbecue.Barcode
, в моем случае net.sourceforge.barbecue.linear.code39.Code39Barcode
Expression Class
игнорируется.
-- Отредактировано:
Чтобы закодировать изображение в zxing, вы должны использовать MatrixToImageWriter
Следующий код закодирует QRCode в BufferedImage, который вы можете использовать в поле Image Expression:
MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE, 400 /*Width*/, 400/*Height*/));
zxing
для создания QR-кода в Stack Overflow: qr-code -интеграция-в-jasperreport. Если соответствует вашим требованиям, вы можете использовать его. - person Kamal Singh   schedule 20.11.2017