条形码人类可读放置平行于条形码

Posted

技术标签:

【中文标题】条形码人类可读放置平行于条形码【英文标题】:barcode human readable placing parallel to barcode 【发布时间】:2016-09-07 17:18:29 【问题描述】:

这是根据传递的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);

人类可读的值可以放在底部或顶部,也可以两者都不放置。是否可以在条形码旁边或旁边添加人类可读的值。

我们还可以减小人类可读值的大小吗?

【问题讨论】:

【参考方案1】:

Barcode4J 不支持开箱即用。一种解决方案(除了将此功能添加到 Barcode4J 之外)可能是创建一个双倍尺寸的新图像并将条形码和文本区域复制到其中。

找一个小的 PoC sn-p 来演示总体思路。

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(...) 绘制文本。

【讨论】:

【参考方案2】:

为什么不创建一个允许用户设置条形码参数的方法? 允许用户更改 barText、旋转、dpi 编号和字体大小或任何内容。程序应返回生成的条形码图像的字符串路径。图像可以存储在临时文件夹中,以避免在任何机器上设置修复文件夹。

这是我之前使用的代码...

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

轻松减小“人类可读值”的大小

这是生成的条形码图像的示例。

您甚至可以通过设置 rotation 轻松旋转条形码(例如 90)

您可以按照 SubOptimal 的建议在其旁边放置条形码文本。

【讨论】:

以上是关于条形码人类可读放置平行于条形码的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Code128 字体文本框更改为可读条形码? [关闭]

PHPphp 生成条形码

PHP生成条形码

熊猫数据框条形图在条形之间放置空间

LabVIEW条形码识别

在 Jupyter Notebook 上清理并制作可读的条形图