Is it possible to extract text by page for word/pdf files using Apache Tika?

后端 未结 3 505
陌清茗
陌清茗 2020-12-10 05:21

All the documentation I can find seems to suggest I can only extract the entire file\'s content. But I need to extract pages individually. Do I need to write my own parser f

相关标签:
3条回答
  • 2020-12-10 05:36

    You can get the number of pages in a Pdf using the metadata object's xmpTPg:NPages key as in the following:

    Parser parser = new AutoDetectParser();
    Metadata metadata = new Metadata();
    ParseContext parseContext = new ParseContext();
    parser.parse(fis, handler, metadata, parseContext);
    metadata.get("xmpTPg:NPages");
    
    0 讨论(0)
  • 2020-12-10 05:38

    You'll need to work with the underlying libraries - Tika doesn't do anything at the page level.

    For PDF files, PDFBox should be able to give you some page stuff. For Word, HWPF and XWPF from Apache POI don't really do page level things - the page breaks aren't stored in the file, but instead need to be calculated on the fly based on the text + fonts + page size...

    0 讨论(0)
  • 2020-12-10 05:41

    Actually Tika does handle pages (at least in pdf) by sending elements <div><p> before page starts and </p></div> after page ends. You can easily setup page count in your handler using this (just counting pages using only <p>):

    public abstract class MyContentHandler implements ContentHandler {
        private String pageTag = "p";
        protected int pageNumber = 0;
        ...
        @Override
        public void startElement (String uri, String localName, String qName, Attributes atts) throws SAXException  {  
    
            if (pageTag.equals(qName)) {
                startPage();
            }
        }
    
        @Override
        public void endElement (String uri, String localName, String qName) throws SAXException {  
    
            if (pageTag.equals(qName)) {
                endPage();
            }
        }
    
        protected void startPage() throws SAXException {
        pageNumber++;
        }
    
        protected void endPage() throws SAXException {
        return;
        }
        ...
    }
    

    When doing this with pdf you may run into the problem when parser doesn't send text lines in proper order - see Extracting text from PDF files with Apache Tika 0.9 (and PDFBox under the hood) on how to handle this.

    0 讨论(0)
提交回复
热议问题