首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C#从扫描的PDF文档中提取文本?

如何使用C#从扫描的PDF文档中提取文本?
EN

Stack Overflow用户
提问于 2021-01-05 08:13:24
回答 1查看 1K关注 0票数 0

我正在用C#和.NET开发一个小应用程序来自动化一个目前是手动完成的过程。该应用程序正在寻找PDF文档中的特定模式,并根据该模式将其上传到任何需要的位置。它与PDF没有任何问题,PDF是用数字方式编写的(Word、Nodepad等)。然后转换成PDF格式。

后来我发现,将来使用的文件将是90%的扫描文件。事实证明,这是一个比我预期的更大的问题。我找到了多个第三方库,它们可以处理这个任务-> iText7、LeadTools、ABBYY、WhatsMate PDF到text API、SautinSoft .NET Offce Edition。问题是,他们都有报酬,而我负担不起其中任何一项。

我有一个想法,把PDF转换成任何图像类型(jpg,png,tiff等)并使用Tesseract OCR识别文本。问题是,我找不到一个免费使用的库来转换为图像类型.

关于这个问题,我征求任何意见。是否可以从扫描的PDF中免费提取文本?或者,是否可以将PDF转换成图像类型并免费使用OCR?

谢谢你抽出时间,如果我的问题没有按照正确的方式编排,我很抱歉。

EN

回答 1

Stack Overflow用户

发布于 2022-11-18 10:11:35

免费的解决方案是NicomSoft OCR。你可以在网上找到网站。但是代码的一部分:加载扫描的PDF ->使OCR ->保存结果(Docx或->):

代码语言:javascript
复制
        string pdfFile = pdfPath;
        string outFile = String.Empty;

        f.OpenPdf(pdfFile);
        if (f.PageCount > 0)
        {
            // To Docx.
            outFile = "Result.docx";
            f.WordOptions.Format = PdfFocus.CWordOptions.eWordDocument.Docx;
            if (f.ToWord(outFile) == 0)
                System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(outFile) { UseShellExecute = true });

            // To HTML.
            outFile = "Result.html";
            f.HtmlOptions.KeepCharScaleAndSpacing = false;
            if (f.ToHtml(outFile) == 0)
                System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(outFile) { UseShellExecute = true });
        }
        else
        {
            Console.WriteLine("Error: {0}!", f.Exception.Message);
            Console.ReadLine();
        }
    }
    public static byte[] PerformOCRNicomsoft(byte[] image)
    {
        NSOCRLib.NSOCRClass NsOCR;
        int CfgObj = 0;
        int OcrObj = 0;
        int ImgObj = 0;
        int SvrObj = 0;

        NsOCR = new NSOCRLib.NSOCRClass();
        NsOCR.Engine_SetLicenseKey("AB2A4DD5FF2A"); //required for licensed version only
        NsOCR.Engine_InitializeAdvanced(out CfgObj, out OcrObj, out ImgObj);

        // Scale
        NsOCR.Cfg_SetOption(CfgObj, TNSOCR.BT_DEFAULT, "ImgAlizer/AutoScale", "0");
        NsOCR.Cfg_SetOption(CfgObj, TNSOCR.BT_DEFAULT, "ImgAlizer/ScaleFactor", "4.0");

        NsOCR.Cfg_SetOption(CfgObj, TNSOCR.BT_DEFAULT, "Languages/English", "1");

        try
        {
            int res = 0;


            Array imgArray = null;
            using (MemoryStream ms = new MemoryStream(image))
            {
                ms.Flush();
                imgArray = ms.ToArray();
            }
            res = NsOCR.Img_LoadFromMemory(ImgObj, ref imgArray, imgArray.Length);
            if (res > TNSOCR.ERROR_FIRST)
                return null;

            NsOCR.Svr_Create(CfgObj, TNSOCR.SVR_FORMAT_PDF, out SvrObj);
            NsOCR.Svr_NewDocument(SvrObj);

            res = NsOCR.Img_OCR(ImgObj, TNSOCR.OCRSTEP_FIRST, TNSOCR.OCRSTEP_LAST, TNSOCR.OCRFLAG_NONE);
            if (res > TNSOCR.ERROR_FIRST)
                return null;




            res = NsOCR.Svr_AddPage(SvrObj, ImgObj, TNSOCR.FMT_EXACTCOPY);
            if (res > TNSOCR.ERROR_FIRST) return null;

            Array outPdf = null;
            NsOCR.Svr_SaveToMemory(SvrObj, out outPdf);

            return (byte[])outPdf;
        }
        finally
        {

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

https://stackoverflow.com/questions/65575197

复制
相关文章

相似问题

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