✖

Распознавание таблиц на изображении документа в .NET приложении

Категория: Imaging; .NET

1 октября 2026

Часто документ содержит табличные данные. Табличные данные - это информация, организованная в виде таблицы со строками и столбцами.

Если все ячейки в таблице ограничены линиями, то считается, что таблица имеет бордюр. Если же большинство ячеек в таблице не ограничены линиями, то это таблица без бордюра.

Распознавание таблиц с бордюром на изображении документа можно реализовать алгоритмически, потому что задача сводится к распознаванию линий на изображении документа и поиску линий, которые определяют таблицы на документе.

Распознавание таблиц без бордюра на изображении документа является более сложной задачей, потому что для решения задачи нужно найти блоки информации на изображении и понять, что блоки информации представлены в виде табличных данных. Сейчас данная задача обычно решается с помощью применения искусственного интеллекта.


В VintaSoft Imaging .NET SDK 15.2 реализовано распознавание таблиц с бордюрами, то есть создан алгоритм, который позволяет найти границы таблицы, строк таблицы, ячеек таблицы на изображении документа. Алгоритм предоставляет хороший результат, если изображение документа имеет хорошее качество, то есть разрешение изображения равно 300 dpi или выше.


Также SDK позволяет воспользоваться результатами распознавания таблиц для практических целей:


Вот C# код, который демонстрирует как преобразовать растровое изображение в документ DOCX (с распознаванием текста и обнаружением таблиц):
using Vintasoft.Imaging;
using Vintasoft.Imaging.ImageProcessing.Document;
using Vintasoft.Imaging.ImageProcessing.Info.TableDetection;
using Vintasoft.Imaging.Ocr;
using Vintasoft.Imaging.Ocr.Results;
using Vintasoft.Imaging.Ocr.Tesseract;
using Vintasoft.Imaging.Pdf;
using Vintasoft.Imaging.Pdf.Ocr;
using Vintasoft.Imaging.Pdf.Office;

class ConvertRasterImagesToDocxDocumentExample
{
    // Required assemblies to run this code:
    // Vintasoft.Shared.dll, Vintasoft.Imaging.dll,
    // Vintasoft.Imaging.DocCleanup.dll,
    // Vintasoft.Imaging.Office.OpenXml.dll,
    // Vintasoft.Imaging.Ocr.dll, Vintasoft.Imaging.Ocr.Tesseract.dll,
    // Vintasoft.Imaging.Pdf.dll, Vintasoft.Imaging.Pdf.Office.dll, Vintasoft.Imaging.Pdf.Ocr.dll

    /// <summary>
    /// Converts a raster image file to a DOCX document (with OCR and table detection).
    /// </summary>
    /// <param name="ocrLanguage">An OCR language.</param>
    /// <param name="imageFilename">A filename of source raster image (TIFF, PNG, ...) file.</param>
    /// <param name="docxFilename">A filename of destination DOCX file.</param>
    public static void ConvertRasterImagesToDocxDocument(
        OcrLanguage ocrLanguage, string imageFilename, string docxFilename)
    {
        // create an image collection
        using (ImageCollection images = new ImageCollection())
        {
            // add images from image file into image collection
            images.Add(imageFilename);

            // create a searchable PDF document
            using (PdfDocument document = new PdfDocument())
            {
                // create a PDF document builder
                PdfDocumentBuilder documentBuilder = new PdfDocumentBuilder(document);

                // specify that text must be placed over image
                documentBuilder.PageCreationMode = PdfPageCreationMode.TextOverImage;

                // create the Tesseract OCR engine
                using (TesseractOcr tesseractOcr = new TesseractOcr(@".\TesseractOCR"))
                {
                    // create OCR settings
                    OcrEngineSettings ocrSettings = new OcrEngineSettings(ocrLanguage);

                    // create the OCR engine manager
                    OcrEngineManager engineManager = new OcrEngineManager(tesseractOcr);

                    // OCR Preprocessing:
                    // AutoInvert, HalftoneRemoval, BorderClear, Deskew, HolePunchRemoval,
                    // Despeckle, AutoTextOrientation, Segmentation, TableWithBordersDetection
                    OcrPreprocessingCommand ocrPreprocessing = new OcrPreprocessingCommand();
                    // disable binarization
                    ocrPreprocessing.Binarization = null;

                    // for each image in image collection
                    foreach (VintasoftImage image in images)
                    {
                        // execute preprocessing
                        ocrPreprocessing.ExecuteInPlace(image);

                        // recognize text on image
                        OcrPage page = engineManager.Recognize(image, ocrSettings, ocrPreprocessing.DetectedRegions);

                        // add recognized OCR page to the PDF document
                        documentBuilder.AddPage(image, page);
                    }

                    // shutdown OCR engine
                    tesseractOcr.Shutdown();

                    // clear and dispose images in image collection
                    images.ClearAndDisposeItems();

                    // create converter that allows to convert PDF document to a DOCX document
                    using (PdfToDocxConverter converter = new PdfToDocxConverter())
                    {
                        // set the destination DOCX file
                        converter.OutputFilename = docxFilename;

                        // set converter settings
                        converter.ConvertGraphics = true;
                        converter.DetectHeaderFooter = true;

                        // enable table detection
                        converter.DetectTables = true;
                        converter.TableDetectionCommand = new TableWithBordersDetectionCommand();

                        // convert searchable PDF document to a DOCX document
                        converter.Execute(document);
                    }
                }
            }
        }
    }
}