从PDF文档中提取文本并生成结构化数据。

4
我能成功从所有pdf页面提取文本,但无法生成结构化数据。如果有人遇到这方面的专业问题,请给予指导。
代码:
package pdfboxreadfromfile;

import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.PDFTextStripperByArea;

public class PDFBoxReadFromFile {
  public static void main(String[] args) {
    try {
      File file = new File("C:/ma.pdf");
      PDDocument doc = PDDocument.load(file);
      PDFTextStripper pdfTextStripper = new PDFTextStripper();
      pdfTextStripper.setSortByPosition(true);
      pdfTextStripper.setStartPage(1);
      pdfTextStripper.setEndPage(6);
      String text = pdfTextStripper.getText(doc);
      System.out.println(text);
      doc.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

输出:

enter image description here

PDF文件看起来像这样。 第1页: enter image description here

预期的页眉文字仅供参考,不需要打印出来。 enter image description here

尝试了以下方法:

Pattern p = Pattern.compile("PO...........*?");
Pattern p1 = Pattern.compile("Vendor...........");
Pattern p2 = Pattern.compile("100.....*?");
Pattern p4 = Pattern.compile("Date...............................................*?");
Pattern p5 = Pattern.compile("62...........3*?");
Pattern p6 = Pattern.compile("62710149950...*?");
Pattern p7 = Pattern.compile("627101499504..*?");

Matcher m = p.matcher(text);
Matcher m1 = p1.matcher(text);
Matcher m2 = p2.matcher(text);
Matcher m4 = p4.matcher(text);
Matcher m5 = p5.matcher(text);
Matcher m6 = p6.matcher(text);
Matcher m7 = p7.matcher(text);
m.find();
m1.find();
m2.find();
m4.find();
m5.find();
m6.find();
m7.find();

System.out.println(m.group(0) + "|" + m1.group(0) + "|" + m2.group(0) + "|" + m2.group(0) + "|" + "MAC" + "|" + m4.group(0) + "|" + m5.group(0) + "|");
System.out.println(m.group(0) + "|" + m1.group(0) + "|" + m2.group(0) + "|" + m2.group(0) + "|" + "MAC" + "|" + m4.group(0) + "|" + m6.group(0) + "|");
System.out.println(m.group(0) + "|" + m1.group(0) + "|" + m2.group(0) + "|" + m2.group(0) + "|" + "MAC" + "|" + m4.group(0) + "|" + m7.group(0) + "|");

结构化输出。但问题是条形码别名产品代码的数量未出现。 enter image description here

1
请问您能否展示给我们PDF文件? - Karam Mohamed
@KaramMohamed 附上了 PDF 的第一页内容,请查看。 - Leace
Itext和pdfbox是通用的pdf库,不是专门的表格数据提取器。其他产品将这些库用作专门的表格数据提取功能的基础。您可以尝试这样的产品,例如[pdf2Data](https://itextpdf.com/en/products/itext-7/pdf2data)和[tabula](https://tabula.technology/)。 - mkl
使用Java数组列表,能否实现这个功能? - Leace
根据评论,我可以看出Textricator是一种从文档中提取文本并生成结构化数据的工具。有人使用过这个工具吗?请分享一下经验。 - Leace
显示剩余9条评论
1个回答

0
你应该搜索文本中的标题行(条形码,物品编号等),然后通过将每个后续行拆分为列来解析它。这些列由空格分隔,因此您可以使用String.split()函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接