【问题标题】:Extract text from PDF in code在代码中从 PDF 中提取文本
【发布时间】:2012-07-20 23:55:29
【问题描述】:

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

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

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

  • 我听说有很多库可以满足我的需求。那么我应该使用哪个? (如果可能的话,我想要一个免费的:))

  • 谁能向我解释如何在我的代码中使用它? (我不是很有经验,所以请保持简单一点:))

非常感谢大家!!!

【问题讨论】:

    标签: android eclipse pdf extract download


    【解决方案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 将您添加到分发列表中。文件中的数据被编码。您必须使用大量编程技术来获取源和恢复信息。

    【讨论】:

    • 所以你说实际上几乎不可能从PDF中提取文本
    • 不,先生!你能行的!任何人都可以做到!昨天我尝试这样做,但不幸的是我的系统上没有安装 zlib 功能。如果可以使用zlib解码,那么就可以得到流数据内容,然后就可以看到PDF的文本内容,然后通过正则表达式提取数据。不幸的是,我不能给你工作代码,因为我的环境还不够。对不起。
    • 我用谷歌搜索了 zlip,如果我错了,请纠正我,你不需要下载任何东西,因为 JAVA SDK 已经将它包含在 java.util.zip 中,对吗?
    • 如果你是java程序员,相信bfo.com/products/pdf/docs/api/org/faceless/pdf2/…可能对你有用。
    • 好的,下载了,但是我应该把它放在哪个地图上,因为现在它说import org.faceless.pdf2.* 无法解析。
    【解决方案2】:

    不幸的是,我没有使用 java,您必须自己在 java 代码中实现它。现在我会告诉你,我最终是如何做到的:

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

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

    2.1) Data 3 0 obj部分,代表创建和修改日期。我是通过regex 做到的。这很简单,我在上面提到过。

    2.1) 来自 5 0 obj 的数据流,表示压缩后的数据。重要的! Microsoft Excel 插入两个字节 0D 0A 作为换行符。当您通过正则表达式过滤内容时,不要忘记它。开头和结尾的这些字节不必包含在提取的字符串中。

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

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

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

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

    不幸的是,Excel 没有在 PDF 中嵌入任何表格结构,但您可以找到文本部分的坐标并对其进行解释。反正就是一团糟。

    亲爱的梅林,你觉得这很难吗?不,亲爱的,它不是。这并不难,因为没有 unicode 符号。 PDF 中的 unicode 真的很糟糕!

    祝你好运!

    【讨论】:

    • 再次感谢您的宝贵时间。但我已经使用 iText 库做到了。很抱歉,我不清楚我已经解决了我的问题。希望没有花你太多时间,我很抱歉。但无论如何,如果以后 iText 没有提供足够的选项,这将非常有用。再见。
    • 亲爱的梅林!这不是问题。我试图解决一个从头开始生成 PDF 的大问题,但我的情况没有任何“预制”解决方案。充气-放气只是一小部分,我应该自己解决。我的全局任务是在 PHP 中创建一个类,它将解释手写的、面向人类法律合同的 plaie-text 并构建文档。枚举器、引用和交叉引用、脚注、标题页、页码、内联 sum()、count()、min()、max() 函数,以及超级重要的 - 文本参数定义和提取。
    • 我几乎可以用 regexp 做,但排版、unicode 符号替换和多语言支持——最难的部分。但我对这个噩梦的东西的理解非常接近。对我最有帮助的是逐字节阅读现有 PDF 文件的膨胀部分。
    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多