Konverter dokumen ke Markdown yang berjalan penuh di browser
Mengubah Word dan PDF menjadi Markdown tanpa berkasnya meninggalkan komputer pengguna, termasuk OCR untuk halaman hasil pindaian.
Konteks
Kebutuhan ini berulang tiap minggu. Saya perlu menganalisa dokumen panjang berformat Word atau PDF dengan bantuan AI, tapi menyalinnya manual merusak struktur: tabel berantakan, heading hilang, dan daftar berubah jadi paragraf.
Alat sejenis tersedia banyak di internet, dan hampir semuanya mengharuskan unggah berkas ke server pihak lain. Untuk dokumen internal atau dokumen klien, cara itu tidak bisa dipakai.
Persoalannya
Privasi diselesaikan lewat arsitektur, bukan lewat pernyataan kebijakan
Halaman kebijakan privasi yang menyatakan berkas tidak disimpan tetap menuntut kepercayaan pengguna. Di sini seluruh konversi berjalan di browser dan tidak ada backend sama sekali, sehingga secara teknis tidak ada tempat berkas bisa bocor. Hasil build-nya juga bisa diunduh dan dibuka tanpa koneksi internet.
PDF tidak menyimpan struktur, hanya teks berposisi
Berbeda dengan Word yang menyimpan heading dan daftar sebagai penanda, PDF hanya mencatat teks di koordinat tertentu dengan ukuran huruf tertentu. Strukturnya dibangun ulang secara heuristik dengan membaca ukuran huruf yang menonjol sebagai heading. Hasilnya tidak sempurna untuk tata letak kolom yang rumit, dan itu saya tulis apa adanya di dokumentasinya.
Halaman hasil pindaian tidak memuat teks
Untuk halaman yang isinya gambar, teks diambil lewat OCR yang juga berjalan di browser memakai WebAssembly, dengan pilihan bahasa. Prosesnya lebih lambat dibanding OCR di server, tapi tetap sejalan dengan prinsip utamanya.
Keputusan yang diambil
Berikut alternatif yang ditolak dan alasannya.
Dibangun tanpa backend
Alternatifnya server kecil yang mengerjakan konversi, yang hasilnya lebih cepat dan lebih rapi terutama untuk PDF. Pilihan itu ditolak karena menghapus alasan utama alat ini dibuat. Efek sampingnya, biaya hosting menjadi nol dan hasil build-nya bisa dibuka langsung dari berkas lokal.