#java #jasper-reports #ireport #barcode #zxing
#java #jasper-отчеты #ireport #штрих-код #zxing
Вопрос:
Я хочу поместить штрих-код на свою страницу и могу просмотреть его. Генератор штрих-кодов — google.zxing, а мой инструмент отчетности — iReport.
Но я не знаю, как настроить Image Expression
и Expression Class
изображения в iReport.
Комментарии:
1. groups.google.com/group/zxing/browse_thread/thread/…
2. @AlexK: Я пробовал это раньше, но это непонятно
3. Вы должны хотя бы сообщить нам, какой штрих-код вы пытаетесь сгенерировать…
4. @MarcNuri: никакой разницы, но, по крайней мере, для 2D-штрих-кода
5. @MasoudM.: Я понимаю, что первоначальный вопрос был опубликован пару месяцев назад, так что вы, возможно, продвинулись дальше… но в опубликованном мной примере должны быть все ключевые идеи, которые вам нужны. Есть ли шанс, что вы все еще собираетесь генерировать QR-коды?
Ответ №1:
Две ключевые идеи заключаются в том, чтобы сначала написать немного кода 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
. Это имя также жестко задано в скриптлете. (Это одинаково плохо.) - Добавить в путь к классу iReport:
- Скомпилированный скриптлет .файл jar
- core.jar (из ZXing)
- javase.jar (из ZXing)
- Добавьте элемент изображения в отчет с выражением
$V{BarCodeImage}
.
Результатом является счастливый QR-код happy happy в вашем сгенерированном отчете JasperReport:
Я вспоминаю образец, который я видел, который делает вещи намного чище. На самом деле он включал в себя хороший плагин, так что вы могли бы легко установить эту функциональность в iReport с минимальными усилиями. Если я смогу отследить это, я обновлю этот пост. Но до тех пор это, по крайней мере, охватывает все критические точки.
Комментарии:
1. Дополнительно в главе 15 есть очень хорошее руководство по созданию скриптлета opus-college.net/devcorner/iReport-Ultimate-Guide-3.pdf
Ответ №2:
Выражение изображения должно возвращать любой подкласс java.awt.Image
. Самый простой способ добиться этого — использовать свой собственный вспомогательный класс для генерации изображения. Вы можете создать статический метод, который генерирует штрих-код из a String
и вызывать этот метод из iReport.
В случае ZXing я не знаю, какой метод использовать, но я могу сказать, что я использую в качестве ImageExpression, используя библиотеку Barbecue.
net.sourceforge.barbecue.BarcodeImageHandler.getImage(
MyBarcodeGenerator.getFromString($F{field})
MyBarcodeGenerator
класс содержит метод getFromString(...)
, который возвращает a net.sourceforge.barbecue.Barcode
в моем случае a net.sourceforge.barbecue.linear.code39.Code39Barcode
Игнорируется Expression Class
.
—Отредактировано:
Для кодирования изображения в zxing вы должны использовать MatrixToImageWriter
Следующий код будет кодировать QR-код в BufferedImage, который вы можете использовать в поле выражения изображения:
MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE, 400 /*Width*/, 400/*Height*/));