Штрих-код удобочитаемое размещение параллельно штрих-код

Вот код для генерации штрих-кода на основе переданного идентификатора, штрих-код генерируется нормально:

 @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);

Удобочитаемое значение может быть размещено либо внизу, либо вверху, либо ни того, ни другого. Можно ли добавить удобочитаемое значение параллельно штрих-коду или рядом с ним.

Также мы могли бы уменьшить размер человеческого читаемого значения?

2 ответа

Это не поддерживается из коробки 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(...),

Почему бы вам не создать метод, позволяющий пользователю устанавливать параметры штрих-кода? Позволяет пользователю изменять barText, вращение, число точек на дюйм, & 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

Это образец сгенерированного изображения штрих-кода.

Вы даже можете легко повернуть штрих-код, установив поворот (например, 90)

Вы можете следовать предложению SubOptimal о размещении текста штрих-кода рядом с ним.

Другие вопросы по тегам