扫描PDF并转换为缓冲图像以解码QR时的Zxing格式异常

时间:2015-04-13 18:43:29

标签: java pdf zxing qr-code

我在PDF转换后遇到连续成功的QR解码问题。我一直在,

  

"线程中的异常" main" com.google.zxing.FormatException"

我的转化尝试是在: PDFBox的

public static BufferedImage convertPDFtoBufferedImageType2(String PDFPath) throws IOException{

    PDDocument document = null;
    try {

        document = PDDocument.load(PDFPath);
        PDPage firstPage = (PDPage) document.getDocumentCatalog().getAllPages().get(0);
        return firstPage.convertToImage();

    } catch (IOException ex) {
        Logger.getLogger(PDF_Utility.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    } finally {
        if(document != null)
            document.close();
    }
}

第二次尝试使用ghost4j

public static BufferedImage convertPDFtoBufferedImage(String PDFPath) throws IOException, RendererException, DocumentException{

    System.setProperty("jna.library.path", "C:\\Program Files\\gs\\gs9.16\\bin\\");

    PDFDocument document = new PDFDocument();
    document.load(new File(PDFPath));
    SimpleRenderer renderer = new SimpleRenderer();
    renderer.setResolution(300);
    List<Image> imgs = renderer.render(document);
    Image im = imgs.get(0);

    BufferedImage bi = new BufferedImage
        (im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
    Graphics bg = bi.getGraphics();
    bg.drawImage(im, 0, 0, null);
    bg.dispose();
    return bi;
}

我的QR解码器是:

public static String readQRCode(BufferedImage image, String charset, Map hintMap) 
                throws FileNotFoundException, IOException, NotFoundException, ChecksumException, FormatException {
        Result qrCodeResult = null;
        BinaryBitmap binaryBitmap = new BinaryBitmap(
                        new HybridBinarizer(new BufferedImageLuminanceSource(image)));
        try{
            qrCodeResult = new com.google.zxing.qrcode.QRCodeReader().decode(binaryBitmap,hintMap);
        }catch(NotFoundException | FormatException e){ //attempt without hints
            qrCodeResult = new com.google.zxing.qrcode.QRCodeReader().decode(binaryBitmap);
        }
        return qrCodeResult.getText();
}

我之所以称之为解码两次,是因为有时候&#34;更加努力&#34;

hintMap.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

实际上没有抓住QR码,但默认情况确实如此。 无论如何,这些代码片段确实可以从一堆文档中捕获我的大部分QR扫描,但有时它根本无法捕获它。我甚至试图将其作为图像写出来,然后重新阅读:

ImageIO.write((RenderedImage) im, "png", new File("/path/to/my/img.png"));

有趣的是,http://zxing.org/w/decode.jspx确实解码了输出图像,但我的代码却无法解码。 我也试过不同的字符集: CHAR_SET =&#34; UTF-8&#34 ;;和CHAR_SET =&#34; ISO-8859-1&#34 ;;

通过获取格式例外,找到了代码,但&#34;不符合条形码的格式规则。这可能是由于误检测造成的。&#34;

为凌乱的代码道歉,但这些尝试已经获得了大部分成功的扫描。 9/10率?有趣的是,有时相同文档的另一个扫描副本有效。任何帮助/建议/疯狂伏都教组合表示赞赏!谢谢!

编辑:我得到了一个样本(在打开周围的内容之后。真实的图像有内容!Zxing网站也能够捕获这个QR码(有和没有内容!)(我的程序已经忽略了其他1D)格式和内容的那些)。 QR Code

1 个答案:

答案 0 :(得分:0)

@Tilman Hausherr指出PDFBox的默认渲染大小很低,所以我按照他的建议将默认值更改为300dpi。总的来说,它适用于我的情况,但肯定会降低速度。将需要调整我的算法来运行快速和慢速运行作为备份。

return firstPage.convertToImage(BufferedImage.TYPE_4BYTE_ABGR, 300);
编辑:提高捕获条形码的成功率,但没有成功捕获所有条形码。增加dpi无济于事。