Что делает пример кода и зачем он вам нужен
В статье разложим по полочкам два небольших скрипта на Python, которые генерируют тестовый PDF‑документ — с векторными элементами, таблицей и встроенным растровым изображением. Такие файлы часто используют в проекте по извлечению текста и структуры из PDF. Если вы уже пробовали парсить документы, знаете, как сложно отладить алгоритм без «идеального» теста, то этот генератор будет полезным.
Как работает create_demo_image
Функция создает простое изображение 320×180 px, рисует:
- прямоугольник,
- эллипс,
- линию,
- текст «Embedded bitmap image».
Все элементы рисуются библиотекой Pillow. После создания файл сохраняется в путь, указанный в переменной DEMO_IMAGE_PATH. Этот PNG потом будет встроен в PDF‑страницу, позволяя проверить, умеет ли ваш парсер работать с bitmap‑ресурсами.
Как генерируется PDF в build_pdf
Для построения PDF используется ReportLab. Основные шаги:
- Создаём
canvas.Canvasс форматом A4. - Пишем заголовки и абзацы разного размера шрифтов.
- Рисуем два столбца текста, чтобы проверить, умеет ли парсер различать колонки.
- Добавляем векторные фигуры (прямоугольники, круг, линия) — они помогут понять, правильно ли ваш движок извлекает path‑данные.
- С помощью
Tableформируем простую «таблицу‑псевдо», где каждая ячейка имеет координаты. Это удобно для тестов, где нужен вывод cell‑level информации. - На второй странице вставляем ранее созданный bitmap‑рисунок, несколько блоков текста и обводку — всё это позволяет проверить, сохраняются ли координаты при разных типах контента.
- В конце вызываем
c.save(), получая готовый файлPDF_PATH.
Зачем нужен такой PDF в работе парсера
Большинство решений (например, pdf2data, unstructured) опираются на два источника информации:
- Текст + координаты — позволяют восстанавливать порядок чтения, группировать слова в строки и блоки.
- Векторные и растровые ресурсы — важны для извлечения схем, диаграмм и построения визуального представления документа.
Тестовый PDF, созданный этим скриптом, покрывает все вышеперечисленные случаи, поэтому его удобно включать в юнит‑тесты и в pipeline CI.
Как быстро запустить генерацию
Скопируйте код в файл demo_pdf.py, установите зависимости и выполните:
pip install pillow reportlab- Определите переменные
DEMO_IMAGE_PATHиPDF_PATH(например,Path("demo.png")иPath("demo.pdf")). - Запустите
python demo_pdf.py.
После выполнения получите два файла: demo.png и demo.pdf. Откройте PDF в любой программе‑читалке — увидите всё, что описано выше.
Что проверять после генерации
- Наличие текста с корректными координатами (обычно в
bbox‑полях). - Корректный разбор колонок: левый и правый блоки должны сохранять свои
x— иy-границы. - Экспорт векторных элементов: проверьте, что
path‑команды (move, line, curve) попали в структуру. - Встроенное изображение: убедитесь, что парсер возвращает метаданные о bitmap‑ресурсе (тип, размер, позиция).
- Таблица: каждую ячейку нужно видеть как отдельный объект с координатами и текстом.
Где искать «первоисточники»
Для более глубокого погружения обратитесь к официальной документации:
- Pillow — работа с изображениями
- ReportLab User Guide
- Исходники на GitHub: Pillow, ReportLab
Краткий чек‑лист для интеграции в ваш pipeline
- Автоматически генерировать PDF перед запуском тестов.
- Запускать ваш парсер и сохранять результат в JSON/YAML.
- Сравнивать полученные координаты и типы объектов с ожидаемыми (можно использовать
pytest‑approx). - Логировать любые отклонения и фиксировать их в баг‑трэкинге.
С этим «тестовым полигоном» вы сможете быстрее отлаживать извлечение структуры и уверенно выпускать новые версии своего PDF‑парсера.




















