![](https://habrastorage.org/getpro/habr/upload_files/1c5/534/3f4/1c55343f4838da40920a83800b123b6c.png)
PDF (Portable Document Format) - это формат файлов, который широко используется для обмена и хранения электронных документов. Его популярность привела к тому, что многие важные данные хранятся в PDF-файлах в виде таблиц. Однако когда нам нужно использовать эти данные для дальнейшего анализа, обработки или импорта в другие системы, ручное извлечение табличных данных из PDF становится громоздким и сопряжено с ошибками. Поэтому автоматизация извлечения табличных данных из PDF-файлов стала важным требованием.
Для достижения этой цели я попробовал использовать распространенные библиотеки с открытым исходным кодом, такие как iTextSharp и PdfSharp. Учебники, которые я нашел в интернете для этого, были несколько летней давности и не очень эффективны в использовании, часть кода даже не работала. Наконец, я обнаружил, что использование Free Spire.Office for .NET для извлечения данных из таблиц является более удобным и точным. В этой статье я поделюсь двумя фрагментами кода C#, которые позволят извлечь табличные данные из PDF и сохранить их в TXT-файл и Excel-файл соответственно.
Извлечение таблиц с определенной страницы и сохранение в текстовый файл на C#
Извлечение таблиц с определенной страницы и сохранение в файл Excel на C#
Установка Free Spire.Office с помощью NuGet
Вы можете установить пакет FreeSpire.Office, выполнив поиск и установку через "Tool" -> "NuGet Package Manager" -> "Manage NuGet Packages for Solution", или установить его с помощью следующей команды NuGet:
PM> Install-Package FreeSpire.Office
Извлечение таблиц с определенной страницы и сохранение в текстовый файл на C#
Нижеприведенный код получает таблицу с указанной страницы PDF, затем записывает данные таблицы в StringBuilder с сохранением стиля форматирования данных. Наконец, данные из StringBuilder записываются в TXT-документ.
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;
namespace ExtractTablesFromPage
{
class Program
{
static void Main(string[] args)
{
// Создать объект PdfDocument
PdfDocument doc = new PdfDocument();
// Загрузить образец PDF-файла
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\table.pdf");
// Создать объект StringBuilder
StringBuilder builder = new StringBuilder();
// Инициализировать экземпляр класса PdfTableExtractor
PdfTableExtractor extractor = new PdfTableExtractor(doc);
// Объявить массив PdfTable
PdfTable[] tableList = null;
// Извлечь таблицы с определенной страницы
tableList = extractor.ExtractTable(0);
// Определить, является ли список таблиц пустым
if (tableList != null && tableList.Length > 0)
{
// Перебрать таблицы в списке
foreach (PdfTable table in tableList)
{
// Получить количество строк и столбцов в определенной таблице
int row = table.GetRowCount();
int column = table.GetColumnCount();
// Перебрать строки и столбцы
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// Получить текст из определенной ячейки
string text = table.GetText(i, j);
// Добавить текст в StringBuilder
builder.Append(text + " ");
}
builder.Append("\r\n");
}
}
}
// Записать в файл .txt
File.WriteAllText("Table.txt", builder.ToString());
}
}
}
Извлечение таблиц с определенной страницы и сохранение в файл Excel на C#
Нижеприведенный код получает все таблицы с указанной страницы PDF, затем каждую таблицу записывает в отдельный лист Excel, и в конце сохраняет документ Excel по указанному пути.
using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;
namespace ExtractTablesToExcel
{
class Program
{
static void Main(string[] args)
{
// Создать объект PdfDocument
PdfDocument doc = new PdfDocument();
// Загрузить образец PDF-файла
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\table.pdf");
// Создать объект Workbook
Workbook workbook = new Workbook();
// Очистить рабочие листы по умолчанию
workbook.Worksheets.Clear();
// Инициализировать экземпляр класса PdfTableExtractor
PdfTableExtractor extractor = new PdfTableExtractor(doc);
// Объявить массив PdfTable
PdfTable[] tableList = null;
// Извлечь таблицы с определенной страницы
tableList = extractor.ExtractTable(0);
int sheetNumber = 1;
// Определить, является ли список таблиц пустым
if (tableList != null && tableList.Length > 0)
{
// Перебрать таблицы в списке
foreach (PdfTable table in tableList)
{
// Добавить рабочий лист
Worksheet sheet = workbook.Worksheets.Add(String.Format("sheet{0}", sheetNumber));
// Получить количество строк и столбцов в определенной таблице
int row = table.GetRowCount();
int column = table.GetColumnCount();
// Перебрать строки и столбцы
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// Получить текст из определенной ячейки
string text = table.GetText(i, j);
// Напишите текст в определенной ячейке
sheet.Range[i+1,j+1].Value = text;
}
}
sheetNumber++;
}
}
// Сохраните рабочую книгу в файл Excel
workbook.SaveToFile("ToExcel.xlsx", ExcelVersion.Version2013);
}
}
}