在过去的几天里,我一直在尝试使用一些 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/