PDF Sandbox и каталог /mnt/data: как устроена изолированная обработка PDF-файлов

Ошибка вида «file not found: /mnt/data/document.pdf» при обработке PDF в изолированной среде почти всегда означает одно: файл либо не был загружен в песочницу, либо скрипт обращается к нему по пути, которого внутри контейнера не существует. Каталог /mnt/data — это типовая точка монтирования пользовательских файлов в sandbox-окружениях: облачных блокнотах, контейнерах Docker, средах выполнения кода у ИИ-ассистентов и CI-системах.

Разберёмся, как устроена изолированная обработка PDF, почему именно /mnt/data стал стандартным расположением для загружаемых документов и что проверить, если скрипт не видит файл или падает с ошибкой доступа. Материал ориентирован на тех, кто запускает Python-скрипты для чтения, слияния или конвертации PDF внутри песочницы — будь то облачный ноутбук или локальный контейнер.

Что такое sandbox при работе с PDF

Песочница (sandbox) — это изолированная среда выполнения, в которой код работает с ограниченными правами: без доступа к основной файловой системе, сети или системным ресурсам хоста. Для PDF это особенно актуально, потому что формат исторически содержит активные элементы — JavaScript, встроенные шрифты, внешние ссылки, — и открытие недоверенного документа без изоляции считается риском.

На практике изоляция реализуется двумя разными способами. Первый — песочница просмотрщика: современные читалки PDF рендерят документ в процессе с пониженными привилегиями. Второй — контейнерная изоляция: скрипт обработки запускается в отдельном контейнере, куда файлы подкладываются через монтируемый том. Именно во втором сценарии и появляется путь /mnt/data.

Почему используется каталог /mnt/data

В Linux-системах каталог /mnt по соглашению предназначен для временно монтируемых файловых систем. Когда платформа запускает ваш код в контейнере, она подключает том с пользовательскими файлами именно туда — отсюда и путь /mnt/data. Сам контейнер при этом может быть полностью одноразовым: после завершения сессии всё, кроме смонтированного тома, удаляется.

Из этого следуют два практических вывода. Во-первых, всё, что скрипт сохранил вне /mnt/data (например, в /tmp или домашнем каталоге), с высокой вероятностью пропадёт после завершения сессии. Во-вторых, относительные пути вида document.pdf сработают только если рабочий каталог процесса совпадает с точкой монтирования — надёжнее указывать абсолютный путь.

from pathlib import Path

DATA_DIR = Path("/mnt/data")

pdf_path = DATA_DIR / "document.pdf"

if not pdf_path.exists():

raise FileNotFoundError(f"Файл не найден: {pdf_path}")

Типичные ошибки и их причины

Большинство проблем при работе с PDF в песочнице сводится к четырём сценариям. Их удобно проверять по порядку, от самого частого к редкому.

  • 📄 FileNotFoundError — файл не загружен в среду или имя отличается: пробелы, кириллица и регистр букв внутри контейнера имеют значение;
  • 🔒 PermissionError — том смонтирован в режиме «только чтение», поэтому запись результата в /mnt/data невозможна;
  • 🧩 ModuleNotFoundError — библиотека для работы с PDF (например, pypdf или PyMuPDF) не установлена в образе песочницы;
  • 💾 MemoryError — контейнеру выделено мало памяти, а PDF содержит тяжёлые изображения или тысячи страниц.
⚠️ Внимание: если песочница монтирует каталог в режиме read-only, не пытайтесь обходить ограничение сменой прав через chmod — это либо не сработает, либо нарушит политику платформы. Сохраняйте результат в разрешённый каталог или скачивайте его через предусмотренный интерфейс.

Как правильно загрузить и прочитать PDF

Порядок действий зависит от платформы, но общая логика одинакова. Сначала файл нужно передать в среду — кнопкой загрузки в интерфейсе, через API или монтированием тома при запуске контейнера. Затем убедитесь, что он действительно появился в /mnt/data, и только после этого запускайте обработку.

☑️ Проверка перед обработкой PDF в песочнице

Выполнено: 0 / 5

Для локального запуска в Docker монтирование выглядит примерно так — флаг -v связывает папку на хосте с каталогом внутри контейнера:

docker run --rm -v $(pwd)/files:/mnt/data my-pdf-tool

Обратите внимание: конкретный синтаксис зависит от вашей ОС и версии Docker. В Windows-путях и в старых версиях инструментария команда может отличаться — сверяйтесь с официальной документацией Docker для вашей платформы.

📊 Где вы чаще всего обрабатываете PDF в изолированной среде?
Облачные ноутбуки (Jupyter, Colab)
ИИ-ассистенты с выполнением кода
Локальный Docker-контейнер
CI/CD-пайплайны

