首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# tesseract仅扫描第一个.tiff页面

C# tesseract仅扫描第一个.tiff页面
EN

Stack Overflow用户
提问于 2021-12-13 14:48:51
回答 1查看 181关注 0票数 0

我目前正在尝试OCR一些.tiff文件。显然,“Tesseract”只扫描每个文件的第一页。我一直在搜索Google的提示,但这并没有多大帮助。这段代码应该从每个.tiff文件中获取全文:

代码语言:javascript
复制
public async Task<List<string>> ScannFile(string file)
{
    if (Path.GetFileName(file).EndsWith(".pdf"))
    {
        MessageBox.Show("Sie können nur .tiff Dokumente einscannen!");
        return null;
    }
    else
    {
        List<string> PageContent = new();
        await Task.Run(new Action(() =>
        {
            using (var engine = new TesseractEngine(@"C:\Users\f.rigo\source\repos\FinalScanner\FinalScanner\bin\Debug\net5.0-windows/tessdata", "deu", EngineMode.TesseractOnly))
            {
                using (var img = Pix.LoadFromFile(file))
                {
                    //img.Scale((float)scann_dpi / 2, (float)scann_dpi / 2);
                    using (var page = engine.Process(img))
                    {
                        var text = page.GetText();
                        PageContent = cleanOCROutput(text);
                    }
                }
            }
        }));
        return PageContent;
    }
}

我试图通过使用for-each循环来获得完整的文件,但不幸的是,"img“不包含任何可枚举的内容。顺便说一句,我正在使用Tesseract库。查尔斯·韦尔德。

你对我如何扫描第二页和更高版本的.tiff文件有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-20 22:18:55

下面的代码展示了如何使用NuGet包特塞尔从多页.tiff文件中提取文本。

以下内容已经使用Tesseract (v4.1.1)进行了测试,并从OP和这里中进行了调整。

使用语句添加以下内容

代码语言:javascript
复制
using Tesseract;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;

注意事项:在下面的代码中,假定tessdata文件夹(以及相关的文件/子文件夹)与可执行文件位于同一个目录中。

代码语言:javascript
复制
public async Task<List<string>> ScannFile(string filename)
{
    if (Path.GetFileName(filename).EndsWith(".pdf"))
    {
        MessageBox.Show("Sie können nur .tiff Dokumente einscannen!");
        return null;
    }
    else
    {
        List<string> PageContent = new List<string>();

        await Task.Run(new Action(() =>
        {
            using (Image tiffImg = Image.FromFile(filename))
            {
                //create new instance
                using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
                {
                    //get total pages
                    int pageCount = tiffImg.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);

                    for (int i = 0; i < pageCount; i++)
                    {
                        Debug.WriteLine(String.Format("---Page {0}---", i + 1));

                        //select active frame
                        tiffImg.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);

                        byte[] imageBytes = null;
                        using (MemoryStream ms = new MemoryStream())
                        {
                            //save to MemoryStream
                            tiffImg.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff);

                            //copy to byte[]
                            imageBytes = ms.ToArray();
                        }

                        //load image 
                        using (var img = Pix.LoadTiffFromMemory(imageBytes))
                        {
                            using (var page = engine.Process(img))
                            {
                                //get text
                                string imageText = page.GetText();
                                Debug.WriteLine("imageText: " + imageText);

                                //add
                                PageContent.Add(imageText);
                            }
                        }
                    }
                }
            }
        }));

        return PageContent;
    }
}

资源

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70336508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档