java - PDF 抓取 -> MS Access

标签 java sql pdf jdbc prepared-statement

在过去的几天里,我一直在尝试使用一些 Java 代码(通过 PDFBox)从 PDF 中抓取数据,并编写了一些测试代码来将测试数据插入到 Access 数据库中。

我的最终目标是有一个程序,它接受多个 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 - 找出表中的列(我假设您使用 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 名称计算它们。

祝你好运。

关于java - PDF 抓取 -> MS Access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447515/

相关文章:

Java 字符隔离字符串操作

java - 如何修复 Java ArrayList 中循环中仅重复的最后一个对象

mysql - 将 MySQL 数据库迁移到 SQLite 时出错

sql - 如何在 PostgreSQL 中创建临时函数?

java - 如何在 Java 中从 XML 创建 PDF?

java - 从同一行获取数字

java - 服务小程序容器;它是什么,我需要它吗?

java - Android 中防止刷新 webview

html - 如何在 Flutter 的 html 字符串中使用 css-property?

javascript - 如何生成 Javascript 生成的 HTML 的 PDF?