【问题标题】:Retrieve Text from PDF Barcode Images using iText使用 iText 从 PDF 条形码图像中检索文本
【发布时间】:2016-06-30 14:38:47
【问题描述】:

我通过分别插入 2 种条形码 QRCode 和 Code128 创建了一个 PDF。

现在我的问题是如何首先提取条形码图像,然后从这些图像中提取文本, 请在这方面帮助我,我尝试了 2 天并谷歌搜索,但没有找到合适的方法。

我正在使用 itextpdf-5.5.8 版本。

【问题讨论】:

    标签: java image pdf itext barcode


    【解决方案1】:

    我也在做一个类似的项目,但它是在 .NET 中的。我正在为从图像读取条形码的第二个问题提供可选解决方案。您可以使用 ZXing 来解码条码。下面是伪代码,你必须在函数中传递图像路径:

    static void ScanBarCode(string FileName) {
        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(FileName);
        try {
            BarcodeReader reader = new BarcodeReader { AutoRotate = true, TryHarder = true };
            Result result = reader.Decode(bitmap);
            string decodedData = result.Text;
            Console.WriteLine(result.ToString());
        } catch {
            throw new Exception("Cannot decode the Barcode code");
        }
    }
    

    【讨论】:

    • 我知道一种从 PDF 中提取图像的方法,但是为了寻找一些简短的代码和新技巧,这是我的第一个问题,好吧,在我还在 VB.Net 上制作项目之前,请看 3 年,当我看 .Net 时,我脸上露出了笑容,让我试试你推荐的……
    • 我也知道,我也面临着将 PDF 的定义区域转换为字节或 .PNG 的相同挑战,以便我可以检索条形码值。
    • 您可以使用iText提取图像,然后将图像数据交给ZXing进行解码。顺便说一下,iText 也使用 ZXing,但只是为了编码。
    • 使用 iText 在 PDF 中插入 QRCode 和 Code128 条形码图像,在 MouseClick 上的反应不同,其中 QRCode 图像被选中,但 Code128 图像没有。所以当我提取我的单页 PDF 的整个图像时,我只得到了其余所有的 QRCode 图像。因此,为了提取 Code128 图像,我在插入时做了一些技巧,我将在最后说明。所以直到时间我会邀请更多的帮助..
    • 嗨@ArifMustafa,最后我为我的问题提供了一个解决方案,希望它也能帮助你。我正在使用 APOSE,它已经解决了我的所有问题。它有很多与 PDF 的丰富功能相关的强大功能。你可以参考这个链接How to Read Barcode from PDF Documents - JAVA。使用此服务的唯一缺点是它是付费 API。
    【解决方案2】:

    正如我之前评论的那样,Code128 Barcode Image 的一个技巧是没有在 pdf 中获得鼠标点击选择,作为 QRCode。

    所以,我将Code128 Barcode 图像作为File 存储在一个 tmp 文件夹中,然后我从文件中插入了这些图像,通过这样做我得到了Barcode Image 鼠标单击完成图像选择与javaxt.io.Image api 的帮助.

    这是时间的代码我如何在PDF 中插入Code128 Barcode Image -

    private static void insertBAR(PdfContentByte cb, PdfPTable table, String text, int colspan, com.itextpdf.text.Font font){
        Barcode128 code128 = new Barcode128();
        code128.setBaseline(-1);
        code128.setSize(16f);
        //code128.setBarHeight(16f);
        code128.setCode(text.trim());
        code128.setCodeType(Barcode128.CODE128);
        Image code128Image = code128.createImageWithBarcode(cb, new BaseColor(0, 47, 47), null);
    
        java.awt.Image awtImage = code128.createAwtImage(new Color(0, 47, 47), Color.WHITE);
        //java.awt.Image awtImage = code128.createAwtImage(Color.BLACK, Color.WHITE);
        //Initialising a 6+ (width and height)size of BufferedImage to put the Barcode Image in center
        BufferedImage bi = new BufferedImage(awtImage.getWidth(null)+6, awtImage.getHeight(null)+6, BufferedImage.TYPE_INT_ARGB);
    
        Graphics2D gd = bi.createGraphics();
        gd.setColor(Color.WHITE);
        gd.fillRect(0, 0, bi.getWidth(), bi.getHeight());
        //drawing the Barcode Image in center of BufferedImage Rect.
        gd.drawImage(awtImage, 3, 3, null);
        gd.dispose();
    
        File imgFile = new File(OneMethod.getElementosPath() + "/db/tmp/Img" + (++shortCount) + ".png");
    
        try {
            javaxt.io.Image img = new javaxt.io.Image(bi);
            img.saveAs(imgFile);
        code128Image = Image.getInstance(imgFile.getAbsolutePath());
        } catch (BadElementException | IOException ex) {
            ex.printStackTrace();
        }
    
        PdfPCell cell = new PdfPCell();
        cell.setMinimumHeight(35f);
        cell.setHorizontalAlignment(Element.ALIGN_LEFT);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setPadding(2f);
        cell.setColspan(colspan);
        cell.addElement(code128Image);
        //cell.setImage(code128Image);
        table.addCell(cell);
    }
    

    现在我如何首先使用iText 提取Barcode Image,然后使用zxing api 从这些图像中检索String 值-

    private void readAndValidateContents(){
        if(externalLOB.size() == 2){
            try {       
                PdfReader reader = new PdfReader(externalLOB.get(0).getAbsolutePath());     
                PdfReaderContentParser parser = new PdfReaderContentParser(reader);
                //Trying to Extract Images to a tmp folder
                ImageRenderListener listener = new ImageRenderListener(OneMethod.getElementosPath() + "/db/tmp/Img%s.%s");
    
                for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                    parser.processContent(i, listener);
                }
    
                //Retrieving String values from images extracted to tmp folder
                ArrayList<String> ary = OneMethod.decodeBarcodes();
    
                //Extracting String values from PDF Page using iText API
                String[] contents = (PdfTextExtractor.getTextFromPage(reader, 1)).split("\n");
                externalKey.clear();
    
                System.out.println("\n\n");
    
                short line = 0;
                for(String str : contents){
                    System.out.println(line++ + str);
                }
    
                String tempVal = ary.get(0);
                String[] split = tempVal.split("\n");
                tempVal = split[0];
    
                tempVal = tempVal.substring(0, tempVal.indexOf("."));
                System.out.println("\n\n" + tempVal + "\n\n");
    
                if(contents[4].equals(tempVal)){ //comparing qr bar code file name with pdf text file name  
                    System.out.println("Something XYZ....Here...Done...")
                }else{
                    System.err.println("Possibilities for File Interruption, File different of requested...");
                }           
            } catch (StringIndexOutOfBoundsException spiobe){
                System.err.println("File different of requested...");
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (Exception ex){
                ex.printStackTrace();
            } finally{
                OneMethod.clearDirectory(OneMethod.getElementosPath() + "/db/tmp/");
            }
        }
    }
    
    class OneMethod {
        static synchronized ArrayList<String> decodeBarcodes(){
            ArrayList<String> ary = new ArrayList<String>();
            short suffix = 1;
            File imageFile = null;
    
            outer:
            while(true){
                if(++suffix > 5) //Starting to read the Img with Suffix 2 i.e. Img2.jpg
                    break outer;
                inner:
                while(true){
                    try{
                        InputStream barCodeInputStream;
                        imageFile = new File(OneMethod.getElementosPath() 
                            + "/db/tmp/Img" + suffix + (suffix != 2 ? ".png" : ".jpg"));
                        if(imageFile.exists() && imageFile.isFile()){
                            barCodeInputStream = new FileInputStream(imageFile.getAbsolutePath());
                            BufferedImage barCodeBufferedImage = ImageIO.read(barCodeInputStream);
    
                            //Using zxing-core-3.2.0 with collaborating the old 1.3 version com.google.zxing.client.j2se package inside.
                            //So doing above action you will get the BufferedImageLuminanceSource class which is now not available in new versions.
    
                            LuminanceSource source = new BufferedImageLuminanceSource(barCodeBufferedImage);
                            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                            Reader reader = new MultiFormatReader();
                            Result result = reader.decode(bitmap);
    
                            System.out.println(suffix + " value is : " + result.getText());
    
                            ary.add(result.getText());
                        }else{
                            System.out.println(imageFile.getAbsolutePath() + " path is not available...");
                        }
                        break inner;
                    } catch(FileNotFoundException | NullPointerException ex) {
                        ex.printStackTrace();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    } catch (NotFoundException | ChecksumException | FormatException ex) {
                        ex.printStackTrace();
                    }
                }
            }       
            return ary;
        }
    
        static synchronized void clearDirectory(final String dirPath){
            new Thread(new Runnable(){
                public void run(){
                    try{
                        File directory = new File(dirPath);
                        if(directory.isDirectory() == true)
                            try {
                                File[] files = directory.listFiles();
                                for(File file : files){
                                    FileUtils.deleteQuietly(file);
                                    Thread.sleep(100);
                                    if(file.exists())
                                        FileUtils.forceDeleteOnExit(file);
                                }
                            } catch (IOException ioe) {
                                ioe.printStackTrace();
                            }
                    }catch(InterruptedException exp){
                        exp.printStackTrace();
                    }
                }
            }).start();
        }
    }
    
    class ImageRenderListener implements RenderListener { 
        /**
         * Creates a RenderListener that will look for images.
        */
        public ImageRenderListener(String path) {
            this.path = path;
            tempCount = 0;
        }
    
        /**
         * @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()
         */
        public void beginTextBlock() {}
    
        /**
         * @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()
         */
        public void endTextBlock() {}
    
        /**
         * @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(
         *     com.itextpdf.text.pdf.parser.ImageRenderInfo)
        */
        public void renderImage(ImageRenderInfo renderInfo) {
        //public void renderImage(InlineImageInfo renderInfo) {
            try {
                String filename;
                FileOutputStream os;
                PdfImageObject image = renderInfo.getImage();
                if (image == null) return;
                filename = String.format(path, ++tempCount, image.getFileType());
                os = new FileOutputStream(filename);
                os.write(image.getImageAsBytes());
                os.flush();
                os.close();
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    
        /**
         * @see com.itextpdf.text.pdf.parser.RenderListener#renderText(
         *     com.itextpdf.text.pdf.parser.TextRenderInfo)
        */
        public void renderText(TextRenderInfo renderInfo) {}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2011-12-05
      • 2014-05-12
      • 1970-01-01
      相关资源
      最近更新 更多