Извлечение данных из таблицы в PDF с помощью C#

Извлечение таблиц из PDF программным способом

Извлечение таблиц из PDF — нетривиальная задача, поскольку таблицы могут быть созданы различными способами.

У Aspose.PDF for .NET есть инструмент, который упрощает извлечение табличных данных. Чтобы извлечь данные таблицы, выполните следующие действия:

  1. Откройте документ — создайте экземпляр объекта Document.
  2. Создайте объект TableAbsorber.
  3. Решите, какие страницы нужно проанализировать, и примените Visit к нужным страницам. Табличные данные будут отсканированы, а результат будет сохранён в TableList.
  4. TableList — это список AbsorbedTable. Чтобы получить данные, переберите TableList и обработайте RowList и CellList.
  5. Каждый AbsorbedCell содержит коллекцию TextFragments. Вы можете обработать её для своих целей.

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Приведённый ниже пример показывает извлечение таблицы со всех страниц:

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractTable()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_Tables();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
    {                    
        foreach (var page in document.Pages)
        {
            Aspose.Pdf.TableAbsorber absorber = new Aspose.Pdf.TableAbsorber();
            absorber.Visit(page);
            foreach (var table in absorber.TableList)
            {
                Console.WriteLine("Table");
                foreach (var row in table.RowList)
                {
                    foreach (var cell in row.CellList)
                    {                                 
                        foreach (var fragment in cell.TextFragments)
                        {
                            var sb = new StringBuilder();
                            foreach (var seg in fragment.Segments)
                            {
                                sb.Append(seg.Text);
                            }
                            Console.Write($"{sb.ToString()}|");
                        }                           
                    }
                    Console.WriteLine();
                }
            }
        }
    }
}

Извлечение таблицы в определённой области страницы PDF

Каждая поглощённая таблица имеет свойство Rectangle, которое описывает положение таблицы на странице.

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

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

В приведённом ниже примере показано, как извлечь таблицу, отмеченную квадратной аннотацией:

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractMarkedTable()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_Tables();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
    { 
        var page = document.Pages[1];
        var squareAnnotation =
            page.Annotations.FirstOrDefault(ann => ann.AnnotationType == Annotations.AnnotationType.Square)
            as Aspose.Pdf.Annotations.SquareAnnotation;


        var absorber = new Aspose.Pdf.Text.TableAbsorber();
        absorber.Visit(page);

        foreach (var table in absorber.TableList)
        {
            var isInRegion = (squareAnnotation.Rect.LLX < table.Rectangle.LLX) &&
            (squareAnnotation.Rect.LLY < table.Rectangle.LLY) &&
            (squareAnnotation.Rect.URX > table.Rectangle.URX) &&
            (squareAnnotation.Rect.URY > table.Rectangle.URY);

            if (isInRegion)
            {
                foreach (var row in table.RowList)
                {
                    foreach (var cell in row.CellList)
                    {
                        foreach (var fragment in cell.TextFragments)
                        {
                            var sb = new StringBuilder();
                            foreach (var seg in fragment.Segments)
                            {
                                sb.Append(seg.Text);
                            }
                            var text = sb.ToString();
                            Console.Write($"{text}|");
                        }
                    }
                    Console.WriteLine();
                }
            }
        }
    }
}

Извлечение табличных данных из PDF и сохранение их в CSV-файл

В следующем примере показано, как извлечь таблицу и сохранить её в виде CSV-файла. Чтобы узнать, как преобразовать PDF в электронную таблицу Excel, обратитесь к статье Преобразование PDF в Excel.

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractTableSaveExcel()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_Tables();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
    {
        // Instantiate ExcelSave Option object
        Aspose.Pdf.ExcelSaveOptions excelSave = new Aspose.Pdf.ExcelSaveOptions { Format = ExcelSaveOptions.ExcelFormat.CSV };

        // Save the output in XLS format
        document.Save(dataDir + "ExtractTableSaveXLS_out.xlsx", excelSave);
    }
}