我想在java中解析pdf
文件并从中提取一些事务数据。我用iText
来阅读pdf。它将整个pdf作为字符串返回。我无法提取数据。处理这个问题的更好方法是什么?
以下是解析我的pdf文件后得到的内容,该文件是字符串格式,我需要过滤事务数据,以便我可以将其插入数据库。
日期交易金额单位价格单位 (INR)(INR)余额 Birla Sun Li [e共同基金 对开编号:1016409683 PAN:AZMPB2802L KYC:OK PAN:好的 B291GZ-Birla Sun Life印度GenNext基金 - 增长直接计划(顾问:DIRECT)注册商:CAMS 期初余额:0.000 2014年3月12日购买5,000.00 146.113 34.22 146.113 2014年4月22日购买 - 通过互联网1,500.00 41.993 35.72 188.106 05-May-2014购买 - 通过互联网1,500.00 42.505 35.29 230.611 2015年1月13日购买 - 通过互联网1,500.00 28.604 52.44 259.215 2015年2月3日购买 - 通过互联网3,000.00 54.835 54.71 314.050 03-Mar-2015购买 - 通过互联网3,000.00 53.476 56.10 367.5260
2016年3月10日的估值:58,956.90卢比 结算单位余额:2016年3月10日1,143.462净资产值:51.56卢比
答案 0 :(得分:1)
根据您所处的具体情况,您可以尝试各种方法。
iText有一个名为pdf2Data的工具,听起来就像你正在寻找的那样。它根据模板处理文档,并为您提供xml文档。这当然更适合商业环境。
您可以编写自己的提取策略,以更聪明的方式处理pdf文档。例如,假设您要从pdf文档中的表中提取信息。
你将实现IEventListener,并监听两种事件;线条绘制事件(以便在绘制表格时得到通知)和文本呈现事件(以获取表格中的内容)。
然后,您必须编写几个智能启发式方法来定义构成表的内容。对于简单的概念验证,您可以简单地查找以90度角交叉的线条。确定边界框。然后去查找该框中的所有文本呈现指令。使用另一种能够确定列和行边界的聪明启发式算法。
答案 1 :(得分:0)
实际上你真正需要的是一个字符串,你正在寻找的程序称为解析。一旦你得到包含整个pdf的String,你需要编写一些“智能”(说聪明,因为它取决于你的pdf的内容)代码,它可以将主String拆分成更小,更有用(适合你)的部分。 / p>
之后,您需要使用Java应用程序与数据库建立连接,并提供必要的数据库代码,该代码将使用您使用解析器创建的较小的String部分来填充表。
Bellow,你可以看到我为一个作业编写的一些代码,需要从一个流中解析一个较大的String对象的有用部分(在这种情况下是一个包含篮球游戏统计数据的.txt)。public static ArrayList<HashMap<String, String>> parse (InputStream input) throws IOException {
output = new ArrayList();
count = 0;
atcount = 0;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
if (input != null) {
while ((line = reader.readLine()) != null) {
if (line.contains("Team")) {
playerBounds = false;
team2Bounds = true;
count = 0;
}
if (playerBounds == true && team2Bounds == false) {
count++;
listΑ = line.split("\t");
addToList();
//printAll();
}
if ((playerBounds == true) && (team2Bounds == true)) {
count++;
listΑ = line.split("\t");
addToList();
//printAll();
}
if (line.contains("Player")) {
playerBounds = true;
}
atcount = 0;
}
}
} catch (IOException ex) {
throw ex;
} finally {
try {
input.close();
} catch (Throwable ignore) {
}
}
return output;
}
我希望这可以帮助你:)