【问题标题】:Extract text from PDF documents and generate structured data从 PDF 文档中提取文本并生成结构化数据
【发布时间】:2020-09-17 08:36:17
【问题描述】:

我能够成功地从 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();
    }
  }

输出:

PDF 看起来像这样。 第 1 页:

预期标题文本仅供参考,无需打印。

尝试了以下方法:

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) + "|");

结构化输出。但问题是针对条形码别名产品代码的数量没有出现。

【问题讨论】:

  • 能否给我们看一下PDF文件
  • @KaramMohamed 附上 pdf 第 1 页内容和查看
  • Itext 和 pdfbox 是通用 pdf 库,而不是专门的表格数据提取器。其他产品使用这些库作为专用表数据提取功能的基础。您可能想尝试此类产品。例如。 pdf2Datatabula.
  • @Leace 我认为你必须继续解析你的 PDF 并忽略这些行,直到你得到你想要的,这是唯一的解决方案,因为你正在提取文本,它不会区分信息
  • 使用java数组列表可以实现吗?

标签: java text pdfbox tabula pdf2data


【解决方案1】:

您应该在文本中搜索标题行(条形码、项目编号、...),然后通过将其拆分为列来解析每一行。列由空格分隔,因此您可以使用 String.split() 函数。

【讨论】:

    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多