3

经过大量实验,我仍然无法使以下脚本正常工作。我需要一些关于如何诊断这个特定 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'); 

我尝试将括号留空或使用三个参数,例如 'miLANG_ENGLISH',1,1 等,但没有任何运气。我还尝试使用 Microsfot Office Document Imaging 来测试我正在试验的 TIF 是否可识别文本并且结果是肯定的。

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

或者碰巧有 Office 2007 的人可以使用包含文本内容的任何 jpg、bmp 或 tif 图片来测试我的代码,看看是否有问题?

提前致谢。

更新

哈哈,我终于弄清楚问题出在哪里以及如何解决了。@hobbs,感谢您留下评论 :) 事情很有趣。当我试图回复您的评论时,我添加了Office Document Imaging 2003 VBA 语言参考的 url 链接,我又看了一眼那里的东西。以下信息引起了我的注意:

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

4

1 回答 1

3

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

顺便说一句,如果您想做“现代”的事情并且不介意从 CPAN 中获取一个漂亮的工具,请尝试Devel::Dwarn——它使转储到 stderr比以前有趣:)

于 2010-03-02T10:45:05.143 回答