使用 iReport/JasperReports 導出含二維碼報表時,二維碼左上角出現「Trial」字樣,導致正式報表無法使用。根因:**專案依賴的 `barcode4j` 或 `zxing` 封裝為評試版 (Trial/Evaluation) JAR**,其授權機制在產生條碼圖片時自動疊加浮水印。
| 方案 | 成本 | 可行性 | 說明 |
| 購買商業授權 | 高 | ✅ 合法合規 | 聯繫廠商購買 barcode4j/JasperReports 商業授權 |
| 替換為開源庫 | 零 | ✅ 推薦 | 使用 ZXing (Google) 或 QRGen 產生二維碼圖片,再傳給報表 |
| 自行編譯開源原始碼 | 低 | ⚠️ 需技術 | 從 barcode4j 官方源碼 (Apache 2.0) 編譯無水印版本 |
| 破解/移除水印代碼 | 零 | ❌ 違法、違反授權、有法律風險 | 不建議,企業專案嚴禁 |
推薦實作:ZXing 產生 BufferedImage → JRRenderable
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import net.sf.jasperreports.engine.JRRenderable;
import java.awt.image.BufferedImage;
public class QRCodeRenderable implements JRRenderable {
private final BufferedImage image;
public QRCodeRenderable(String content, int width, int height) throws Exception {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix matrix = writer.encode(content, com.google.zxing.BarcodeFormat.QR_CODE, width, height);
this.image = MatrixToImageWriter.toBufferedImage(matrix);
}
@Override
public void render(Graphics2D gr, Rectangle2D rect) {
gr.drawImage(image, (int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), (int)rect.getHeight(), null);
}
@Override
public double getWidth() { return image.getWidth(); }
@Override
public double getHeight() { return image.getHeight(); }
}
// 使用方式:報表欄位表達式
// new com.example.QRCodeRenderable($F{qrContent}, 100, 100)
Maven 依賴 (無水印、商業友善)
com.google.zxing
core
3.5.1
com.google.zxing
javase
3.5.1
net.sf.jasperreports
jasperreports
6.20.0
總結
iReport 二維碼出現 Trial 浮水印,**必因使用評試版 barcode.jar**。企業專案請**直接替換為 Apache 2.0 授權的 ZXing 庫**實作 `JRRenderable`,零成本、無水印、合法合規、效能優異。切勿嘗試破解評試版,法律風險遠超授權成本。
- 上一篇文章: Android SQLite 不支援 TOP 關鍵字:改用 LIMIT 子句實現分頁查詢
- 下一篇文章: JavaScript 陣列排序完全指南:sort() 比較函數、數值/日期/字串多型別處理與效能優化
Copyright ©
程式碼之家 All Rights Reserved