java – 使用PDFbox确定文档中单词的坐标

前端之家收集整理的这篇文章主要介绍了java – 使用PDFbox确定文档中单词的坐标前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用PDFBox提取PDF文档中的单词/字符串的坐标,并且迄今已经成功地确定了单个字符的位置.这是迄今为止的代码,从PDFBox doc:
package printtextlocations;

import java.io.*;
import org.apache.pdfBox.exceptions.InvalidPasswordException;

import org.apache.pdfBox.pdmodel.PDDocument;
import org.apache.pdfBox.pdmodel.PDPage;
import org.apache.pdfBox.pdmodel.common.PDStream;
import org.apache.pdfBox.util.PDFTextStripper;
import org.apache.pdfBox.util.TextPosition;

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

public class PrintTextLocations extends PDFTextStripper {

    public PrintTextLocations() throws IOException {
        super.setSortByPosition(true);
    }

    public static void main(String[] args) throws Exception {

        PDDocument document = null;
        try {
            File input = new File("C:\\path\\to\\PDF.pdf");
            document = PDDocument.load(input);
            if (document.isEncrypted()) {
                try {
                    document.decrypt("");
                } catch (InvalidPasswordException e) {
                    System.err.println("Error: Document is encrypted with a password.");
                    System.exit(1);
                }
            }
            PrintTextLocations printer = new PrintTextLocations();
            List allPages = document.getDocumentCatalog().getAllPages();
            for (int i = 0; i < allPages.size(); i++) {
                PDPage page = (PDPage) allPages.get(i);
                System.out.println("Processing page: " + i);
                PDStream contents = page.getContents();
                if (contents != null) {
                    printer.processStream(page,page.findResources(),page.getContents().getStream());
                }
            }
        } finally {
            if (document != null) {
                document.close();
            }
        }
    }

    /**
     * @param text The text to be processed
     */
    @Override /* this is questionable,not sure if needed... */
    protected void processTextPosition(TextPosition text) {
        System.out.println("String[" + text.getXDirAdj() + ","
                + text.getYDirAdj() + " fs=" + text.getFontSize() + " xscale="
                + text.getXScale() + " height=" + text.getHeightDir() + " space="
                + text.getWidthOfSpace() + " width="
                + text.getWidthDirAdj() + "]" + text.getCharacter());
    }
}

这产生一系列包含每个字符的位置的行,包括空格,如下所示:

String[202.5604,41.880127 fs=1.0 xscale=13.98 height=9.68814 space=3.8864403 width=9.324661]P

‘P’是字符.我在PDFBox中找不到一个功能来查找单词,而且我对Java不够熟悉,即使空格也包含在内,可以将这些字符准确地连接到单词中进行搜索.有没有人处于类似的状况,如果是这样呢?我真的只需要单词中第一个字符的坐标,以便零件简化,但是我将如何匹配一个字符串与这种输出是超出我的.

解决方法

PDFBox中没有功能可以自动提取字词.我目前正在提取数据,将其收集到块中,这是我的过程:

>我提取文档的所有字符(称为字形)并将其存储在列表中.
>我对每个字形的坐标进行分析,循环遍历列表.如果它们重叠(如果当前字形的顶部包含在当前字形的前面/底部之间或之前的顶部和底部之间),我将其添加到同一行.
>在这一点上,我提取了文档的不同行(注意,如果你的文档是多列,则表达式“lines”是指垂直重叠的所有字形,即所有列的文本都是相同的垂直坐标).
>然后,您可以将当前字形的左坐标与前一个字形的右坐标进行比较,以确定它们是否属于同一个单词(PDFTextStripper类提供了一个基于试验的getSpacingTolerance()方法,错误,“正常”空间的值,如果右和左坐标之间的差值低于此值,则两个字形都属于同一个字.

我把这个方法应用到我的工作,它的工作很好.

猜你在找的Java相关文章