Java PDFBox:从表中提取数据
如何使用pdfbox从pdf表格中提取数据 在此过程中,可以使用PDContentStream和PageStripper类找到文本和内容的索引。必须找到表中行的索引,是否有人可以帮助扩展哪个类以及实现哪个方法 我尝试了以下方法来提取文本的起始索引: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
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查找行的索引应该覆盖哪些方法吗@蒂尔曼豪瑟