Все данные вымышлены. Кириллица в текстовых PDF использует встроенные шрифты DejaVu. Скрипт: scripts/services-samples/generate-pdf-markdown.py (reportlab, Pillow). 1. text.pdf: 3 страницы. Должны появиться H1 «План учебного проекта», H2 «Подготовка материалов», H3 «Проверка оформления», отдельные абзацы, жирный «Важный вывод» и курсив «Учебное замечание». «доку-» и «менты» склеиваются в «документы». Колонтитул «Учебный проект „Лесная мастерская“» и одиночные номера страниц не должны попасть в результат. 2. table.pdf: текст и таблица 3 колонки × 4 строки, включая заголовок. Проверьте Markdown с разделителем | --- | --- | --- | и всеми значениями. 3. lists.pdf: маркированные •, -, – и нумерованные 1., 2), 3. превращаются в Markdown-списки. После списков — отдельный абзац. 4. scan.pdf: одна страница-картинка, текстового слоя нет. Ожидается сообщение «В файле нет текстового слоя: это скан или картинка. Распознавание сканов не поддерживается». 5. Загрузите text.pdf, table.pdf, lists.pdf, scan.pdf вместе. Должны получиться 3 файла .md и сообщение об ошибке для scan.pdf. ZIP содержит только 3 успешных результата; кириллица в UTF-8. 6. Проверьте «Скопировать», «Скачать .md», «Скачать ZIP», прогресс по страницам, «Отменить» и «Очистить». При отмене поздний ответ не должен возвращать результат. 7. В DevTools Network после загрузки страницы не должно быть отправки PDF или запросов к внешним ресурсам. Проверяйте под CSP /products (без unsafe-eval/wasm-unsafe-eval), в актуальных Chrome/Firefox/Safari. Метрика и внешний виджет должны отсутствовать. 8. Для частичного скана используйте lib/services/client/pdf-markdown/__fixtures__/mixed.pdf: предупреждение о странице 2, текст страниц 1 и 3 сохраняется.