0

我有一个应用程序,我在其中使用 MODI 2007 对几个多页 tiff 文件进行 OCR。我发现,当我在包含几个好的 tiff 以及一些无法在 Windows 图片和传真查看器中打开的 tiff 的目录上启动它时,MODI 也无法 OCR 那些“坏”的 tiff。发生这种情况时,应用程序无法回收 MODI 用于 OCR 那些 tiff 的任何内存。在该工具尝试对太多这些“坏”tiff 进行 OCR 后,机器内存不足,应用程序崩溃。我已经尝试了几个来自网络的代码修复程序,据说可以修复任何 MODI 内存泄漏,但到目前为止,没有一个对我有用。我正在粘贴下面执行 OCRing 的代码部分:

                StringBuilder strRecText = new StringBuilder(10000);

                MODI.Document doc1 = new MODI.Document();

                doc1.Create(name);
                try
                {
                    doc1.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);  // this will ocr all pages of a multi-page tiff file
                }
                catch (Exception e)
                {
                    doc1.Close(false); // clean up
                    if (doc1 != null)
                    {
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                        GC.WaitForPendingFinalizers();


                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc1);
                        doc1 = null;
                    }

                }

                MODI.Images images = doc1.Images;
                for (int imageCounter = 0; imageCounter < images.Count; imageCounter++)
                {
                    if (imageCounter > 0)
                    {
                        if (!noPageBreakFlag)
                        {
                            strRecText.Append((char)pageBreakChar);
                        }
                    }

                    MODI.Image image = (MODI.Image)images[imageCounter];
                    MODI.Layout layout = image.Layout;
                    strRecText.Append(layout.Text);

                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();

                    if (layout != null)
                    {
                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(layout);
                        layout = null;
                    }
                    if (image != null)
                    {
                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(image);
                        image = null;
                    }

                }

                File.AppendAllText(ocrFile, strRecText.ToString());     // write the OCR file out to disk

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

                if (images != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(images);
                    images = null;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

                doc1.Close(false); // clean up
                if (doc1 != null)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc1);
                    doc1 = null;
                }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();
4

1 回答 1

1

在过去的几个月里,我一直在使用 MODI 进行一个项目。MODI 是迄今为止我尝试过的最准确的 OCR 引擎,但它在释放资源和崩溃方面存在一些重大问题。

我最终构建了一个命令行应用程序,它将图像的路径作为命令行参数,然后将生成的文本保存到文件并退出。然后,我通过任何需要 modi 功能的软件使用此命令行应用程序。这听起来像是一个奇怪的解决方案,但它是解决 MODI 的内存泄漏问题的一种非常简单直接的方法,因为当命令行进程存在时,它的内存会被操作系统释放,因此您不必担心应用程序崩溃或资源未清理。我发现启动命令行 exe 然后读取它创建的文件所需的时间与实际 OCR 图像所需的时间相比是微不足道的,因此您实际上并没有在性能方面损失太多。

于 2010-11-12T02:37:02.170 回答