我正在编写一个从图像中提取条形码的简单程序。
我试过zxing。它运作良好。直到我发现了一个奇怪的东西。
我工作的组织发布表格。相同的形式(我从 2 个地方得到的)
org)使用相同的条形码,我在同一台机器上扫描它们(同样的结果)
pdf格式。
zxing 在第一张图片上做得很好,并返回了条形码。没有运气
第二张图片.. 尝试提取条形码时出现 com.google.zxing.NotFoundException
从第二张图片。问题出现在更多形式的组织中)。
这是Zxing认不出来的形象。
http://s000.tinyupload.com/?file_id=12080994969485224486
这是他认得的。
http://s000.tinyupload.com/?file_id=30365671784453283753
这是我的代码:
private String handlePdf(File pdfFile) throws Exception {
StringBuilder sb = new StringBuilder();
PDDocument pdDoc = PDDocument.load(pdfFile);
int size = pdDoc.getDocumentCatalog().getAllPages().size();
for (int i = 0; i < size; i++) {
PDPage page = (PDPage) pdDoc.getDocumentCatalog().getAllPages().get(i);
PDResources resources = page.getResources();
Map images = resources.getImages();
if (images != null) {
Iterator<String> imageIter = images.keySet().iterator();
while (imageIter.hasNext()) {
String key = (String) imageIter.next();
PDXObjectImage image = (PDXObjectImage) images.get(key);
String barcode = null ;
barcode = extraceBarcodeFromImage(image.getRGBImage());
if(barcode!= null){
sb.append(barcode);
sb.append(",");
}
}
}
}
return sb.capacity() > 0 ? sb.toString().substring(0, sb.length()-1) :
"no barcode was found";
}
private String extraceBarcodeFromImage(BufferedImage image)
throws NotFoundException {
String finalResult;
if (image == null)
throw new IllegalArgumentException("Could not decode image.");
Map<DecodeHintType, Object> HINTS;
HINTS = new EnumMap(DecodeHintType.class);
HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
HINTS.put(DecodeHintType.POSSIBLE_FORMATS,
EnumSet.allOf(BarcodeFormat.class));
Map<DecodeHintType, Object> HINTS_PURE;
HINTS_PURE = new EnumMap<DecodeHintType, Object>(HINTS);
HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(
source));
MultiFormatReader barcodeReader = new MultiFormatReader();
Result result;
result = barcodeReader.decode(bitmap, HINTS_PURE);
finalResult = String.valueOf(result.getText());
return finalResult;
}
感谢您在这种情况下提供的任何帮助。