Концепт языка PdfQL

Язык программирования, предназначенный для извлечения частей PDF-документа.

Теги

PdfQLPdf

Ключевые особенности

ЯзыкC#
Фреймворк.NET 9
Тип проектаБиблиотека
СтатусКонцепция
ЛицензияAGPL-3.0
Nugetпоследняя версия
Загрузкипоследняя версия
GithubLaraue.PdfQL
ПриложениеPdf Extractor

О документах и их обработке

В современном мире миллиарды документов хранятся в цифровом формате. Среди популярных форматов можно выделить PDF, XML, DOC, DOCX и другие. Каждый формат имеет свою структуру, и для просмотра и обработки требуется различное программное обеспечение.

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

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

Как может быть реализован язык запросов к документам

Я представляю каждый документ как объект с различными атрибутами. Например, каждый документ может состоять из текстовых строк. Я предполагаю, что даже такие форматы, как MP3 и PNG, могут иметь строковое представление. Для MP3 это потребовало бы распознавания текста песни; для PNG — распознавания того, что изображено на картинке. В обоих случаях объект будет иметь свое собственное строковое представление, что означает возможность его индексации.

О PDF-документах

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

Но без этой кодировки, как можно представить структуру PDF? Я вижу это примерно так:

- Изображение (ширина: int, высота: int, размер: int)
- Таблица (строки: Row[], ячейки: Cell[], слова: Word[])
- Абзац (слова: Word[])
- Изображение (ширина: int, высота: int, размер: int)
- Форма (элементы: FormItem[])

Можно предположить, что документ — это просто последовательность элементов. Тогда любой документ можно декомпозировать в подобную последовательность. Затем пользователи могут запрашивать эти элементы, причем не важен будет их источник.

Видение библиотеки

Pdf Query Language (PdfQL) — это первая попытка представить документ как последовательность объектов документа. Доступ к этим объектам должен быть разделен на две части:

  • DocumentObjectsExtractor: Модуль, который преобразует байты PDF в последовательность объектов документа.
  • DocumentObjectsQueryModule: Модуль, который позволяет писать запросы к последовательности объектов.

По сути, PdfQL — это язык, который принимает пользовательский запрос с определенным синтаксисом и PDF-файл, возвращая соответствующий объект(ы).

Видение приложения

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

Синтаксис PdfQL

В случае успеха эксперимента синтаксис на самом деле будет называться DocQL. При разработке синтаксиса первой мыслью было сделать что-то похожее на SQL. Однако SQL лучше всего подходит для работы с реляционными объектами. Документы редко соединяются (join), и основное действие обычно заключается в извлечении содержимого в предпочтительном формате с применением фильтров. Это звучит похоже на stages в MongoDB.

Пример синтаксиса PdfQL для задачи выбери первую строку из таблиц документа, в которых четвертая ячейка содержит текст 'Текст':

select(tables)
    ->filter((item) => item.GetCell(4).Text() == 'Name')
    ->selectMany(tableRows)
    ->map((item) => item.GetCell(1))

Возможности

Актуальный список запланированных и реализованных функций

Реализовано

  • Язык PdfQL: Определены базовые правила языка.
  • Поддержка таблиц: Добавлены возможность запросов к таблицам и их элементам с условиями.

Планы

  • Рефакторинг: Для поддержки концепции, что объекты документа не ограничиваются только PDF.
  • Поддержка обычного текста: Возможность запросов select(textRows), select(words), select(sentences) и т.д.
  • Поддержка изображений: Возврат изображений, соответствующих условиям, и применение функций, таких как resize(600, 400).
  • Расширение кастомизации: Возможность использования пользовательских функций для применения к объектам документа.

Планируемые сроки

  • Апрель 2025: Идея реализации языка для PDF.
  • Май 2025: Изучение создания интерпретаторов.
  • Июль 2025: Базовая версия для извлечения таблиц из PDF.
  • Август 2025: Демо-приложение для блога.