/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Infrastructure/Pdf/PdfTextExtractor.cs
94 строки
3 KB
IBS\NAfanasev
DocumentContext local functional
01 июл 2026, 15:30
01 июл 2026, 15:30
b4038c9
Код
Авторство
О чём код?
using PdfEncoder.Application.Abstractions; using PdfEncoder.Domain.Models; using UglyToad.PdfPig; using UglyToad.PdfPig.AcroForms; using UglyToad.PdfPig.Content; using UglyToad.PdfPig.DocumentLayoutAnalysis.WordExtractor; namespace PdfEncoder.Infrastructure.Pdf; /// <summary> /// Извлечение text layer и AcroForm через PdfPig. /// </summary> public sealed class PdfTextExtractor : IPdfTextExtractor { /// <inheritdoc /> public Task<PdfTextExtractionResult> ExtractAsync( ReadOnlyMemory<byte> content, IReadOnlyList<int> pageNumbers, CancellationToken ct) { ct.ThrowIfCancellationRequested(); using var document = PdfDocument.Open(content); var textBlocks = new List<TextBlock>(); var tables = new List<ExtractedTable>(); var formFields = ExtractFormFields(document); foreach (var pageNumber in pageNumbers) { ct.ThrowIfCancellationRequested(); if (pageNumber < 1 || pageNumber > document.NumberOfPages) { continue; } var page = document.GetPage(pageNumber); textBlocks.AddRange(ExtractTextBlocks(page, pageNumber)); tables.AddRange(TableHeuristicExtractor.ExtractTables(page, pageNumber)); } return Task.FromResult(new PdfTextExtractionResult { TextBlocks = textBlocks, Tables = tables, FormFields = formFields }); } private static IReadOnlyList<TextBlock> ExtractTextBlocks( Page page, int pageNumber) { var blocks = new List<TextBlock>(); foreach (var word in page.GetWords(NearestNeighbourWordExtractor.Instance)) { var bbox = word.BoundingBox; blocks.Add(new TextBlock { PageNumber = pageNumber, Text = word.Text, BoundingBox = new BoundingBox { X = bbox.Left, Y = bbox.Bottom, Width = bbox.Width, Height = bbox.Height }, Confidence = 1.0 }); } return blocks; } private static IReadOnlyList<FormField> ExtractFormFields(PdfDocument document) { if (!document.TryGetForm(out var form) || form is null) { return []; } return form.Fields .Select(field => { var fieldValue = field.GetFieldValue(); return new FormField { Name = fieldValue.Key ?? field.Information.PartialName ?? field.ToString(), Value = fieldValue.Value }; }) .ToList(); } }