> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/on-premises/nl/configuratie/overleaf-toolkit/pandoc-import-and-export.md).

# Pandoc import en export

### Pandoc import / export

Overleaf kan documenten van en naar LaTeX converteren met behulp van [Pandoc](https://pandoc.org/). De conversie draait binnen een **gesandboxte Docker-container** beheerd door de `clsi` service, dus de functie staat standaard uit en moet met een paar omgevingsvariabelen worden ingeschakeld.

#### Wat het doet

| Richting       | Van → Naar               | Formaten                   | Waar                                                                                                      |
| -------------- | ------------------------ | -------------------------- | --------------------------------------------------------------------------------------------------------- |
| **Importeren** | document → LaTeX-project | `docx`, `markdown`         | *Nieuw project → Importeren* (uploadt een `.docx` / `.md` en zet het om in een bewerkbaar `.tex` project) |
| **Exporteren** | LaTeX-project → document | `docx`, `markdown`, `html` | *Menu → Downloaden / exporteren* (rendert het project via Pandoc)                                         |

***

### Omgevingsvariabelen

Er zijn **twee** variabelen die ertoe doen, en één die erop lijkt maar dat niet doet **niet**.

1\. `ENABLE_PANDOC_CONVERSIONS` — de hoofdschakelaar

```bash
ENABLE_PANDOC_CONVERSIONS=true
```

* Type: boolean (`true` schakelt het in; alles anders schakelt het uit).
* **Moet op BEIDE de `web` en `clsi` services worden ingesteld.** Het zijn afzonderlijke processen met afzonderlijke configuratie:
  * `web` leest het in in `enablePandocConversions` (`services/web/config/settings.defaults.js`). Het stuurt de import-routes, de export-routes en de `ol-ExposedSettings.enablePandocConversions` vlag die de frontend vertelt of de Import/Export-gebruikersinterface moet worden getoond.
  * `clsi` leest het in in `enablePandocConversions` (`services/clsi/config/settings.defaults.cjs`). Het stuurt de endpoints aan die Pandoc uitvoeren.
* Als het is ingeschakeld op `web` maar niet op `clsi` (of omgekeerd), zal de UI verschijnen maar de conversie mislukken — houd ze synchroon.

2\. `PANDOC_IMAGE` — de containerimage die clsi draait om te converteren

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

### Vereisten

Omdat conversies draaien als Docker-containers gestart door `clsi`:

1. **`clsi` moet in sandboxed modus draaien met toegang tot Docker.** In de ontwikkelstack `clsi` heeft al `SANDBOXED_COMPILES=true` en de Docker-socket van de host (`/var/run/docker.sock`) gemount.
2. **De `PANDOC_IMAGE` moet aanwezig zijn** op die Docker-host (opgehaald of lokaal gebouwd) vóór de eerste conversie.

***

### Snelle setup

De ontwikkelstack (`develop/dev.env`) wordt al geleverd met:

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

Omdat de officiële image privé is, bouw de meegeleverde **één keer** voordat je de functie gebruikt:

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

Start daarna de stack (opnieuw) zodat `clsi` en `web` de variabelen oppikt.

***

### De Pandoc-image bouwen

Een standaard Pandoc-image werkt omdat clsi Pandoc generiek aanroept (geen aangepaste templates/filters). Er zijn alleen drie runtime-essentials nodig, allemaal afgehandeld door `develop/pandoc/Dockerfile`:

```dockerfile
# Aangepaste Pandoc-image voor gesandboxte conversies van clsi
# (import/export: docx / markdown / html, via ENABLE_PANDOC_CONVERSIONS).
#
# Waarom dit bestaat:
#   De officiële quay.io/sharelatex/pandoc:3.9-image is privé (401, kan niet worden opgehaald).
#   clsi roept pandoc generiek aan (geen aangepaste templates/filters/reference-doc), dus een
#   standaard pandoc-image werkt — het heeft alleen drie runtime-essentials nodig waarvan clsi uitgaat:
#
#   1. Geen `pandoc` ENTRYPOINT — clsi draait Cmd ["pandoc", ...]; met de standaard
#      entrypoint zou dat `pandoc pandoc ...` worden.
#   2. `zip` — de tweede stap van de importconversie voert `zip -r` uit om de uitvoer te verpakken.
#   3. Gebruikers die overeenkomen met hoe clsi de conversiecontainer draait (User=$TEXLIVE_IMAGE_USER):
#        - `tex` met UID 1000 — standaard voor dev / microservices.
#        - `www-data` met UID 33 — Server Pro gesandboxte *sibling*-containers zetten
#          TEXLIVE_IMAGE_USER=www-data (zie /etc/overleaf/env.sh). clsi (draaiend als
#          www-data) maakt de conversiemap aan, eigendom van 33:33, dus de container moet draaien
#          als www-data(33) om erin te schrijven — anders faalt pandoc met ofwel
#          "unable to find user www-data" of "permission denied".
#      Alpine levert al een `www-data`-groep met GID 82, dus verplaatsen we die naar GID 33 om
#      overeen te komen met de host/texlive-image.
#
# Builden (de tag moet overeenkomen met PANDOC_IMAGE in develop/dev.env):
#   docker build -t overleaf-pandoc:local develop/pandoc
#
# Opmerking: vastgezet op `latest` (pandoc 3.10 op het moment van schrijven). Zet vast op een specifieke
# pandoc/core-tag voor volledig reproduceerbare builds.
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
```

Bouw en tag het zodat de tag overeenkomt met `PANDOC_IMAGE`:

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

Voor productie, zet `pandoc/core` vast op een specifieke versie in plaats van `latest` voor reproduceerbare builds, en stel `PANDOC_IMAGE` in op je registry-pad.

***

### Probleemoplossing

| Symptoom                                                  | Waarschijnlijke oorzaak                                                                               |
| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Import/Export-knoppen verschijnen niet                    | `ENABLE_PANDOC_CONVERSIONS` niet `true` op **web**                                                    |
| UI verschijnt maar conversie mislukt met een serverfout   | `ENABLE_PANDOC_CONVERSIONS` niet ingesteld op **clsi**, of `PANDOC_IMAGE` ontbreekt op de Docker-host |
| `clsi` fout bij het ophalen van de image (401)            | `PANDOC_IMAGE` wijst nog steeds naar de privé-standaard; bouw/wijs naar je eigen image                |
| Container draait `pandoc pandoc …` / verkeerde argumenten | Image heeft een `pandoc` `ENTRYPOINT`; gebruik `ENTRYPOINT []`                                        |
| Import-uitvoer is leeg / zip-stap mislukt                 | `zip` is niet geïnstalleerd in de image                                                               |
| Machtigingsfouten bij geconverteerde bestanden            | Image heeft geen `tex` gebruiker op 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://ayakaleaf-pro.ayaka.space/on-premises/nl/configuratie/overleaf-toolkit/pandoc-import-and-export.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.
