Я использую java 8 и zxing 3.3: чтобы протестировать свой процесс java, я составил большой документ pdf, объединив несколько документов pdf следующим образом:
doc1.pdf + separateur.pdf + doc2.pdf + separateur.pdf + doc3.pdf.
separateur.pdf
содержит только QR-код
Мой Java-процесс должен обнаружить этот QR-код, чтобы разделить большой документ.
Он отлично работает ...
Но в реальной жизни клиенты составляют свои PDF-файлы.при сканировании документов и в этом случае QR-код не обнаруживается .....
Здесь код (метод «декодирования» не распознает QR-код на отсканированной странице):
if (data instanceof ImageRenderInfo) {
logger.debug("data instanceof ImageRenderInfo");
ImageRenderInfo imageRenderInfo = (ImageRenderInfo) data;
logger.debug("ImageRenderInfo ok ");
byte[] bytes = imageRenderInfo.getImage().getImageBytes();
logger.debug("bytes ok");
String pngName = coreServices.getSplitFolderTemp() +"/Page-" + currentPage[0] + "_Image-" + index + ".png";
logger.debug("pngName: " + pngName);
File image = new File(pngName);
try {
// le QR code KLINCK est stocké dans la première image de la feuille de séparation.
//if (index == 1) {
// ZXING - > Read Data from QR Code
logger.info("index: " + index);
Files.write(new File(pngName).toPath(), bytes);
logger.info("write ok");
BufferedImage bufferedImg = ImageIO.read(image);
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImg);
logger.info("source ok");
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
logger.info("bitmap ok");
Result result = new MultiFormatReader().decode(bitmap);
logger.info("decode ok");
logger.debug("result.getBarcodeFormat().toString() : " + result.getBarcodeFormat().toString());
logger.debug("result.getText().toString(): " + result.getText().toString());
if (result.getText().toString().equals("SEPARATEURZEENDOC") ||
result.getBarcodeFormat().toString().equals("DATA_MATRIX")) {
// on stocke les numéros de pages des QR Code Klinck
pageList.add(currentPage[0]);
logger.debug("QR code Klinck trouvé en page: " + currentPage[0]);
}
//}
}
catch (Exception e) {
logger.error("l'image détectée n'est pas le QR Code Klinck : " + ExceptionUtils.getStackTrace(e));
}
if (image.delete())
logger.debug("image supprimée");
}
Я пытался изменить размер изображения ( com.google.zxing.NotFoundException Исключение возникает, когда выполняется основная Java-программа? )
путем обновления кода следующим образом:
BufferedImage bufferedImg = ImageIO.read(image);
logger.info(bufferedImg);
BufferedImage cropedImage = bufferedImg.getSubimage(0, 0, 228, 228);
logger.info("crop ok: " + cropedImage);
LuminanceSource source = new BufferedImageLuminanceSource(cropedImage);
logger.info("source ok");
но ничего не меняется.
Поэтому я попытался использовать DecodeHintType
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
logger.info("bitmap ok");
Map < DecodeHintType, Object > tmpHintsMap = new EnumMap < DecodeHintType, Object > ( DecodeHintType.class); tmpHintsMap.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
Result result = new MultiFormatReader().decode(bitmap, tmpHintsMap);
idem
Я получил объекты BufferedImage в журнале
тестовый документ (работы):
BufferedImage@71b26d51: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@a91ddb2 transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 228 height = 228 #numDataElements 3 dataOff[0] = 2
отсканированный документ (тотне работает):
BufferedImage@6052f653: type = 12 IndexColorModel: #pixelBits = 1 numComponents = 3 color space = java.awt.color.ICC_ColorSpace@a91ddb2 transparency = 1 transIndex = -1 has alpha = false isAlphaPre = false BytePackedRaster: width = 2542 height = 3518 #channels 1 xOff = 0 yOff = 0
Как я могу это решить?