如何使用pdfBox检测柱状pdf页面?

时间:2016-11-17 13:12:28

标签: java pdf pdfbox

我正在尝试从pdf中读取文本,并使用pdfbox中的java从中创建表格。我被this pdf困住了。在第一页上,您可以看到该页面分为两列,该表位于页面的右侧。我使用processStream方法获取字符:

public ArrayList<ArrayList<TextPosition>> pageExtractor(PDPage page, String readingType) throws Exception {
    setReadingType(readingType);
    setPageWidth(page.getMediaBox().getWidth());
    setPageHeight(page.getMediaBox().getHeight());
    normalSpacing = this.getSpacingTolerance();
    PDStream contents = page.getContents();
    if (contents != null) {
        //Function to extract the pdf characters and join the words (@Override processTextPosition(TextPosition text) function is called after this function)
        this.processStream(page, page.findResources(), page.getContents().getStream()); //Main Function which loops over all the characters in pdfpage.
        if (!oneLineCharacterList.isEmpty())characterList.add(oneLineCharacterList);
    }
    return characterList;
}

为PDPage中的每个字符调用以下函数:

protected void processTextPosition(TextPosition text) {
    System.out.println(text.getCharacter());
}

调用上述函数的顺序取决于编写pdf的顺序。它可能是偶然的方式。如果您选择全部并在文本文件中复制上面链接的pdf的文本,那就是调用processTextPosition的顺序。因此,您可以看到在读取右侧表格后读取chart 1

现在,确定pdf页面的阅读顺序没有定义,我想以明确的方式阅读pdf。如果pdf页面没有被分成列,我可以在读取所有页面后根据坐标轻松排列所有单词并知道正确的顺序。但是,由于上面的pdf分为两列(一列以Latest Week's Sales Snapshot开头,另一列ICSC-Goldman Sachs Weekly),如何确定页面实际上是柱状的?即以这样的方式排列文本:左列文本首先出现,右列文本出现?我们在PDPage中是否有任何功能来确定页面是否被分成列?另一个示例是两列pdf,我希望在其中排列第一列文本第一列和第二列文本,this与pdfs相对,没有任何柱状结构,例如this(第2页)。 / p>

修改

在查看PDFTextStripper课程的文档后,我看到可能解决我问题的字段charactersByArticle。但是,如果已为该类填充了PDDocument对象,我如何填充此字段(以及其他字段)?这是我试过的:

package com.pdfExtractor.extractArticles;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.pdfbox.exceptions.CryptographyException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.util.PDFTextStripper;

public class ArticleExtractor extends PDFTextStripper{

    List<PDPage> pages;

    @SuppressWarnings("unchecked")
    public ArticleExtractor(PDDocument document) throws IOException {
        super();
        super.setSortByPosition(true);      
        this.document = document;
        pages = new ArrayList<PDPage>(this.document.getDocumentCatalog().getAllPages());
    }


    public void extractArticles(int pageNumber) throws IOException {
        //Some code to process the document, so that the variables below are populated
        this.processStream(this.pages.get(pageNumber), this.pages.get(pageNumber).getResources(), this.pages.get(pageNumber).getContents().getStream());
        System.out.println(this.getFonts());
        this.startDocument(this.document);
        System.out.println(this.charactersByArticle);
    }

    public static void main(String[] args) throws IOException, CryptographyException {
        PDDocument document= null;
        File input = new File("C:\\Users\\prabhjot.rai\\Desktop\\xceligent\\11365798.pdf");
        document = PDDocument.load(input);
        if (document.isEncrypted()) {
            document.decrypt("");
        }        
        document.setAllSecurityToBeRemoved(true);
        ArticleExtractor articleExtractor = new ArticleExtractor(document);
        articleExtractor.extractArticles(1);
    }

}

它在控制台上为我提供了空数组作为输出。我需要实现什么逻辑来填充这些字段?

0 个答案:

没有答案