在处理数字化文档存储和检索的工作中,经常遇到需要将大量图像文件(包括TIFF、PDF、JPEG、BMP等)转换为可搜索的文本格式的问题。本文将介绍如何利用OCR(光学字符识别)技术,结合Microsoft IFilter技术,实现对这些图像文件的索引。虽然本文主要讨论的是与Microsoft Windows SharePoint Services 2003的集成,但所介绍的方法同样适用于其他使用Microsoft索引技术的产品,如Microsoft Search、桌面搜索、SQL Server搜索以及通过插件与Google桌面搜索集成。
在之前参与的一个项目中,需要将旧文档扫描成PDF文件进行存储。同时,还有一个专门的团队负责为搜索引擎提供标签,以便用户能够找到这些图像文档。整个过程不仅繁琐、劳动密集,而且容易出错。这促使开始探索更有效的解决方案。
首先搜索了开源的OCR产品,并迅速锁定了TESSERACT。TESSERACT是HP的一个被遗弃的项目,从1985年到1995年一直在开发。后来,它被转移到了开源社区,据了解,现在Google正在对其进行开发。凭借这样的背景,TESSERACT在OCR识别和准确性方面得分非常高。下载并稍微挣扎了一下之后,成功地让TESSERACT工作起来了。挣扎的部分是,它的首页声称其基础输入格式是TIFF文件。也许是TIFF文件有问题,但只能在BMP文件上让它工作。
既然已经有了一个可以将BMP文件转换为文本的OCR,那么如何从图像PDF文件中提取文本呢?经过进一步的搜索,选择了ImageMagick。这是另一个出色的开源工具,可以将任何文件转换为图像。它可以直接将TIFF文件转换为位图,但要将PDF文件转换,需要GhostScript。
安装了该工具后,可以轻松地将任何文件(特别是PDF和TIFF)转换为位图,然后从位图中提取文本。唯一的考虑是如何区别对待包含文本的PDF文件——毕竟,OCR计算密集型,即使在完美的图像质量和分辨率下也容易出错。因此,又进行了一次快速搜索,找到了PDFTOTEXT。感谢开源社区!有了这些工具,可以轻松地从PDF中提取文本。然而,对于纯图像PDF,已经有了解决方案!
接下来,花了15分钟设置了一个批处理脚本来自动化这个过程:
check the file extension
if file is a PDF file
try to extract text out of it
if there is more than certain amount of text in the file - done!
if there is no text, convert first page into bitmap
run OCR on the bitmap
For any other file type, convert file into bitmap
Run OCR on the bitmap
解压附带的项目后,查看bin\OCR.BAT文件。它将在源文件所在的目录中创建一个临时文件,文件名与源文件相同,扩展名为'.txt'。例如:
ocr.bat c:\temp\xyz.pdf
将生成c:\temp\xyz.pdf.txt文件。
现在,有一个简单的批处理过程来从任何图像和/或PDF文件中提取文本。要使其在SharePoint(或任何其他使用Microsoft索引技术的产品)中可用,需要创建一个IFilter组件。这是一个插件,Microsoft索引用于搜索专业文件格式(例如,Office、PDF等)。在这里,有一种正确的方法和一种快速的方法。必须承认罪过——选择了快速的方法。问题是,使用的所有组件都有C/C++ API,要正确地做,应该把所有东西整合在一起,创建一个组件。相反,决定只运行设置的批处理过程。这有点慢,但至少,不必担心不熟悉代码的内存泄漏和页面错误。
Microsoft IFilter模板将为索引服务进行适当的注册,但SharePoint需要额外的条目。在下载中,有一个bin\wss_reg.reg文件将注册与SharePoint相关的条目。然而,建议在尝试注册wss_reg文件之前,备份HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0键——以防万一,知道的。
下载并安装GhostScript:
下载并安装VC++ 2008可再发行包:
ImageMagic转换工具包含在下载中——但可以获取最新版本(如果位置不同,请更新OCR.BAT路径)
PDFTOTEXT包含在下载中——但可以获取最新版本(如果位置不同,请更新OCR.BAT路径)
备份HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0注册表条目
注册bin\OcrFilt.dll和bin\wss_reg.reg
重新启动搜索服务并运行Stsadm -o spsearch -action fullcrawlstart以强制重建SharePoint搜索数据库
使用的是WSS SP2。如果SharePoint版本不同,WSS注册条目可能会有所不同。请检查是否有HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Search\Applications\e5ecafdd-0ed4-42fa-b663-c38046ae5ec8键。如果没有,那么wss-reg.reg文件可能需要更新。
SharePoint在HKLM\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0\Search\Applications\e5ecafdd-0ed4-42fa-b663-c38046ae5ec8\Gather\Search\Extensions\ExtensionList中存储了一个它能够处理的扩展名的编号列表。PDF的条目不应该在那里,它需要用下一个唯一的数字注册。大多数时候,应该是38。请确保编号上升到37。如果有什么不对劲,请检查并更新wss_reg。
安装过滤器后,需要重新索引现有内容或删除/添加文件。在索引完成之前,将无法找到条目。OcrFilt.dll将为它需要索引的每个文件在事件日志中创建条目,所以可以看到进度。不得不重新启动服务,然后使用stsadm。删除并重新添加文件也可以工作。
出于性能原因,只有PDF/TIFF文件的第一页被OCR-ed。如果想要OCR整个文档,还有额外的ImageMagic工具可以在OCR之前将多个图像组合在一起。OCR.BAT将尝试在输入图像所在的文件夹中创建一个文本文件。因此,索引过程应该有适当的权限到该文件夹。由于这是WSS创建临时文件的地方,所以不应该有问题;然而,由于权限问题很难排除,这是需要记住的。
尽管可以OCR任何图像类型,但iFilter只注册PDF和TIFF扩展名。如果想处理其他文件类型,OcrFilt.dll注册部分需要修改。
尽管目前只与SharePoint一起使用它,但这个解决方案还有其他非常有趣的应用:
将iFilter配置为SQL-Server的插件,允许索引存储在BLOB列中的PDF文件。
结构化文档。使用的ImageMagic转换工具有能力提取图像的一部分。很容易改变批处理文件,例如,提取扫描账单中包含名称和日期的部分,以组织计费部门的归档。