Java PDFBox:从表中提取数据

Java PDFBox:从表中提取数据,java,pdfbox,extraction,Java,Pdfbox,Extraction,如何使用pdfbox从pdf表格中提取数据 在此过程中,可以使用PDContentStream和PageStripper类找到文本和内容的索引。必须找到表中行的索引,是否有人可以帮助扩展哪个类以及实现哪个方法 我尝试了以下方法来提取文本的起始索引: public class Tables { public static void main(String args[]) throws IOException{ BufferedWriter wr; File

如何使用pdfbox从pdf表格中提取数据

在此过程中,可以使用PDContentStream和PageStripper类找到文本和内容的索引。必须找到表中行的索引,是否有人可以帮助扩展哪个类以及实现哪个方法

我尝试了以下方法来提取文本的起始索引:

public class Tables {
    public static void main(String args[]) throws IOException{
        BufferedWriter wr;
        File input = new File("test.pdf");
        File output = new File("SampleText.txt"); 
        PDDocument pd=new PDDocument();
        pd=PDDocument.load(input);

        //      PDFTextStripper pds=new PDFTextStripper();
        //      String text=pds.getText(pd);
        PDFTextStripper stripper = new PDFTextStripper()
        {
            @Override
            protected void startPage(PDPage page) throws IOException
            {
                startOfLine = true;
                super.startPage(page);
            }

            @Override
            protected void writeLineSeparator() throws IOException
            {
                startOfLine = true;
                super.writeLineSeparator();
            }

            @Override
            protected void writeString(String text, List<TextPosition> textPositions) throws IOException
            {
                if (startOfLine)
                {
                    TextPosition firstProsition = textPositions.get(0);
                    writeString(String.format("[%s]", firstProsition.getYDirAdj()));
                    startOfLine = false;
                }
                super.writeString(text, textPositions);
            }
            boolean startOfLine = true;
        };
        wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output)));
        stripper.writeText(pd, wr);
        if (pd != null) {
            pd.close();
        }
        // I use close() to flush the stream.
        wr.close();
    }
}
公共类表{
公共静态void main(字符串args[])引发IOException{
缓冲写入器;
文件输入=新文件(“test.pdf”);
文件输出=新文件(“SampleText.txt”);
PDDocument pd=新的PDDocument();
pd=PDDocument.load(输入);
//PDFTextStripper pds=新的PDFTextStripper();
//String text=pds.getText(pd);
PDFTextStripper剥离器=新的PDFTextStripper()
{
@凌驾
受保护的无效起始页(PDPage页)引发IOException
{
startOfLine=true;
超级起始页(第页);
}
@凌驾
受保护的void writeLineSeparator()引发IOException
{
startOfLine=true;
super.writelineparator();
}
@凌驾
受保护的void writeString(字符串文本、列表文本位置)引发IOException
{
if(startOfLine)
{
TextPosition firstProsition=textPositions.get(0);
writeString(String.format([%s]”,firstProtion.getYDirAdj());
startOfLine=false;
}
super.writeString(文本、文本位置);
}
布尔startOfLine=true;
};
wr=新的BufferedWriter(新的OutputStreamWriter(新的FileOutputStream(输出)));
剥离器写入文本(pd,wr);
如果(pd!=null){
pd.close();
}
//我使用close()来冲洗流。
wr.close();
}
}

最近,我做了一个类似的项目,从表中提取数据

这里有两个选项:-

1) 您可以使用tabla(它是一个从pdf中提取表格的开源工具)。 您可以在代码中使用tabla命令行工具,并从特定区域提取数据

2) 您需要设计自己的算法来提取表格数据。 如果要选择第二个选项,则还需要提取文本的坐标。您可以重写pdfTextStripper类的writestring方法(您可以在google上搜索)。然后,您需要考虑如何使用这些信息来获得所需的详细信息。(坐标可能非常有用)


如果您有标准格式的pdf,那么我建议您使用表格,因为没有太多的工作要做。

转到您的第二个选项,我已经找到了文本坐标,如我所附的代码所示。我需要提取表格中的行坐标。如果您指的是图形行(而不是文本行),然后,我想你必须将pdf转换成图像,然后逐像素移动图像。表格中有一种方法,返回给定图像中每个线段的坐标。您的项目是否有相同格式的PDF。如果您可以上传一个示例文件,那么我会有一个更好的主意。对于(2),请参阅ExtractTextByArea.java示例。您能解释一下使用ExtractTextByArea查找行的索引应该覆盖哪些方法吗@蒂尔曼豪瑟