2014-09-24 59 views
0

我正在使用zxing掃描條碼並將其拆分爲pdf。 但是大多數條形碼都被掃描,而且很少沒有。雖然所有條形碼都可以正常顯示,我可以使用條形碼android應用程序掃描它們。 我的代碼是掃描一些條碼但很少不使用Zxing

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;` 

我認爲錯誤可能是位圖的轉換。 我得到錯誤的com.google.zxing.NotFoundException在result = reader.decode(bitmap, decodeHints);

條碼生成邏輯:

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,以斑馬線版本3不受支持。

請提出任何解決方案。

+0

請分享爲提取失敗的樣本PDF。然後我們可以告訴你你的情況出了什麼問題。但一般來說,條形碼不需要使用位圖嵌入。相反,你可能有一個條形碼字體。在這種情況下,條形碼就像普通書寫一樣編碼。我們可以將它們繪製爲矢量圖形。 – mkl 2014-09-24 21:11:49

+0

我已經在這個鏈接https://docs.google.com上分享了pdf的一部分。com/file/d/0B7ZJGCLzY6X6S3VQc183RHgxckk/edit?usp = docslist_api使用我的代碼第一個條形碼是可掃描的,但其他的則不是。 – dev 2014-09-25 04:11:04

回答

1

查看了OP提供的示例文件後,我發現zxing可以掃描的條形碼與無法掃描的條形碼之間沒有真正的區別。它們似乎都以300 dpi的分辨率掃描,並以相同的方式嵌入。

放大到圖像可以看出,雖然,掃描質量是條形碼識別的目的相當差:

enter image description here

掃描的條形碼輪廓沒有大幅削減,並有一定的鋸牙齒圖案。這使得條在不同的掃描線上看起來具有不同的寬度。

我假設你很幸運,你可以識別的代碼。

我建議改變掃描性能,也許b & W的不是灰度,也許不同的分辨率...

+0

感謝您的出色答覆。我正在創建它在300 dpi.I已粘貼創建邏輯的問題。你建議我應該如何創建它? – dev 2014-09-25 10:23:48

+0

請解釋您的文件的生命週期。他們是第一次創建包括條形碼,然後打印,然後掃描?或者他們是首先打印,然後掃描,然後應用條形碼? – mkl 2014-09-25 11:29:53

+0

首先我們從Ui(我們的應用程序)創建條形碼,並且有打印功能。我們從那裏打印條形碼,然後在不同的文檔上修復條形碼,然後掃描這些文檔。在條形碼的基礎上,我們有映射,我們做某些事情。 – dev 2014-09-25 12:33:48

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

你可以給這個代碼和測試。 http://www.barcode-generator.org/

+0

我首先創建條形碼並以CODE_128格式保存條形碼。然後,我已經將這些條形碼以pdf格式進行了修復,然後掃描了26位的pdf.out,我可以閱讀15. – dev 2014-09-24 06:56:32