导读:怎样从PDF中提取内容,了解一下。

PDFBox:使用Java轻松从PDF文件提取内容_java

如果有一种方法可以自动对PDF内容进行验证,那么程序员的生活会有多轻松!


不知道你是不是听过Java提供一种工具,可以提取PDDF的内容。本文就来向你介绍这种工具,它的名字叫 Apache PDFBox。


什么是PDFBox

Apache PDFBox库是用来处理PDF文档的开源Java工具。它可帮我们做到:


1)创建新PDF文档;

2)更新现有文档;

例如添加样式,增加超链接等;

3)从PDF文档中提出内容。


从PDF阅读内容



当我们能够从PDF提取文本内容时,问题已经解决一半。下面我们举代码示例来完成此任务。


Apche PDFTextStripper的类PDFTextStripper(https://pdfbox.apache.org/docs/2.0.7/javadocs/org/apache/pdfbox/text/PDFTextStripper.html)可以将PDF中的文本以去除所有格式的形式提出出来。它将忽略所有格式和特别样式。


tStripper = new PDFTextStripper();tStripper.setStartPage(1);tStripper.setEndPage(3);
PDDOocument document = PDDocument.load(new File("youpdfname.pdf"));
document.getClass();  if(!document.isEncrypted()){    pdfFileInText = tStripper.getText(document);    lines = pdfFileIntext.split("\\r\\n\\r\\n");    for(String line : llines){      System.out.printlln(line);      content += line;    }  }System.out.println(content.trim());


从PDF文件中获得所有超链接



第二件事是验证PDF中的超链接。下列代码为大家提供了PDF文档中的超链接。


PDPage类(https://pdfbox.apache.org/docs/2.0.2/javadocs/org/apache/pdfbox/pdmodel/PDPage.html)中的getAnnotations()方法提供了取得文档中的注释列表。接下来,获取文档或页面中的URI列表,使用PDActionURI(https://pdfbox.apache.org/docs/2.0.4/javadocs/org/apache/pdfbox/pdmodel/interactive/action/PDActionURI.html)

PDDocument document = PDDocument.load(new File("name.pdf"));document.getClass();PDPage pdfpage = document.getPage(1);            annotations = pdfpage.getAnnotations();            for (int j = 0; j < annotations.size(); j++) {                PDAnnotation annot = annotations.get(j);                if (annot instanceof PDAnnotationLink) {                    PDAnnotationLink link = (PDAnnotationLink) annot;                    PDAction action = link.getAction();                    if (action instanceof PDActionURI) {                        PDActionURI uri = (PDActionURI) action;                        urls += uri.getURI();                        System.out.println(uri.getURI());                    }                }            }        }

从PDF文件中导出图片



除了文本与超链接外,PDFBox还提供了从文档中提取图片的功能。


PDPage类(https://pdfbox.apache.org/docs/2.0.2/javadocs/org/apache/pdfbox/pdmodel/PDPage.html#getResources())还提供了getResource() 方法,用来取得PDF中的所有资源对象,比如图片对象的列表。


PDDocument document = PDDocument.load(new File("name.pdf"));PDPage pdfpage = document.getPage(1);        int i = 1;        PDResources pdResources = pdfpage.getResources();        for (COSName c : pdResources.getXObjectNames()) {            PDXObject o = pdResources.getXObject(c);            if (o instanceof org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) {                File file = new File(i + ".png");                i++;                ImageIO.write(((org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject) o).getImage(), "png", file);            }        }

获得PDF中超链接中的单词



从PDF中获取文本、超链接和图片的任务变得很简单。接下来,我们进一步了解如何提取超链接的单词。


如我们在第二部分中所见,对于“链接”注释以及每一个链接,可使用PDRectangle类来裁剪文本区域。


以下代码为大家提供了取得在文档中超链接中单词的列表:


PDDocument document = PDDocument.load(new File("name.pdf"));        int pageNum=0;        for( PDPage page : doc.getPages() )        {            pageNum++;            PDFTextStripperByArea stripper = new PDFTextStripperByArea();            List<PDAnnotation> annotations = page.getAnnotations();            //first setup text extraction regions            for( int j=0; j<annotations.size(); j++ )            {                PDAnnotation annot = annotations.get(j);                if( annot instanceof PDAnnotationLink )                {                    PDAnnotationLink link = (PDAnnotationLink)annot;                    PDRectangle rect = link.getRectangle();                    //need to reposition link rectangle to match text space                    float x = rect.getLowerLeftX();                    float y = rect.getUpperRightY();                    float width = rect.getWidth();                    float height = rect.getHeight();                    int rotation = page.getRotation();                    if( rotation == 0 )                    {                        PDRectangle pageSize = page.getMediaBox();                        y = pageSize.getHeight()-y;                    }                    else if( rotation == 90 )                    {}                    Rectangle2D.Float awtRect = new Rectangle2D.Float( x,y,width,height );                    stripper.addRegion( "" + j, awtRect );                }            }            stripper.extractRegions( page );            for( int j=0; j<annotations.size(); j++ )            {                PDAnnotation annot = annotations.get(j);                if( annot instanceof PDAnnotationLink )                {                    PDAnnotationLink link = (PDAnnotationLink)annot;                    PDAction action = link.getAction();                    String urlText = stripper.getTextForRegion( "" + j );                    if( action instanceof PDActionURI )                    {                        PDActionURI uri = (PDActionURI)action;                        System.out.println( "Page " + pageNum +":'" + urlText.trim() + "'=" + uri.getURI() );                    }                }            }        }


以上为全部。祝大家顺利愉快。