> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/ru/konfiguraciya/overleaf-toolkit/import-i-eksport-pandoc.md).

# Импорт и экспорт Pandoc

### Импорт / экспорт Pandoc

Overleaf может преобразовывать документы в LaTeX и обратно с помощью [Pandoc](https://pandoc.org/). Преобразование выполняется внутри **изолированного контейнера Docker** , управляемого `clsi` службой, поэтому функция по умолчанию отключена и должна быть включена с помощью пары переменных окружения.

#### Что это делает

| Направление | Из → В                  | Форматы                    | Где                                                                                                |
| ----------- | ----------------------- | -------------------------- | -------------------------------------------------------------------------------------------------- |
| **Импорт**  | документ → проект LaTeX | `docx`, `markdown`         | *Новый проект → Импорт* (загружает `.docx` / `.md` и превращает его в редактируемый `.tex` проект) |
| **Экспорт** | проект LaTeX → документ | `docx`, `markdown`, `html` | *Меню → Скачать / экспортировать* (рендерит проект через Pandoc)                                   |

***

### Переменные окружения

Есть **две** переменные, которые имеют значение, и одна похожая, которая не **не**.

1\. `ENABLE_PANDOC_CONVERSIONS` — главный переключатель

```bash
ENABLE_PANDOC_CONVERSIONS=true
```

* Тип: boolean (`true` включает её; всё остальное отключает её).
* **Должна быть установлена в ОБОИХ `web` и `clsi` службах.** Это отдельные процессы с отдельной конфигурацией:
  * `web` считывает её в `enablePandocConversions` (`services/web/config/settings.defaults.js`). Она контролирует маршруты импорта, маршруты экспорта и `ol-ExposedSettings.enablePandocConversions` флаг, который сообщает фронтенду, показывать ли интерфейс импорта/экспорта.
  * `clsi` считывает её в `enablePandocConversions` (`services/clsi/config/settings.defaults.cjs`). Она контролирует конечные точки, которые запускают Pandoc.
* Если она включена в `web` но не в `clsi` (или наоборот), интерфейс будет отображаться, но преобразование завершится сбоем — держите их в синхронизации.

2\. `PANDOC_IMAGE` — образ контейнера, который clsi запускает для преобразования

```bash
PANDOC_IMAGE=your-repo/pandoc:3.9
```

### Предварительные требования

Поскольку преобразования выполняются как контейнеры Docker, запускаемые `clsi`:

1. **`clsi` должен работать в изолированном режиме с доступом к Docker.** В dev-стеке `clsi` уже имеет `SANDBOXED_COMPILES=true` и хостовый Docker-сокет (`/var/run/docker.sock`) примонтирован.
2. **Поле `PANDOC_IMAGE` должен присутствовать** на этом Docker-хосте (загружен или собран локально) до первого преобразования.

***

### Быстрая настройка

Dev-стек (`develop/dev.env`) уже поставляется с:

```bash
ENABLE_PANDOC_CONVERSIONS=true
PANDOC_IMAGE=overleaf-pandoc:local
```

Поскольку официальный образ приватный, соберите встроенный **один раз** перед использованием функции:

```bash
docker build -t overleaf-pandoc:local develop/pandoc
```

Затем (пере)запустите стек, чтобы `clsi` и `web` подхватить переменные.

***

### Сборка образа Pandoc

Стандартный образ Pandoc подходит, потому что clsi вызывает Pandoc в общем виде (без пользовательских шаблонов/фильтров). Ему нужны лишь три обязательных компонента во время выполнения, и все они обеспечиваются `develop/pandoc/Dockerfile`:

```dockerfile
# Пользовательский образ Pandoc для изолированных преобразований clsi
# (импорт/экспорт: docx / markdown / html, через ENABLE_PANDOC_CONVERSIONS).
#
# Зачем это нужно:
#   Официальный образ quay.io/sharelatex/pandoc:3.9 приватный (401, не удаётся загрузить).
#   clsi вызывает pandoc в общем виде (без пользовательских шаблонов/фильтров/reference-doc), поэтому
#   стандартный образ pandoc подходит — ему нужны лишь три обязательных компонента, которые ожидает clsi:
#
#   1. Без `pandoc` ENTRYPOINT — clsi запускает Cmd ["pandoc", ...]; с обычным
#      entrypoint это превратилось бы в `pandoc pandoc ...`.
#   2. `zip` — второй шаг преобразования импорта запускает `zip -r` для упаковки результата.
#   3. Пользователи должны соответствовать тому, как clsi запускает контейнер преобразования (User=$TEXLIVE_IMAGE_USER):
#        - `tex` с UID 1000 — значение по умолчанию для dev / microservices.
#        - `www-data` с UID 33 — изолированные *соседние* контейнеры Server Pro задают
#          TEXLIVE_IMAGE_USER=www-data (см. /etc/overleaf/env.sh). clsi (работающий как
#          www-data) создаёт каталог преобразования, принадлежащий 33:33, поэтому контейнер должен работать
#          как www-data(33), чтобы записывать в него — иначе pandoc завершится ошибкой:
#          "unable to find user www-data" или "permission denied".
#      В Alpine уже есть группа `www-data` с GID 82, поэтому мы переносим её на GID 33, чтобы
#      соответствовать хосту/образу texlive.
#
# Сборка (тег должен совпадать с PANDOC_IMAGE в develop/dev.env):
#   docker build -t overleaf-pandoc:local develop/pandoc
#
# Примечание: закреплено за `latest` (pandoc 3.10 на момент написания). Зафиксируйте конкретный
# тег pandoc/core для полностью воспроизводимых сборок.
FROM pandoc/core:latest

ENTRYPOINT []

RUN apk add --no-cache zip \
 && adduser -D -u 1000 tex \
 && (delgroup www-data 2>/dev/null || true) \
 && addgroup -g 33 www-data \
 && adduser -D -u 33 -G www-data www-data
```

Соберите и пометьте его тегом так, чтобы тег совпадал `PANDOC_IMAGE`:

```bash
docker build -t overleaf-pandoc:local develop/pandoc
```

Для production зафиксируйте `pandoc/core` до конкретной версии вместо `latest` для воспроизводимых сборок, и задайте `PANDOC_IMAGE` на путь вашего реестра.

***

### Устранение неполадок

| Симптом                                                               | Вероятная причина                                                                                     |
| --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Кнопки импорта/экспорта не отображаются                               | `ENABLE_PANDOC_CONVERSIONS` не `true` на **web**                                                      |
| Интерфейс отображается, но преобразование завершается ошибкой сервера | `ENABLE_PANDOC_CONVERSIONS` не установлена в **clsi**, или `PANDOC_IMAGE` отсутствует на Docker-хосте |
| `clsi` ошибка при загрузке образа (401)                               | `PANDOC_IMAGE` по-прежнему указывает на приватный вариант по умолчанию; соберите/укажите свой образ   |
| Контейнер запускается `pandoc pandoc …` / неверные аргументы          | В образе есть `pandoc` `ENTRYPOINT`; используйте `ENTRYPOINT []`                                      |
| Результат импорта пуст / шаг zip завершается сбоем                    | `zip` не установлен в образе                                                                          |
| Ошибки прав доступа к преобразованным файлам                          | В образе нет `tex` пользователя с UID 1000                                                            |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/ru/konfiguraciya/overleaf-toolkit/import-i-eksport-pandoc.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
