[英]barcode human readable placing parallel to barcode
這是根據傳遞的Id生成條形碼的代碼,條形碼生成正常:
@Override
public byte[] generateBarcodeForId(String Id) throws VisitMastException{
BarcodeUtil util = BarcodeUtil.getInstance();
BarcodeGenerator gen;
ByteArrayOutputStream bao = null;
try {
bao = new ByteArrayOutputStream();
//Create the barcode bean
Code128Bean bean = new Code128Bean();
int dpi = 150;
//Configure the barcode generator
bean.setModuleWidth(UnitConv.in2mm(1.1f / dpi)); //makes the narrow bar, width exactly one pixel
bean.doQuietZone(true);
bean.setBarHeight(4);
//bean.setVerticalQuietZone(3);
bean.setQuietZone(0);
bean.setMsgPosition(HumanReadablePlacement.HRP_TOP);
BitmapCanvasProvider canvas = new BitmapCanvasProvider(
bao, "image/jpeg", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
bean.generateBarcode(canvas, Id);
canvas.finish();
} catch (IOException e) {
throw new VisitMastException(VisitMastException.BAD_REQUEST,
messageSource.getMessage(CodeEnum.BARCODE_GENERATING_ERROR.getValue(), null, Locale.ENGLISH));
}
return bao.toByteArray();
}
此代碼將人類可讀值置於條形碼上方:
bean.setMsgPosition(HumanReadablePlacement.HRP_TOP);
人類可讀的值可以放在底部或頂部,也可以兩者都不放置。 是否可以添加與條形碼平行或旁邊的人類可讀值。
我們還可以減小人類可讀值的大小嗎?
Barcode4J不支持此功能。 一種解決方案(除了將此功能添加到Barcode4J)可以創建具有雙倍大小的新圖像並將條形碼和文本區域復制到其中。
找一個小的PoC片段來展示一般的想法。
BitmapCanvasProvider canvas = new BitmapCanvasProvider(dpi,
BufferedImage.TYPE_BYTE_BINARY, false, 0);
bean.generateBarcode(canvas, Id);
canvas.finish();
BufferedImage image = canvas.getBufferedImage();
BufferedImage temp = new BufferedImage(image.getWidth() * 2,
image.getHeight() / 2 - 1, image.getType());
Graphics2D g = temp.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_OFF);
g.drawImage(image, 0, -image.getHeight() / 2, null);
g.drawImage(image, image.getWidth(), 0, null);
g.dispose();
bao.reset();
ImageIO.write(temp, "png", bao);
生成的字節存儲為文件
byte[] byteArray = generateBarcodeForId("1111");
BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray));
ImageIO.write(image, "jpg", new File("code128.jpg"));
結果圖像code128.jpg
。
另一種HumanReadablePlacement.HRP_NONE
是使用canvas.deviceText(...)
生成條形碼, HumanReadablePlacement.HRP_NONE
使用canvas.deviceText(...)
繪制文本。
為什么不創建一個允許用戶設置條形碼參數的方法? 允許用戶更改barText,rotation,dpi number,&fontSize或任何內容。 程序應返回生成的條形碼圖像的字符串路徑。 圖像可以存儲在臨時文件夾中,以避免在任何機器中設置修復文件夾。
這是我之前用過的代碼......
public class CustomBarcode {
public String getBufferedBarcodeImage(String barText, Integer rotation,
Integer dpi2, double fontSize) throws IOException {
ByteArrayOutputStream os = null;
ByteArrayInputStream fis = null;
OutputStream out = null;
// Configure the barcode generator
Code128Bean barcode128Bean = new Code128Bean();
barcode128Bean.setCodeset(Code128Constants.CODESET_A);
final int dpi = dpi2;
barcode128Bean.setBarHeight(15.0);
barcode128Bean.setFontSize(fontSize);
barcode128Bean.setQuietZone(5.0);
barcode128Bean.doQuietZone(true);
barcode128Bean.setModuleWidth(UnitConv.in2mm(1.6f / dpi)); // makes the
// narrow
// bar
String mime = MimeTypes.MIME_PNG;
File temp = null;
String tempFile = "";
try {
os = new ByteArrayOutputStream();
BitmapCanvasProvider canvasProvider = new BitmapCanvasProvider(os,
"image/x-png", dpi, BufferedImage.TYPE_BYTE_BINARY, false,
rotation);
barcode128Bean.generateBarcode(canvasProvider, barText);
canvasProvider.finish();
final BitmapEncoder encoder = BitmapEncoderRegistry
.getInstance(mime);
encoder.encode(canvasProvider.getBufferedImage(), os, mime, dpi); // get
// created
// barcode
fis = new ByteArrayInputStream(os.toByteArray());
temp = File.createTempFile("barcode", ".png");
IOUtils.copy(fis, new FileOutputStream(temp));
tempFile = temp.getAbsolutePath();
System.out.println("tempFile :" + tempFile);
temp.deleteOnExit();
// byte[] imageData = os.toByteArray();
}
catch (IOException ex) {
System.out.println("An Exception");
ex.printStackTrace();
}
finally {
os.flush();
os.close();
fis.close();
}
return tempFile;
}
}
我正在使用barcode4j-2.1.jar,poi-3.9.jar
這樣,您可以通過設置fontSize輕松減小“人類可讀值”的大小
您可以按照SubOptimal關於在其旁邊放置條形碼文本的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.