Чтение и сохранение результата

После того как файл найден, обработка идёт обычными средствами выбранной библиотеки. Ниже — минимальный пример извлечения текста и сохранения результата рядом с исходником, чтобы файл можно было забрать из среды.

from pypdf import PdfReader

reader = PdfReader("/mnt/data/document.pdf")

text = "\n".join(page.extract_text() or "" for page in reader.pages)

with open("/mnt/data/result.txt", "w", encoding="utf-8") as f:

f.write(text)

Ключевой момент: результат нужно сохранять именно в /mnt/data, а не во временные каталоги — только смонтированный том переживает завершение сессии. Если после выполнения скрипта файл результата не появился в интерфейсе скачивания, первым делом проверьте, куда именно он был записан.

Почему extract_text() иногда возвращает пустую строку

Это обычно означает, что PDF — скан без текстового слоя: страницы хранятся как изображения. Извлечь текст из них можно только через OCR (например, связкой конвертации страниц в картинки и движка распознавания). Проверить тип документа просто: если при выделении текста в просмотрщике ничего не выделяется — перед вами скан.

Сравнение сред выполнения

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

СредаКуда попадают файлыСохранность после сессии
Облачные ноутбукиРабочий каталог или /mnt/dataЗависит от тарифа и настроек
ИИ-ассистенты с кодом/mnt/dataТолько в рамках сессии
Docker-контейнерСмонтированный томСохраняется на хосте
CI/CD-пайплайнРабочая директория сборкиАртефакты при явной настройке
⚠️ Внимание: не загружайте в сторонние облачные песочницы PDF с персональными данными, коммерческой тайной или медицинской информацией, если не уверены в политике обработки данных платформы. Для конфиденциальных документов безопаснее локальный контейнер.

Безопасность при обработке недоверенных PDF

Если документ получен из ненадёжного источника, изоляция — не прихоть, а необходимость. PDF может содержать встроенный JavaScript, ссылки на внешние ресурсы и эксплойты под уязвимости парсеров. Песочница ограничивает ущерб, но и внутри неё стоит придерживаться осторожности.

  • 🛡️ Используйте актуальные версии библиотек — старые парсеры PDF содержат известные уязвимости;
  • 🚫 Не открывайте встроенные вложения и не переходите по ссылкам из недоверенного документа;
  • 🧹 Отключайте выполнение JavaScript в просмотрщике, если оно не нужно для работы;
  • 📦 Обрабатывайте подозрительные файлы только в одноразовом контейнере без доступа к сети.

Если ничего не помогло

Когда файл на месте, библиотека установлена, а обработка всё равно падает, сузьте поиск. Проверьте, открывается ли PDF в обычном просмотрщике на хосте — возможно, сам файл повреждён при загрузке. Попробуйте минимальный скрипт, который только читает число страниц: если и он падает, проблема в файле или библиотеке, если работает — в логике вашей обработки.

Полезно также посмотреть полный текст ошибки (traceback), а не только её тип: сообщение часто содержит точный путь или номер страницы, на которой произошёл сбой. Для зашифрованных PDF проверьте, не требует ли документ пароль — многие библиотеки выбрасывают отдельное исключение для этого случая.

Частые вопросы

Почему скрипт не видит файл, хотя я его загрузил?

Чаще всего имя файла внутри песочницы отличается от ожидаемого: платформа могла изменить пробелы, регистр или добавить суффикс. Выведите список файлов через os.listdir("/mnt/data") и сверьте точное имя.

Можно ли менять файлы прямо в /mnt/data?

Зависит от режима монтирования. Если том подключен в режиме «только чтение», запись невозможна — результат нужно сохранять в разрешённый каталог или скачивать через интерфейс платформы.

Чем /mnt/data отличается от /tmp в песочнице?

/mnt/data — смонтированный том, который обычно доступен пользователю для загрузки и скачивания. /tmp — внутренний временный каталог контейнера: его содержимое удаляется вместе со средой и недоступно извне.

Какая библиотека лучше для чтения PDF в песочнице?

Универсального ответа нет: pypdf подходит для базовых операций (чтение, слияние, разделение), PyMuPDF быстрее работает с рендерингом и сложной вёрсткой. Для сканов без текстового слоя нужна OCR-связка. Выбор зависит от задачи и от того, что доступно в образе среды.

Пропадут ли мои файлы после закрытия сессии?

В облачных песочницах и средах ИИ-ассистентов — как правило, да: контейнер одноразовый. Скачивайте результаты до завершения сессии. В локальном Docker файлы на смонтированном томе остаются на вашем диске.