генератор штрих-кодов google.zxing в iReport

#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();
        }
    }
}
  

Это полно жестко запрограммированного уродства, но все ключевые идеи показаны. Затем вам нужно определить отчет следующим образом:

  1. Пример запроса: select 'some text' as barcode_text я включил это только для того, чтобы подчеркнуть, что мой скриптлет жестко кодирует имя поля barcode_text . (Это плохо.)
  2. Переменная: BarCodeImage типа java.awt.image.BufferedImage с вычислением System . Это имя также жестко задано в скриптлете. (Это одинаково плохо.)
  3. Добавить в путь к классу iReport:
    • Скомпилированный скриптлет .файл jar
    • core.jar (из ZXing)
    • javase.jar (из ZXing)
  4. Добавьте элемент изображения в отчет с выражением $V{BarCodeImage} .

Результатом является счастливый QR-код happy happy в вашем сгенерированном отчете JasperReport:

Сгенерированный QR-код

Я вспоминаю образец, который я видел, который делает вещи намного чище. На самом деле он включал в себя хороший плагин, так что вы могли бы легко установить эту функциональность в 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*/));