PDF 抓取 -> MS Access

PDF scraping -> MS Access

在过去的几天里,我一直在尝试使用一些 java 代码(通过 PDFBox)从 PDF 中抓取数据,并制作了一些测试代码以将测试数据插入到访问数据库。

我的最终目标是让一个程序接受多个 PDF(所有相同的表单)的输入,将 PDF 中的数据插入数据库,其中每个表单的数据都是一条新记录。请注意,所有字段都需要出现 - 只是其中的大部分。

然而,我的问题是关于最佳实践的 - 根据从 PDF 表单到数据库的字段的实际映射来解决这个问题的最佳方法....我想它可以称为动态 SQL代.

我的表单可能有大约 150 个字段,而不是对 pdf.name1-> db.name1 进行硬编码,我想也许是使用 do while 循环从 pdf 中读取字段名称,然后写入数据库,如果并且只有有相应的字段(数据库才会有我需要的字段)

我希望这些信息足够具体,尽管问题实际上是关于设计理念的。话虽如此,如果有人想插入具体的代码示例,我将不胜感激)

干杯

最后,您的插入内容可能如下所示:

 INSERT INTO sometable (col1, col2) VALUES (?, ?)

那么怎么去?

1 - 映射您的 PDF(您已有):

//Will contain (fieldname, value) for all fields found in your PDF
Map<String,String> pdf = new HashMap<String,String>();
//Fill it (you already have that)

2 - 找出您的 table 中有哪些列(我假设您将 ucanaccess 用于 JDBC 到您的访问数据库)

  List<String> columns = new ArrayList<String>(); 
  try (Connection conn = DriverManager.getConnection("jdbc:ucanaccess://" + dbFileSpec);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM [" + tableName + "] WHERE False")) {
        ResultSetMetaData rsmd = rs.getMetaData();
        System.out.println("Column names as reported by ResultSetMetaData:");
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
            System.out.println(rsmd.getColumnName(i));
            columns.add(rsmd.getColumnName(i));
        }            
    } catch (SQLException e) {
        e.printStackTrace();
    }

3 - 放在一起

 StringJoiner col = new StringJoiner(",");
 StringJoiner val = new StringJoiner(",");
 //First Iteration: Create the Statement
 for(String c : columns) {
   //Your PDF has a matching formfield 
   if(pdf.hasKey(c)) {
     col.add(c);
     val.add("?");
   }
 }
 String sql = String.format("INSERT INTO table (%s) VALUES (%s)", col.toString(), val.toString());
 try(PreparedStatement insert = con.prepareStatement(sql)) {
   //Insert position in statement
   int pos = 0;
   //Second iterations: Bind the values to the statement
   for(String c : columns) {
     //Your PDF has a matching formfield 
     if(pdf.hasKey(c)) {
       insert.setString(++pos, pdf.get(c));
     }
   }
   insert.executeUpdate();
 } catch (SQLException e) {
        e.printStackTrace();
 }

如果你不走运,你的列名与你的 pdf 表单字段名不完全匹配 - 所以你需要一个包含所有 150 个名称及其映射的映射 Map - 在这种情况下收集列名称已过时,您将从 PDF 名称中计算它们。

祝你好运。