【问题标题】:What other diagnostic methods can I use to solve this particular Perl problem?我可以使用哪些其他诊断方法来解决这个特定的 Perl 问题?
【发布时间】:2010-03-02 05:57:43
【问题描述】:

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

突然,令人讨厌的错误说“使用未初始化的值 $OCRresult 在 E:\OCR-test.pl 第 15 行打印”完全消失了,屏幕上出现了 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

【问题讨论】:

    标签: perl ocr


    【解决方案1】:

    对于初学者,我会尝试转储 $miDoc->{Images} 的值——它存在吗?如果它存在并且它是一个集合,它是否包含任何内容?如果它包含任何东西,它是什么?一个错误?或者可能只是与您期望的结构不同? warnDumper,稍加探索就能大有帮助。

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

    【讨论】:

    • @hobbs,感谢您的提示。实际上我已经完成了“print Dumper ($miDoc->{Images});”。它给了我 $VAR1 = bless( { 'Count' => 1, '_NewEnum' => undef, 'Item' => undef }, 'Win32::OLE' );
    • @hobbs,从我的 MDI 文件测试中,我认为使用 $miDoc->{Images}->Item(0)->{Layout}{Text} 访问 OCRed 结果是可以的。我怀疑 OCR 方法不正确,但我不确定我在哪里做错了。顺便说一句,我正在使用此文档作为参考 (msdn.microsoft.com/en-us/library/aa202819%28office.11%29.aspx)
    • @hobbs,哈哈,看起来事情变得有趣了 :) Create 方法确实有些可疑。我正在取得进展。我会尽快更新帖子。
    猜你喜欢
    • 2021-09-06
    • 2023-02-06
    • 1970-01-01
    • 2021-12-19
    • 2021-01-16
    • 2022-06-23
    • 2013-08-12
    • 1970-01-01
    相关资源
    最近更新 更多