扫描的条形码很少,但很少有人不使用Zxing

时间:2014-09-24 06:31:24

标签: java barcode zxing bufferedimage pdfbox

我正在使用zxing扫描条形码并将其拆分为pdf格式。 但大多数条形码都是扫描的,很少有条形码扫描。虽然所有条形码都是正确可见的,我可以使用条形码Android应用程序扫描它们。 我的代码是

    Boolean flag = Boolean.FALSE;
    PDDocument pdfDoc = null;
    Result prevResult = null;
    try{
        pdfDoc = PDDocument.load(new File(pathToReadPdf));
        log.debug("Total pdf pages : "+pdfDoc.getNumberOfPages());

        Reader reader = new MultiFormatReader();
        List<PDPage> pages = pdfDoc.getDocumentCatalog().getAllPages();
        for(PDPage page : pages) {
            PDResources resources = page.getResources();
            // Identify images from pdf
            Map images = resources.getImages();
            if( images != null ){
                Iterator imageIter = images.keySet().iterator();
                while( imageIter.hasNext()){
                    String key = (String)imageIter.next();
                    PDXObjectImage image = (PDXObjectImage)images.get( key );
                    if (image.getRGBImage()!=null){
                    Hashtable<DecodeHintType, Object> decodeHints = new Hashtable<DecodeHintType, Object>(3);
                    Vector<BarcodeFormat> barcodeFormats = new Vector<BarcodeFormat>();
                    barcodeFormats.add(BarcodeFormat.CODE_128);
                    decodeHints.put(DecodeHintType.POSSIBLE_FORMATS, barcodeFormats);
                    decodeHints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
                    decodeHints.put(DecodeHintType.PURE_BARCODE, true);
                    //decodeHints.put(DecodeHintType.CHARACTER_SET, "ISO-8859-1");
                    LuminanceSource source = new BufferedImageLuminanceSource(image.getRGBImage(), 0, 0, image.getWidth(), image.getHeight());
                    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                    Result result = null;

                    try{
                        result = reader.decode(bitmap, decodeHints);
                        splitPdf(page, result, loanApplicationId);
                        prevResult= result;
                        flag = Boolean.TRUE;
                    }catch(NotFoundException nfe){
                        if(prevResult!=null){
                            mergePDF(page, prevResult, loanApplicationId);
                        }
                        continue;
                    }
                    log.debug("Barcode text is " + result.getText());
                    }
                }
            }
        }
    }catch(Exception e){
        e.printStackTrace();
        log.error("Error while splitting PDF : " + e.getMessage(), e);
    }
    finally {
        try{
            if(pdfDoc != null){
                pdfDoc.close();
            }
        }catch (IOException ioe){
            ioe.printStackTrace();
            log.error("Error while closing PDF : " + ioe.getMessage(), ioe);
        }
    }
    return flag;` 

我认为错误可能在位图转换中。 我在result = reader.decode(bitmap, decodeHints);

的com.google.zxing.NotFoundException收到错误

条形码创建逻辑:

 public byte[] createBarCode128(String fileName) {

    byte[] imageInByte = new byte[1024];
    try {
        Code128Bean bean = new Code128Bean();
        final int dpi = 300;

        //Configure the barcode generator
        bean.setModuleWidth(UnitConv.in2mm(6.0f / dpi));
        bean.doQuietZone(false);

        BitmapCanvasProvider canvas = new BitmapCanvasProvider(null, "image/x-png", dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);

        //Generate the barcode
        bean.generateBarcode(canvas, fileName);

        //Signal end of generation
        canvas.finish();

        BufferedImage originalImage = canvas.getBufferedImage();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(originalImage, "jpg", baos);
        baos.flush();
        imageInByte = baos.toByteArray();
        log.debug(imageInByte.toString());
        baos.close();
        log.debug(" Bar Code is generated successfully ");
    }
    catch (IOException ex) {
        ex.printStackTrace();
        log.error(ex.getMessage(),ex);
    }
    return imageInByte;
}

我正在使用以下依赖项:

 <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>fontbox</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>2.2</version>
    </dependency>

我的java版本是6,因此不支持zxing版本3.

请建议任何解决方案。

2 个答案:

答案 0 :(得分:1)

看过OP提供的示例文件后,我发现zxing可以扫描的条形码与无法扫描的条形码之间没有真正的区别。它们似乎都以300 dpi扫描并以相同的方式嵌入。

放大图像可以看出,为了条形码识别的目的,扫描质量非常差:

enter image description here

扫描的条形码轮廓没有明显切割并且有一些锯齿形状。这使得条形在不同的扫描线上看起来具有不同的宽度。

我认为你很幸运能够识别出你能识别的代码。

我建议改变扫描属性,可能是b&amp; w而不是灰度,可能是不同的分辨率......

答案 1 :(得分:0)

正如你所说,有些条形码正在扫描,有些则没有。请检查该格式是否支持Zxing列表格式。

  1. QR_CODE
  2. DATA_MATRIX
  3. UPC_E
  4. UPC_A
  5. EAN_8
  6. EAN_13
  7. UPC_EAN_EXTENSION
  8. CODE_128
  9. CODE_39
  10. 您可以在此处提供代码和测试。 http://www.barcode-generator.org/