Я пишу простую программу, которая извлекает штрих-код из изображений.
Я пробовал zxing. Это сработало хорошо. Пока я не обнаружил кое-что странное.
Организация, в которой я работаю, публикует формы. Та же форма (которую я получил из 2-х мест в
org) с тем же штрих-кодом, я отсканировал их на той же машине (также тот же результат), чтобы
формат пдф.
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;
}
Спасибо за любую помощь, которую вы можете оказать в этой ситуации.