C# PaddleOCRSharp.PDF 增加PDF识别

摘自:https://www.cnblogs.com/raoyutian/p/18927316

传统识别pdf的缺点

在实际项目中,经常会遇到需要从 PDF 文件中提取文本信息的需求。由于 PDF 文档通常包含多种格式和布局,直接使用 OCR 技术对其进行识别并不总是最优的选择。因此,在进行 OCR 之前,通常需要将 PDF 内容转换为图像文件,以便更有效地应用 OCR 算法。

一般步骤是:

  1. 读取 PDF 文件:使用pdf库来读取 PDF 文件的内容。这些库可以解析 PDF 文档,并提取页面内容。

  2. 将 PDF 页面转换为图像:利用 PDF 库,它可以将每一页的 PDF 内容转换为单独的图像文件或直接保存为多页图像文件。

  3. 处理图像质量:转换后的图像可能需要进一步优化。例如,可以通过调整分辨率、对比度等参数来提高 OCR 识别的效果。

  4. 应用 OCR 技术:使用如 PaddleOCR、Tesseract 或其他 OCR 库对转换后的图像进行文字识别。

新方式

PaddleOCRSharp目前增加扩展组件库 PaddleOCRSharp.PDF ,在nuget上安装PaddleOCRSharp包之后再安装PaddleOCRSharp.PDF包即可。

添加依赖

代码

关键代码也就一行。

PaddleOCREngine engine = new PaddleOCREngine();

var result = engine.DetectTextPDF(“PDF文件或者byte数组”);

返回结果是一个对象包含一个Pages属性,Pages属性包含PDF的每一页的OCRResult信息。OCRResult就是PaddleOCRSharp的OCR图片识别结果,包含文本坐标置信度等信息。

public class PDFOCRResult
{
    //
    // 摘要:
    //     PDF识别每页结果集合
    public List<OCRResult> Pages { get; set; } = new List<OCRResult>();

}

PaddleOCRSharp.PDF包含两个重载方法,分别满足传参文件路径和文件流。

/// <summary>
/// PDF识别
/// </summary>
/// <param name="engine">OCR引擎</param>
/// <param name="pdffile">PDF文件</param>
/// <param name="dpi">导出图片的分辨,分辨率越高越清晰,图片像素越大</param>
/// <param name="pageAction">拆分第几页事件回调</param>
/// <returns>PDF识别结果</returns>
public static PDFOCRResult DetectTextPDF(this PaddleOCREngine engine, string pdffile, float dpi = 150, Action<int> pageAction = null)

/// <summary>
 /// PDF识别
 /// </summary>
 /// <param name="engine">OCR引擎</param>
 /// <param name="pdfbytes">PDF文件byte数组</param>
 /// <param name="dpi">导出图片的分辨,分辨率越高越清晰,图片像素越大</param>
 /// <param name="pageAction">拆分第几页事件回调</param>
 /// <returns>PDF识别结果</returns>
 public static PDFOCRResult DetectTextPDF(this PaddleOCREngine engine, byte[] pdfbytes, float dpi = 150, Action<int> pageAction = null)

完整示例代码:

using PaddleOCRSharp;
namespace ConsoleApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string pdf = "input.pdf";
            PaddleOCREngine engine = new PaddleOCREngine();
            DateTime dt1 = DateTime.Now;
            Action<int> action = new Action<int>(page => {
                Console.WriteLine($"正在处理第:{page}页");
            });
            var result = engine.DetectTextPDF(pdf,150, action);
            int pagecount = result.Pages.Count;
            Console.WriteLine($"总页数:{pagecount}");
            DateTime dt2 = DateTime.Now;
            foreach (var page in result.Pages)
            {
                Console.WriteLine(page.Text);
            }
            Console.WriteLine($"总耗时:{(dt2 - dt1).TotalMilliseconds}ms");
            Console.WriteLine($"平均耗时:{(dt2 - dt1).TotalMilliseconds / pagecount}ms");
            Console.ReadLine();
        }
    }
}