> 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/id/konfigurasi/overleaf-toolkit/impor-dan-ekspor-pandoc.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 terisolasi** yang dikelola oleh `clsi` layanan, jadi fitur ini nonaktif secara bawaan dan harus diaktifkan dengan beberapa variabel lingkungan.

#### Fungsinya

| 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 memang **tidak**.

1\. `ENABLE_PANDOC_CONVERSIONS` — sakelar utama

```bash
ENABLE_PANDOC_CONVERSIONS=true
```

* Tipe: boolean (`true` mengaktifkannya; apa pun yang lain menonaktifkannya).
* **Harus disetel pada KEDUA `web` dan `clsi` layanan.** Mereka adalah proses terpisah dengan konfigurasi terpisah:
  * `web` membacanya ke dalam `enablePandocConversions` (`services/web/config/settings.defaults.js`). Ini mengatur rute impor, rute ekspor, dan `ol-ExposedSettings.enablePandocConversions` penanda yang memberi tahu frontend apakah akan menampilkan UI Impor/Ekspor.
  * `clsi` membacanya ke dalam `enablePandocConversions` (`services/clsi/config/settings.defaults.cjs`). Ini mengatur 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 terisolasi dengan akses Docker.** Di stack pengembangan `clsi` sudah memiliki `SANDBOXED_COMPILES=true` dan soket Docker host (`/var/run/docker.sock`) di-mount.
2. **Grup `PANDOC_IMAGE` harus tersedia** di host Docker tersebut (di-pull atau dibangun secara lokal) sebelum konversi pertama.

***

### Pengaturan cepat

Stack pengembangan (`develop/dev.env`) sudah dilengkapi dengan:

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

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

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

Lalu (re)start stack agar `clsi` dan `web` mengambil variabel tersebut.

***

### Membangun image Pandoc

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

```dockerfile
# Image Pandoc kustom untuk konversi terisolasi 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 generik (tanpa template/filter/reference-doc kustom), jadi sebuah
#   image pandoc standar berfungsi — ia hanya membutuhkan 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 sesuai dengan cara clsi menjalankan kontainer konversi (User=$TEXLIVE_IMAGE_USER):
#        - `tex` pada UID 1000 — bawaan dev / microservices.
#        - `www-data` pada UID 33 — kontainer *sibling* sandboxed Server Pro menyetel
#          TEXLIVE_IMAGE_USER=www-data (lihat /etc/overleaf/env.sh). clsi (berjalan sebagai
#          www-data) membuat direktori konversi dimiliki oleh 33:33, jadi kontainer harus berjalan
#          sebagai www-data(33) untuk menulis ke sana — jika tidak, pandoc gagal dengan
#          "unable to find user www-data" atau "permission denied".
#      Alpine sudah menyertakan grup `www-data` pada GID 82, jadi kita memindahkannya ke GID 33 agar
#      cocok dengan host/image texlive.
#
# 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 spesifik
# tag pandoc/core untuk build yang sepenuhnya 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
```

Build dan beri tag agar tag-nya cocok `PANDOC_IMAGE`:

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

Untuk produksi, pin `pandoc/core` ke versi tertentu alih-alih `terbaru` 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` pada **web**                                                 |
| UI muncul tetapi konversi gagal dengan error server          | `ENABLE_PANDOC_CONVERSIONS` tidak disetel pada **clsi**, atau `PANDOC_IMAGE` tidak ada di host Docker |
| `clsi` gagal menarik image (401)                             | `PANDOC_IMAGE` masih mengarah ke default privat; build/arah ke image Anda sendiri                     |
| Kontainer menjalankan `pandoc pandoc …` / argumen yang salah | Image memiliki `pandoc` `ENTRYPOINT`; gunakan `ENTRYPOINT []`                                         |
| Output impor kosong / langkah zip gagal                      | `zip` tidak terpasang di image                                                                        |
| Error izin pada file hasil konversi                          | 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://overleaf-pro.ayaka.space/on-premises/id/konfigurasi/overleaf-toolkit/impor-dan-ekspor-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.
