> 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/nl/configuratie/overleaf-toolkit/pandoc-import-en-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 in 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                                                                                                      |
| ---------- | ------------------------ | -------------------------- | --------------------------------------------------------------------------------------------------------- |
| **Import** | document → LaTeX-project | `docx`, `markdown`         | *Nieuw project → Importeren* (uploadt een `.docx` / `.md` en zet het om in een bewerkbaar `.tex` project) |
| **Export** | LaTeX-project → document | `docx`, `markdown`, `html` | *Menu → Downloaden / Exporteren* (rendert het project via Pandoc)                                         |

***

### Omgevingsvariabelen

Er zijn **twee** variabelen die ertoe doen, en een lookalike die dat doet **nog**.

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.** Het zijn afzonderlijke processen met afzonderlijke configuratie:
  * `web` leest het in in `enablePandocConversions` (`services/web/config/settings.defaults.js`). Het stuurt de importroutes, de exportroutes en de `ol-ExposedSettings.enablePandocConversions` vlag die de frontend vertelt of de import/export-UI 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), de UI zal verschijnen maar de conversie zal mislukken — houd ze synchroon.

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

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

### Vereisten

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

1. **`clsi` moet in gesandboxte modus met Docker-toegang draaien.** In de ontwikkelstack `clsi` heeft al `SANDBOXED_COMPILES=true` en de Docker-socket van de host (`/var/run/docker.sock`) aangekoppeld.
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 meegeleverd met:

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

Omdat de officiële image privé is, bouw de meegeleverde **één keer** voor het gebruik van de functie:

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

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

***

### De Pandoc-image bouwen

Een standaard Pandoc-image werkt omdat clsi Pandoc generiek aanroept (geen aangepaste templates/filters). Het heeft alleen drie runtime-vereisten nodig, die allemaal worden 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 — hij heeft alleen drie runtime-vereisten nodig waarvan clsi uitgaat:
#
#   1. Geen `pandoc` ENTRYPOINT — clsi voert Cmd ["pandoc", ...] uit; met de standaard
#      entrypoint zou dat `pandoc pandoc ...` worden.
#   2. `zip` — de tweede stap van de importconversie voert `zip -r` uit om de output 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 (draait als
#          www-data) maakt de conversiemap aan die eigendom is van 33:33, dus de container moet draaien
#          als www-data(33) om erin te kunnen schrijven — anders mislukt pandoc met ofwel
#          "unable to find user www-data" of "permission denied".
#      Alpine levert al een `www-data`-groep met GID 82, dus we verplaatsen die naar GID 33 om
#      overeen te komen met de host/texlive-image.
#
# Bouw (tag moet overeenkomen met PANDOC_IMAGE in develop/dev.env):
#   docker build -t overleaf-pandoc:local develop/pandoc
#
# Let op: 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 jouw registry-pad.

***

### Probleemoplossing

| Symptoom                                                  | Waarschijnlijke oorzaak                                                                               |
| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| Import/exportknoppen verschijnen niet                     | `ENABLE_PANDOC_CONVERSIONS` nog `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` verwijst 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 []`                                        |
| Importuitvoer is leeg / zip-stap mislukt                  | `zip` is niet geïnstalleerd in de image                                                               |
| Toestemmingsfouten op geconverteerde bestanden            | Image heeft geen `tex` gebruiker met 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/nl/configuratie/overleaf-toolkit/pandoc-import-en-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.
