在代码中从PDF中提取文本

时间:2012-07-22 13:49:17

标签: android eclipse pdf extract downloading

我正在为我的学校制作一个应用程序,人们可以查看是否有更改时间表。此处列出了所有计划更改:http://www.augustinianum.eu/roosterwijzigingen/14062012.pdf。我想在该页面中搜索关键字(用户的组,在EditText中输入)。我已经找到了如何使应用程序检查edittext是否匹配某个字符串,所以现在我只需要将该页面上的所有文本下载到字符串。但问题是它不是一个简单的网页,而是一个PDF页面。我听说你需要一个特殊的pdf库或者从PDF中提取文本,然后将该文本放入一个字符串中,然后使用contains()在字符串中搜索关键字。 不过我对此有一些疑问:

  • 此PDF是由PDF创建者制作的,它不是扫描页面左右。实际上,您可以选择文本或使用CTRL + F搜索关键字。所以我想知道是否真的需要提取PDF和东西,或者是否有更简单的方法。

  • 我希望应用程序每次检查更改,比方说小时。所以它还必须每小时下载PDF并提取文本(大约8页),这会消耗很多果汁吗?

  • 我听说有很多图书馆可以做我想要的。那我应该用哪个? (如果可能的话,我想要一个免费的:))

  • 有人可以向我解释如何在我的代码中使用它吗? (我不是真的有经验,所以请保持一点容易:))

非常感谢你!

2 个答案:

答案 0 :(得分:4)

不幸的是,我没有使用java,你必须自己在java代码中实现它。现在我告诉你,我最后是怎么做到的:

1)我通过您的链接获取了该文件。 PHP是通过@fopen("http://...")完成的。

2)我将其打开为二进制(这很重要)并提取了两部分:

2.1)数据3 0 obj part,表示创建和修改日期。我是通过regex做到的。这很简单,我在上面提到它。

2.1)来自5 0 obj的数据流,表示泄露的数据。重要! Microsoft Excel插入两个字节0D 0A作为换行符。当您使用regexp过滤内容时,请不要忘记它。开头和结尾的这些字节不得包含在提取的字符串中。

3)我通过函数$uncompressed = @gzuncompress($compressed)对一个编码的东西进行膨胀并将其放在外部文件中。您可以看到结果there

4)最有趣的部分。文件内的原始数据采用文本格式。它看起来像[(V)-4(RI)16(J)] TJ,意思是VRIJ。您可以在PDF Reference v1.7,第5部分中阅读PDF格式的文本。

5)我相信,正则表达式可以帮助您提取或/和转换数据。

重要提示:我说“来自5 0 obj的数据流”,但对象的数量“是变更的主题”。您必须从dictionary-> pages-> page->内容链中控制对象的引用。您可以在我上面提到的手册中找到“面包屑”的描述。

不幸的是,Excel不会在PDF中嵌入任何表结构,但您可以找到文本部分的坐标并解释它。无论如何,这是一团糟。

你认为,亲爱的梅林,这很难吗?不,亲爱的,事实并非如此。这并不难,因为没有unicode符号。 PDF中的unicode是THE REAL SUCK!

祝你好运!

答案 1 :(得分:1)

此PDF由Microsoft Excel制作,并带有日期戳:

3 0 obj
<</Author(Janszen, Jan) 
/CreationDate(D:20120613153635+02'00') 
/ModDate(D:20120613153635+02'00') 
/Producer(˛ˇMicrosoftÆ ExcelÆ 2010) 
/Creator(˛ˇMicrosoftÆ ExcelÆ 2010)>>
endobj

您几乎可以使用任何编程语言通过URL和提取“ModDate”内容来获取文件。新ModDate意味着信息更新。要提取此信息,您不需要任何库 - 这是文件中的文本,第9,10和11行。

让Jan Janszen将您添加到分发列表中。文件中的数据已编码。您必须使用大量编程技术来获取源和恢复信息。