我可以使用哪些其他诊断方法来解决这个特定的Perl问题?

时间:2010-03-02 05:57:43

标签: perl ocr

经过大量实验,我仍然无法得到以下脚本。我需要一些关于如何诊断这个特定Perl问题的指导。提前谢谢。

此脚本用于测试Office 2007 OCR API的使用:

use warnings;
use strict;
use Win32::OLE;
use Win32::OLE::Const;

Win32::OLE::Const->Load("Microsoft Office Document Imaging 12\.0 Type Library") 
or 
die "Cannot use the Office 2007 OCR API";
my $miDoc = Win32::OLE->new('MODI.Document') 
or die "Cannot create a MODI object";    
#Loads an existing TIFF file
$miDoc->Create('OCR-test.tif'); 
#Performs OCR with the OCR language set to English
$miDoc->OCR(LangId => 'miLANG_ENGLISH'); 
#Get the OCR result
my $OCRresult = $miDoc->{Images}->Item(0)->{Layout}{Text}; 
print $OCRresult;

我做了一个小测试。我加载了一个包含OCR信息的.MDI文件。我删除了OCR方法行并运行了脚本,我得到了“print $ OCRresult”的预期文本输出。但除此之外,Perl抛出了错误说

Use of uninitialized value $OCRresult in print at E:\OCR-test.pl line 15

我怀疑线路出了问题

$miDoc->OCR(LangId => 'miLANG_ENGLISH'); 

我试着把parens留空或使用三个游行,比如'miLANG_ENGLISH',1,1等但没有运气。 我还尝试使用Microsfot Office Document Imaging来测试我正在试验的TIF是否可以识别文本并且结果是正面的。

那么我还有其他什么诊断方法?

或者碰巧有Office 2007的人可以使用任何带有文本内容的jpg,bmp或tif图片测试我的代码并查看是否有错误?

提前致谢。

更新

哈哈,我终于找到问题所在,以及如何解决问题。 @hobbs,谢谢你留下评论:)事情很有意思。当我试图回复你的评论时,我添加了Office Document Imaging 2003 VBA Language Reference网址的链接,我又看了一下那些东西。以下信息引起了我的注意:

LangId can be one of the following MiLANGUAGES constants.
miLANG_CHINESE_SIMPLIFIED (2052, &H804)

我更改了以下OCR方法行:

$miDoc->OCR('miLANG_ENGLISH',1,1);

到此:

$miDoc->OCR(2052,1,1); 

一些注意事项: 1.我在Windows XP上运行ActivePerl 5.10.0(中文版) 2.在此之前,我已经尝试了$ miDoc->(9)但没有运气

然而,突然而且神奇地说,“在E:\ OCR-test.pl第15行打印时使用未初始化的值$ OCRresult”这个讨厌的错误完全消失了,屏幕上出现了OCRed文本。 OCR结果不令人满意,但参数“2052”指的是中文,TIF图像包含所有英文。所以我将参数更改为 $ miDoc-> OCR(9,1,1),但这次没有运气。 Windows把这个错误告诉了我:

unknown software exception (0x0000000d)

我将TIF图像更改为包含所有中文字符的图像,并将参数更改为“$ miDoc-> OCR(2052,1,1);”再次,这一次一切都像预期的那样工作。 OCR的结果令人满意。

现在我认为我的Office 2007 OCR API有些奇怪,如果碰巧运行Windows XP(英文版)并安装了Office 2007的人可能不会遇到参数

的异常错误
$miDoc->OCR(9,1,1); 

无论如何,我真的很高兴我终于搞定了事情:D

1 个答案:

答案 0 :(得分:3)

对于初学者,我会尝试转储$miDoc->{Images}的值 - 是否存在?如果它存在并且它是一个集合它包含什么?如果它包含任何东西,它是什么?一个错误?或者可能只是一个与你期望的结构不同的结构? warnDumper和一点点探索可以有很长的路要走。

顺便提一下,如果你想做“现代”的事情,并且不介意从CPAN中抓取一个漂亮的工具,试试Devel::Dwarn - 它甚至会使更多向stderr倾销比以前更有趣:)