> 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/id/konfigurasi/overleaf-toolkit/pandoc-import-and-export.md).

# Impor dan Ekspor Pandoc

### Impor / Ekspor Pandoc

Overleaf dapat mengonversi dokumen ke dan dari LaTeX menggunakan [Pandoc](https://pandoc.org/). Konversi dijalankan di dalam sebuah **kontainer Docker yang di-sandbox** yang dikelola oleh `clsi` layanan ini, jadi fitur ini nonaktif secara default dan harus diaktifkan dengan beberapa variabel lingkungan.

#### Apa yang dilakukannya

| Arah       | Dari → Ke              | Format                     | Di mana                                                                                                           |
| ---------- | ---------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Impor**  | dokumen → proyek LaTeX | `docx`, `markdown`         | *Proyek Baru → Impor* (mengunggah sebuah `.docx` / `.md` dan mengubahnya menjadi `.tex` proyek yang dapat diedit) |
| **Ekspor** | proyek LaTeX → dokumen | `docx`, `markdown`, `html` | *Menu → Unduh / Ekspor* (merender proyek melalui Pandoc)                                                          |

***

### Variabel lingkungan

Ada **dua** variabel yang penting, dan satu yang mirip yang tidak **tidak**.

1\. `ENABLE_PANDOC_CONVERSIONS` — sakelar utama

```bash
ENABLE_PANDOC_CONVERSIONS=true
```

* Tipe: boolean (`true` mengaktifkannya; apa pun selain itu menonaktifkannya).
* **Harus diatur pada KEDUA `web` dan `clsi` layanan.** Keduanya adalah proses terpisah dengan konfigurasi terpisah:
  * `web` membacanya ke dalam `enablePandocConversions` (`services/web/config/settings.defaults.js`). Ini membatasi rute impor, rute ekspor, dan `ol-ExposedSettings.enablePandocConversions` flag yang memberi tahu frontend apakah harus menampilkan UI Impor/Ekspor.
  * `clsi` membacanya ke dalam `enablePandocConversions` (`services/clsi/config/settings.defaults.cjs`). Ini membatasi endpoint yang menjalankan Pandoc.
* Jika diaktifkan pada `web` tetapi tidak pada `clsi` (atau sebaliknya), UI akan muncul tetapi konversi akan gagal — pastikan keduanya sinkron.

2\. `PANDOC_IMAGE` — image kontainer yang dijalankan clsi untuk mengonversi

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

### Prasyarat

Karena konversi dijalankan sebagai kontainer Docker yang dibuat oleh `clsi`:

1. **`clsi` harus berjalan dalam mode sandbox dengan akses Docker.** Dalam stack dev `clsi` sudah memiliki `SANDBOXED_COMPILES=true` dan socket Docker host (`/var/run/docker.sock`) dipasang.
2. **Bagian `PANDOC_IMAGE` harus ada** pada host Docker tersebut (di-pull atau dibangun secara lokal) sebelum konversi pertama.

***

### Penyiapan cepat

Stack dev (`develop/dev.env`) sudah menyertakan:

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

Karena image resmi bersifat privat, bangun image bawaan **sekali** sebelum menggunakan fitur ini:

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

Lalu mulai ulang stack (re) agar `clsi` dan `web` mengambil variabel-variabelnya.

***

### Membangun image Pandoc

Image Pandoc standar bekerja karena clsi memanggil Pandoc secara umum (tanpa template/filter kustom). Itu hanya memerlukan tiga kebutuhan runtime, semuanya ditangani oleh `develop/pandoc/Dockerfile`:

```dockerfile
# Image Pandoc kustom untuk konversi sandboxed clsi
# (impor/ekspor: docx / markdown / html, melalui ENABLE_PANDOC_CONVERSIONS).
#
# Mengapa ini ada:
#   Image resmi quay.io/sharelatex/pandoc:3.9 bersifat privat (401, tidak bisa di-pull).
#   clsi memanggil pandoc secara umum (tanpa template/filter/reference-doc kustom), jadi sebuah
#   image pandoc standar bekerja — hanya perlu tiga kebutuhan runtime yang diasumsikan clsi:
#
#   1. Tidak ada ENTRYPOINT `pandoc` — clsi menjalankan Cmd ["pandoc", ...]; dengan
#      entrypoint bawaan itu akan menjadi `pandoc pandoc ...`.
#   2. `zip` — langkah kedua konversi impor menjalankan `zip -r` untuk mengemas output.
#   3. Pengguna yang cocok dengan cara clsi menjalankan kontainer konversi (User=$TEXLIVE_IMAGE_USER):
#        - `tex` pada UID 1000 — default dev / microservices.
#        - `www-data` pada UID 33 — kontainer *sibling* sandboxed Server Pro menetapkan
#          TEXLIVE_IMAGE_USER=www-data (lihat /etc/overleaf/env.sh). clsi (yang berjalan sebagai
#          www-data) membuat direktori konversi dimiliki oleh 33:33, jadi kontainer harus berjalan
#          sebagai www-data(33) untuk menulis ke dalamnya — jika tidak, pandoc gagal dengan
#          "unable to find user www-data" atau "permission denied".
#      Alpine sudah menyertakan grup `www-data` pada GID 82, jadi kami memindahkannya ke GID 33 untuk
#      menyesuaikan dengan host/texlive image.
#
# Build (tag harus cocok dengan PANDOC_IMAGE di develop/dev.env):
#   docker build -t overleaf-pandoc:local develop/pandoc
#
# Catatan: dipin ke `latest` (pandoc 3.10 pada saat penulisan). Pin ke versi tertentu
# pandoc/core agar build benar-benar dapat direproduksi.
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
```

Bangun dan beri tag sehingga tag-nya cocok `PANDOC_IMAGE`:

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

Untuk produksi, pin `pandoc/core` ke versi tertentu, bukan `latest` untuk build yang dapat direproduksi, dan setel `PANDOC_IMAGE` ke path registry Anda.

***

### Pemecahan masalah

| Gejala                                               | Kemungkinan penyebab                                                                               |
| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| Tombol Impor/Ekspor tidak muncul                     | `ENABLE_PANDOC_CONVERSIONS` tidak `true` di **web**                                                |
| UI muncul tetapi konversi gagal dengan error server  | `ENABLE_PANDOC_CONVERSIONS` tidak disetel pada **clsi**, atau `PANDOC_IMAGE` hilang di host Docker |
| `clsi` error saat mengambil image (401)              | `PANDOC_IMAGE` masih mengarah ke default privat; bangun/arahkan ke image Anda sendiri              |
| Kontainer berjalan `pandoc pandoc …` / argumen salah | Image memiliki `pandoc` `ENTRYPOINT`; gunakan `ENTRYPOINT []`                                      |
| Output impor kosong / langkah zip gagal              | `zip` tidak terpasang di image                                                                     |
| Error izin pada file yang dikonversi                 | Image tidak memiliki `tex` pengguna pada 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/id/konfigurasi/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.
