[{"data":1,"prerenderedAt":2330},["ShallowReactive",2],{"navigation_docs_id":3,"-id-how-to-use-android-kotlin":173,"-id-how-to-use-android-kotlin-surround":2325},[4,30,109,153],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fid\u002Fgetting-started","id\u002F01.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Pengenalan","\u002Fid\u002Fgetting-started\u002Fintroduction","id\u002F01.getting-started\u002F1.introduction","i-ph-rocket",{"title":15,"path":16,"stem":17,"icon":18},"Instalasi","\u002Fid\u002Fgetting-started\u002Finstallation","id\u002F01.getting-started\u002F2.installation","i-ph-download",{"title":20,"path":21,"stem":22,"icon":23},"Panduan Cepat","\u002Fid\u002Fgetting-started\u002Fquick-start","id\u002F01.getting-started\u002F3.quick-start","i-ph-play",{"title":25,"path":26,"stem":27,"icon":28},"Demo Langsung","\u002Fid\u002Fgetting-started\u002Flive-demo","id\u002F01.getting-started\u002F4.live-demo","i-ph-sparkle",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"How To","\u002Fid\u002Fhow-to","id\u002F02.how-to",[35,40,45,50,55,60,65,70,75,79,84,89,94,99,104],{"title":36,"path":37,"stem":38,"icon":39},"Menggunakan Rust","\u002Fid\u002Fhow-to\u002Fuse-rust","id\u002F02.how-to\u002F00.use-rust","simple-icons-rust",{"title":41,"path":42,"stem":43,"icon":44},"Menggunakan .NET \u002F C#","\u002Fid\u002Fhow-to\u002Fuse-csharp","id\u002F02.how-to\u002F01.use-csharp","simple-icons-dotnet",{"title":46,"path":47,"stem":48,"icon":49},"Menggunakan React Native","\u002Fid\u002Fhow-to\u002Fuse-react-native","id\u002F02.how-to\u002F02.use-react-native","simple-icons-react",{"title":51,"path":52,"stem":53,"icon":54},"Menggunakan iOS (Swift)","\u002Fid\u002Fhow-to\u002Fuse-ios-swift","id\u002F02.how-to\u002F03.use-ios-swift","simple-icons-apple",{"title":56,"path":57,"stem":58,"icon":59},"Menggunakan Android (Kotlin)","\u002Fid\u002Fhow-to\u002Fuse-android-kotlin","id\u002F02.how-to\u002F04.use-android-kotlin","simple-icons-android",{"title":61,"path":62,"stem":63,"icon":64},"Menggunakan C FFI","\u002Fid\u002Fhow-to\u002Fuse-c-ffi","id\u002F02.how-to\u002F05.use-c-ffi","simple-icons-c",{"title":66,"path":67,"stem":68,"icon":69},"Menggunakan CLI","\u002Fid\u002Fhow-to\u002Fuse-cli","id\u002F02.how-to\u002F06.use-cli","simple-icons-gnubash",{"title":71,"path":72,"stem":73,"icon":74},"Menggunakan Web","\u002Fid\u002Fhow-to\u002Fuse-web","id\u002F02.how-to\u002F07.use-web","simple-icons-javascript",{"title":76,"path":77,"stem":78,"icon":49},"Menggunakan React","\u002Fid\u002Fhow-to\u002Fuse-react","id\u002F02.how-to\u002F08.use-react",{"title":80,"path":81,"stem":82,"icon":83},"Menggunakan Node.js","\u002Fid\u002Fhow-to\u002Fuse-node","id\u002F02.how-to\u002F09.use-node","simple-icons-nodedotjs",{"title":85,"path":86,"stem":87,"icon":88},"Menggunakan Python","\u002Fid\u002Fhow-to\u002Fuse-python","id\u002F02.how-to\u002F10.use-python","simple-icons-python",{"title":90,"path":91,"stem":92,"icon":93},"Menggunakan Golang","\u002Fid\u002Fhow-to\u002Fuse-golang","id\u002F02.how-to\u002F11.use-golang","simple-icons-go",{"title":95,"path":96,"stem":97,"icon":98},"Menggunakan Java & JVM","\u002Fid\u002Fhow-to\u002Fuse-java","id\u002F02.how-to\u002F12.use-java","simple-icons-openjdk",{"title":100,"path":101,"stem":102,"icon":103},"Menggunakan Flutter & Dart","\u002Fid\u002Fhow-to\u002Fuse-flutter","id\u002F02.how-to\u002F13.use-flutter","simple-icons-flutter",{"title":105,"path":106,"stem":107,"icon":108},"Menggunakan Input RGB Terdekode","\u002Fid\u002Fhow-to\u002Fuse-decoded-rgb","id\u002F02.how-to\u002F14.use-decoded-rgb","lucide-image",{"title":110,"path":111,"stem":112,"children":113,"page":29},"Advance Guide","\u002Fid\u002Fadvance-guide","id\u002F03.advance-guide",[114,119,124,129,134,139,144,149],{"title":115,"path":116,"stem":117,"icon":118},"Model & Tingkatan (Tiers)","\u002Fid\u002Fadvance-guide\u002Fmodels-and-tiers","id\u002F03.advance-guide\u002F01.models-and-tiers","i-ph-cube",{"title":120,"path":121,"stem":122,"icon":123},"OCR Multibahasa","\u002Fid\u002Fadvance-guide\u002Fmultilingual-ocr","id\u002F03.advance-guide\u002F02.multilingual-ocr","i-ph-translate",{"title":125,"path":126,"stem":127,"icon":128},"Rekonstruksi Tata Letak Spasial","\u002Fid\u002Fadvance-guide\u002Fspatial-layout-reconstruction","id\u002F03.advance-guide\u002F03.spatial-layout-reconstruction","i-ph-layout",{"title":130,"path":131,"stem":132,"icon":133},"Pra-pemrosesan & Tuning Gambar","\u002Fid\u002Fadvance-guide\u002Fimage-preprocessing-and-tuning","id\u002F03.advance-guide\u002F04.image-preprocessing-and-tuning","i-ph-sliders",{"title":135,"path":136,"stem":137,"icon":138},"Klasifikasi & Orientasi","\u002Fid\u002Fadvance-guide\u002Fclassification-and-orientation","id\u002F03.advance-guide\u002F05.classification-and-orientation","i-ph-arrows-clockwise",{"title":140,"path":141,"stem":142,"icon":143},"Performa & Tolok Ukur (Benchmarks)","\u002Fid\u002Fadvance-guide\u002Fperformance-and-benchmarks","id\u002F03.advance-guide\u002F06.performance-and-benchmarks","i-ph-chart-line-up",{"title":145,"path":146,"stem":147,"icon":148},"Pemecahan Masalah (Troubleshooting)","\u002Fid\u002Fadvance-guide\u002Ftroubleshooting","id\u002F03.advance-guide\u002F07.troubleshooting","i-ph-wrench",{"title":150,"path":151,"stem":152,"icon":138},"v0.2 ke v0.3","\u002Fid\u002Fadvance-guide\u002Fmigration-guide","id\u002F03.advance-guide\u002F08.migration-guide",{"title":154,"path":155,"stem":156,"children":157,"page":29},"Api Reference","\u002Fid\u002Fapi-reference","id\u002F04.api-reference",[158,163,168],{"title":159,"path":160,"stem":161,"icon":162},"InitializeConfig","\u002Fid\u002Fapi-reference\u002Finitialize-config","id\u002F04.api-reference\u002F01.initialize-config","i-ph-code-block",{"title":164,"path":165,"stem":166,"icon":167},"OcrRunOptions","\u002Fid\u002Fapi-reference\u002Focr-run-options","id\u002F04.api-reference\u002F02.ocr-run-options","i-ph-faders",{"title":169,"path":170,"stem":171,"icon":172},"TextResult & Mode Keluaran","\u002Fid\u002Fapi-reference\u002Ftext-result-and-output","id\u002F04.api-reference\u002F03.text-result-and-output","i-ph-textbox",{"id":174,"title":56,"body":175,"description":2317,"extension":2318,"links":2319,"meta":2320,"navigation":2321,"path":57,"seo":2322,"stem":58,"__hash__":2324},"docs_id\u002Fid\u002F02.how-to\u002F04.use-android-kotlin.md",{"type":176,"value":177,"toc":2309},"minimark",[178,198,202,209,282,289,344,347,351,362,661,663,667,685,793,795,802,805,975,977,981,984,2305],[179,180,181,182,186,187,186,190,193,194,197],"p",{},"SDK Android didistribusikan via JitPack sebagai AAR yang menyertakan pustaka biner native JNI untuk ",[183,184,185],"code",{},"arm64-v8a",", ",[183,188,189],{},"armeabi-v7a",[183,191,192],{},"x86",", dan ",[183,195,196],{},"x86_64",".",[199,200,15],"h2",{"id":201},"instalasi",[179,203,204,205,208],{},"Tambahkan JitPack ke dalam ",[183,206,207],{},"settings.gradle"," root proyek Anda:",[210,211,216],"pre",{"className":212,"code":213,"language":214,"meta":215,"style":215},"language-groovy shiki shiki-themes material-theme-lighter github-light github-dark monokai","dependencyResolutionManagement {\n    repositories {\n        google()\n        mavenCentral()\n        maven { url 'https:\u002F\u002Fjitpack.io' }\n    }\n}\n","groovy","",[183,217,218,227,233,243,251,270,276],{"__ignoreMap":215},[219,220,223],"span",{"class":221,"line":222},"line",1,[219,224,226],{"class":225},"ss--_","dependencyResolutionManagement {\n",[219,228,230],{"class":221,"line":229},2,[219,231,232],{"class":225},"    repositories {\n",[219,234,236,239],{"class":221,"line":235},3,[219,237,238],{"class":225},"        google",[219,240,242],{"class":241},"swvn1","()\n",[219,244,246,249],{"class":221,"line":245},4,[219,247,248],{"class":225},"        mavenCentral",[219,250,242],{"class":241},[219,252,254,257,261,265,267],{"class":221,"line":253},5,[219,255,256],{"class":225},"        maven { url ",[219,258,260],{"class":259},"siCPE","'",[219,262,264],{"class":263},"sLACW","https:\u002F\u002Fjitpack.io",[219,266,260],{"class":259},[219,268,269],{"class":225}," }\n",[219,271,273],{"class":221,"line":272},6,[219,274,275],{"class":225},"    }\n",[219,277,279],{"class":221,"line":278},7,[219,280,281],{"class":225},"}\n",[179,283,284,285,288],{},"Pada ",[183,286,287],{},"build.gradle"," modul aplikasi:",[210,290,292],{"className":212,"code":291,"language":214,"meta":215,"style":215},"dependencies {\n    \u002F\u002F Runtime OCR inti dengan biner native JNI\n    implementation 'com.github.byrizki.rusto-rs:rusto-android:0.3.2'\n\n    \u002F\u002F Paket model bawaan PP-OCRv6 Tiny (~6 MB)\n    implementation 'com.github.byrizki.rusto-rs:rusto-models-ppocrv6-tiny:0.3.2'\n}\n",[183,293,294,299,305,318,324,329,340],{"__ignoreMap":215},[219,295,296],{"class":221,"line":222},[219,297,298],{"class":225},"dependencies {\n",[219,300,301],{"class":221,"line":229},[219,302,304],{"class":303},"ss7Ak","    \u002F\u002F Runtime OCR inti dengan biner native JNI\n",[219,306,307,310,312,315],{"class":221,"line":235},[219,308,309],{"class":225},"    implementation ",[219,311,260],{"class":259},[219,313,314],{"class":263},"com.github.byrizki.rusto-rs:rusto-android:0.3.2",[219,316,317],{"class":259},"'\n",[219,319,320],{"class":221,"line":245},[219,321,323],{"emptyLinePlaceholder":322},true,"\n",[219,325,326],{"class":221,"line":253},[219,327,328],{"class":303},"    \u002F\u002F Paket model bawaan PP-OCRv6 Tiny (~6 MB)\n",[219,330,331,333,335,338],{"class":221,"line":272},[219,332,309],{"class":225},[219,334,260],{"class":259},[219,336,337],{"class":263},"com.github.byrizki.rusto-rs:rusto-models-ppocrv6-tiny:0.3.2",[219,339,317],{"class":259},[219,341,342],{"class":221,"line":278},[219,343,281],{"class":225},[345,346],"hr",{},[199,348,350],{"id":349},"_1-siklus-hidup-mesin-resolusi-aset","1. Siklus Hidup Mesin & Resolusi Aset",[179,352,353,354,357,358,361],{},"Menyertakan ",[183,355,356],{},"Context"," Android ke ",[183,359,360],{},"RustO.initialize()"," akan mengekstrak dan menyimpan cache model serta kamus secara otomatis saat aplikasi pertama kali dijalankan:",[210,363,367],{"className":364,"code":365,"language":366,"meta":215,"style":215},"language-kotlin shiki shiki-themes material-theme-lighter github-light github-dark monokai","package com.example.ocr\n\nimport android.content.Context\nimport com.byrizki.rusto.*\n\nclass OcrManager(private val context: Context) : AutoCloseable {\n    \u002F\u002F 1. Inisialisasi dengan model bawaan default PP-OCRv6\n    private val ocr: RustO = RustO.initialize(context)\n\n    \u002F\u002F 2. Atau inisialisasi dengan konfigurasi kustom:\n    fun initCustom(): RustO {\n        val config = InitializeConfig(\n            template = \"ppv6\",\n            detection = DetectionConfig(modelPath = \"custom_det.rten\"),\n            recognition = RecognitionConfig(\n                modelPath = \"custom_rec.rten\",\n                dictPath = \"custom_dict.txt\"\n            )\n        )\n        return RustO.initialize(context, config)\n    }\n\n    override fun close() {\n        ocr.close()\n    }\n}\n","kotlin",[183,368,369,379,383,391,402,406,439,444,471,476,482,498,516,530,552,565,578,589,595,601,615,620,625,640,651,656],{"__ignoreMap":215},[219,370,371,375],{"class":221,"line":222},[219,372,374],{"class":373},"sGXK2","package",[219,376,378],{"class":377},"sQqfL"," com.example.ocr\n",[219,380,381],{"class":221,"line":229},[219,382,323],{"emptyLinePlaceholder":322},[219,384,385,388],{"class":221,"line":235},[219,386,387],{"class":373},"import",[219,389,390],{"class":377}," android.content.Context\n",[219,392,393,395,398],{"class":221,"line":245},[219,394,387],{"class":373},[219,396,397],{"class":377}," com.byrizki.rusto.",[219,399,401],{"class":400},"sSsL9","*\n",[219,403,404],{"class":221,"line":253},[219,405,323],{"emptyLinePlaceholder":322},[219,407,408,411,415,418,422,425,428,430,433,436],{"class":221,"line":272},[219,409,410],{"class":373},"class",[219,412,414],{"class":413},"sKvfc"," OcrManager",[219,416,417],{"class":225},"(",[219,419,421],{"class":420},"sTNss","private",[219,423,424],{"class":373}," val",[219,426,427],{"class":225}," context: ",[219,429,356],{"class":413},[219,431,432],{"class":225},") : ",[219,434,435],{"class":413},"AutoCloseable",[219,437,438],{"class":225}," {\n",[219,440,441],{"class":221,"line":278},[219,442,443],{"class":303},"    \u002F\u002F 1. Inisialisasi dengan model bawaan default PP-OCRv6\n",[219,445,447,450,452,455,458,461,464,468],{"class":221,"line":446},8,[219,448,449],{"class":420},"    private",[219,451,424],{"class":373},[219,453,454],{"class":225}," ocr: ",[219,456,457],{"class":413},"RustO",[219,459,460],{"class":373}," =",[219,462,463],{"class":225}," RustO.",[219,465,467],{"class":466},"sD0ED","initialize",[219,469,470],{"class":225},"(context)\n",[219,472,474],{"class":221,"line":473},9,[219,475,323],{"emptyLinePlaceholder":322},[219,477,479],{"class":221,"line":478},10,[219,480,481],{"class":303},"    \u002F\u002F 2. Atau inisialisasi dengan konfigurasi kustom:\n",[219,483,485,488,491,494,496],{"class":221,"line":484},11,[219,486,487],{"class":373},"    fun",[219,489,490],{"class":466}," initCustom",[219,492,493],{"class":225},"(): ",[219,495,457],{"class":413},[219,497,438],{"class":225},[219,499,501,504,507,510,513],{"class":221,"line":500},12,[219,502,503],{"class":373},"        val",[219,505,506],{"class":225}," config ",[219,508,509],{"class":373},"=",[219,511,512],{"class":466}," InitializeConfig",[219,514,515],{"class":225},"(\n",[219,517,519,522,524,527],{"class":221,"line":518},13,[219,520,521],{"class":225},"            template ",[219,523,509],{"class":373},[219,525,526],{"class":263}," \"ppv6\"",[219,528,529],{"class":225},",\n",[219,531,533,536,538,541,544,546,549],{"class":221,"line":532},14,[219,534,535],{"class":225},"            detection ",[219,537,509],{"class":373},[219,539,540],{"class":466}," DetectionConfig",[219,542,543],{"class":225},"(modelPath ",[219,545,509],{"class":373},[219,547,548],{"class":263}," \"custom_det.rten\"",[219,550,551],{"class":225},"),\n",[219,553,555,558,560,563],{"class":221,"line":554},15,[219,556,557],{"class":225},"            recognition ",[219,559,509],{"class":373},[219,561,562],{"class":466}," RecognitionConfig",[219,564,515],{"class":225},[219,566,568,571,573,576],{"class":221,"line":567},16,[219,569,570],{"class":225},"                modelPath ",[219,572,509],{"class":373},[219,574,575],{"class":263}," \"custom_rec.rten\"",[219,577,529],{"class":225},[219,579,581,584,586],{"class":221,"line":580},17,[219,582,583],{"class":225},"                dictPath ",[219,585,509],{"class":373},[219,587,588],{"class":263}," \"custom_dict.txt\"\n",[219,590,592],{"class":221,"line":591},18,[219,593,594],{"class":225},"            )\n",[219,596,598],{"class":221,"line":597},19,[219,599,600],{"class":225},"        )\n",[219,602,604,608,610,612],{"class":221,"line":603},20,[219,605,607],{"class":606},"sRxSC","        return",[219,609,463],{"class":225},[219,611,467],{"class":466},[219,613,614],{"class":225},"(context, config)\n",[219,616,618],{"class":221,"line":617},21,[219,619,275],{"class":225},[219,621,623],{"class":221,"line":622},22,[219,624,323],{"emptyLinePlaceholder":322},[219,626,628,631,634,637],{"class":221,"line":627},23,[219,629,630],{"class":420},"    override",[219,632,633],{"class":373}," fun",[219,635,636],{"class":466}," close",[219,638,639],{"class":225},"() {\n",[219,641,643,646,649],{"class":221,"line":642},24,[219,644,645],{"class":225},"        ocr.",[219,647,648],{"class":466},"close",[219,650,242],{"class":225},[219,652,654],{"class":221,"line":653},25,[219,655,275],{"class":225},[219,657,659],{"class":221,"line":658},26,[219,660,281],{"class":225},[345,662],{},[199,664,666],{"id":665},"_2-sumber-masukan-gambar-yang-didukung","2. Sumber Masukan Gambar yang Didukung",[179,668,669,672,673,676,677,680,681,684],{},[183,670,671],{},"ImageSource"," mampu mengurai URI ",[183,674,675],{},"content:\u002F\u002F"," dari Photo Picker atau Kamera, path berkas ",[183,678,679],{},"file:\u002F\u002F",", serta larik byte dalam memori ",[183,682,683],{},"ByteArray"," secara native:",[210,686,688],{"className":364,"code":687,"language":366,"meta":215,"style":215},"\u002F\u002F 1. Content URI dari Photo Picker \u002F Intent Kamera (resolusi stream otomatis)\nval uriSource = ImageSource.Uri(\"content:\u002F\u002Fmedia\u002Fexternal\u002Fimages\u002Fmedia\u002F1002\")\n\n\u002F\u002F 2. Path berkas filesystem lokal\nval pathSource = ImageSource.Uri(\"\u002Fdata\u002Fuser\u002F0\u002Fcom.example\u002Fcache\u002Fdoc.jpg\")\n\n\u002F\u002F 3. Larik byte mentah dalam memori\nval rawBytes: ByteArray = file.readBytes()\nval byteSource = ImageSource.Bytes(rawBytes)\n",[183,689,690,695,719,723,728,748,752,757,776],{"__ignoreMap":215},[219,691,692],{"class":221,"line":222},[219,693,694],{"class":303},"\u002F\u002F 1. Content URI dari Photo Picker \u002F Intent Kamera (resolusi stream otomatis)\n",[219,696,697,700,703,705,708,711,713,716],{"class":221,"line":229},[219,698,699],{"class":373},"val",[219,701,702],{"class":225}," uriSource ",[219,704,509],{"class":373},[219,706,707],{"class":225}," ImageSource.",[219,709,710],{"class":466},"Uri",[219,712,417],{"class":225},[219,714,715],{"class":263},"\"content:\u002F\u002Fmedia\u002Fexternal\u002Fimages\u002Fmedia\u002F1002\"",[219,717,718],{"class":225},")\n",[219,720,721],{"class":221,"line":235},[219,722,323],{"emptyLinePlaceholder":322},[219,724,725],{"class":221,"line":245},[219,726,727],{"class":303},"\u002F\u002F 2. Path berkas filesystem lokal\n",[219,729,730,732,735,737,739,741,743,746],{"class":221,"line":253},[219,731,699],{"class":373},[219,733,734],{"class":225}," pathSource ",[219,736,509],{"class":373},[219,738,707],{"class":225},[219,740,710],{"class":466},[219,742,417],{"class":225},[219,744,745],{"class":263},"\"\u002Fdata\u002Fuser\u002F0\u002Fcom.example\u002Fcache\u002Fdoc.jpg\"",[219,747,718],{"class":225},[219,749,750],{"class":221,"line":272},[219,751,323],{"emptyLinePlaceholder":322},[219,753,754],{"class":221,"line":278},[219,755,756],{"class":303},"\u002F\u002F 3. Larik byte mentah dalam memori\n",[219,758,759,761,764,766,768,771,774],{"class":221,"line":446},[219,760,699],{"class":373},[219,762,763],{"class":225}," rawBytes: ",[219,765,683],{"class":413},[219,767,460],{"class":373},[219,769,770],{"class":225}," file.",[219,772,773],{"class":466},"readBytes",[219,775,242],{"class":225},[219,777,778,780,783,785,787,790],{"class":221,"line":473},[219,779,699],{"class":373},[219,781,782],{"class":225}," byteSource ",[219,784,509],{"class":373},[219,786,707],{"class":225},[219,788,789],{"class":466},"Bytes",[219,791,792],{"class":225},"(rawBytes)\n",[345,794],{},[199,796,798,799,801],{"id":797},"_3-opsi-permintaan-lokal-ocrrunoptions","3. Opsi Permintaan Lokal (",[183,800,164],{},")",[179,803,804],{},"Atur konfigurasi pemindaian secara dinamis:",[210,806,808],{"className":364,"code":807,"language":366,"meta":215,"style":215},"val options = OcrRunOptions(\n    output = OutputGranularity.LINES, \u002F\u002F LINES, WORDS, atau SPATIAL\n    lineYThreshold = 0.5f,            \u002F\u002F Toleransi dinamis pengelompokan baris\n    wordXThreshold = 0.4f,            \u002F\u002F Toleransi pemisahan kata\n    textScore = 0.55f,                \u002F\u002F Batas skor kepercayaan pengenalan\n    maxSideLen = 1600f,               \u002F\u002F Batas panjang sisi maksimum gambar\n    detection = DetectionRunOptions(\n        limitSideLen = 960,\n        limitType = \"max\"\n    ),\n    postprocess = PostprocessRunOptions(\n        useDilation = true            \u002F\u002F Dilatasi morfologi untuk struk redup\n    )\n)\n",[183,809,810,824,837,854,869,885,901,913,925,935,940,952,966,971],{"__ignoreMap":215},[219,811,812,814,817,819,822],{"class":221,"line":222},[219,813,699],{"class":373},[219,815,816],{"class":225}," options ",[219,818,509],{"class":373},[219,820,821],{"class":466}," OcrRunOptions",[219,823,515],{"class":225},[219,825,826,829,831,834],{"class":221,"line":229},[219,827,828],{"class":225},"    output ",[219,830,509],{"class":373},[219,832,833],{"class":225}," OutputGranularity.LINES, ",[219,835,836],{"class":303},"\u002F\u002F LINES, WORDS, atau SPATIAL\n",[219,838,839,842,844,848,851],{"class":221,"line":235},[219,840,841],{"class":225},"    lineYThreshold ",[219,843,509],{"class":373},[219,845,847],{"class":846},"sYThS"," 0.5f",[219,849,850],{"class":225},",            ",[219,852,853],{"class":303},"\u002F\u002F Toleransi dinamis pengelompokan baris\n",[219,855,856,859,861,864,866],{"class":221,"line":245},[219,857,858],{"class":225},"    wordXThreshold ",[219,860,509],{"class":373},[219,862,863],{"class":846}," 0.4f",[219,865,850],{"class":225},[219,867,868],{"class":303},"\u002F\u002F Toleransi pemisahan kata\n",[219,870,871,874,876,879,882],{"class":221,"line":253},[219,872,873],{"class":225},"    textScore ",[219,875,509],{"class":373},[219,877,878],{"class":846}," 0.55f",[219,880,881],{"class":225},",                ",[219,883,884],{"class":303},"\u002F\u002F Batas skor kepercayaan pengenalan\n",[219,886,887,890,892,895,898],{"class":221,"line":272},[219,888,889],{"class":225},"    maxSideLen ",[219,891,509],{"class":373},[219,893,894],{"class":846}," 1600f",[219,896,897],{"class":225},",               ",[219,899,900],{"class":303},"\u002F\u002F Batas panjang sisi maksimum gambar\n",[219,902,903,906,908,911],{"class":221,"line":278},[219,904,905],{"class":225},"    detection ",[219,907,509],{"class":373},[219,909,910],{"class":466}," DetectionRunOptions",[219,912,515],{"class":225},[219,914,915,918,920,923],{"class":221,"line":446},[219,916,917],{"class":225},"        limitSideLen ",[219,919,509],{"class":373},[219,921,922],{"class":846}," 960",[219,924,529],{"class":225},[219,926,927,930,932],{"class":221,"line":473},[219,928,929],{"class":225},"        limitType ",[219,931,509],{"class":373},[219,933,934],{"class":263}," \"max\"\n",[219,936,937],{"class":221,"line":478},[219,938,939],{"class":225},"    ),\n",[219,941,942,945,947,950],{"class":221,"line":484},[219,943,944],{"class":225},"    postprocess ",[219,946,509],{"class":373},[219,948,949],{"class":466}," PostprocessRunOptions",[219,951,515],{"class":225},[219,953,954,957,959,963],{"class":221,"line":500},[219,955,956],{"class":225},"        useDilation ",[219,958,509],{"class":373},[219,960,962],{"class":961},"s8HiA"," true",[219,964,965],{"class":303},"            \u002F\u002F Dilatasi morfologi untuk struk redup\n",[219,967,968],{"class":221,"line":518},[219,969,970],{"class":225},"    )\n",[219,972,973],{"class":221,"line":532},[219,974,718],{"class":225},[345,976],{},[199,978,980],{"id":979},"_4-contoh-lengkap-pemindai-dokumen-jetpack-compose","4. Contoh Lengkap Pemindai Dokumen Jetpack Compose",[179,982,983],{},"Berikut implementasi lengkap menggunakan Kotlin Coroutines dan Photo Picker modern di Jetpack Compose:",[210,985,987],{"className":364,"code":986,"language":366,"meta":215,"style":215},"package com.example.ocr\n\nimport android.net.Uri\nimport androidx.activity.compose.rememberLauncherForActivityResult\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.unit.dp\nimport com.byrizki.rusto.*\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\n\n@Composable\nfun DocumentScannerScreen() {\n    val context = LocalContext.current\n    var selectedUri by remember { mutableStateOf\u003CUri?>(null) }\n    var results by remember { mutableStateOf\u003CList\u003CTextResult>>(emptyList()) }\n    var spatialText by remember { mutableStateOf(\"\") }\n    var isSpatial by remember { mutableStateOf(false) }\n    var isLoading by remember { mutableStateOf(false) }\n\n    val photoPicker = rememberLauncherForActivityResult(\n        contract = ActivityResultContracts.PickVisualMedia()\n    ) { uri ->\n        if (uri != null) {\n            selectedUri = uri\n        }\n    }\n\n    LaunchedEffect(selectedUri, isSpatial) {\n        val uri = selectedUri ?: return@LaunchedEffect\n        isLoading = true\n\n        withContext(Dispatchers.Default) {\n            RustO.initialize(context).use { ocr ->\n                val source = ImageSource.Uri(uri.toString())\n                if (isSpatial) {\n                    val spatialRes = ocr.detectText(\n                        source,\n                        OcrRunOptions(output = OutputGranularity.SPATIAL, lineYThreshold = 0.5f)\n                    )\n                    if (spatialRes is DetectTextResult.Spatial) {\n                        spatialText = spatialRes.text\n                        results = emptyList()\n                    }\n                } else {\n                    val structRes = ocr.detectText(\n                        source,\n                        OcrRunOptions(output = OutputGranularity.LINES, textScore = 0.5f)\n                    )\n                    if (structRes is DetectTextResult.Structured) {\n                        results = structRes.items\n                        spatialText = \"\"\n                    }\n                }\n            }\n        }\n        isLoading = false\n    }\n\n    Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {\n        Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) {\n            Button(\n                onClick = { photoPicker.launch(androidx.activity.result.PickVisualMediaRequest()) },\n                modifier = Modifier.weight(1f)\n            ) {\n                Text(\"Pilih Dokumen\")\n            }\n\n            FilterChip(\n                selected = isSpatial,\n                onClick = { isSpatial = !isSpatial },\n                label = { Text(if (isSpatial) \"Tata Letak Spasial\" else \"Baris Terstruktur\") }\n            )\n        }\n\n        if (isLoading) {\n            CircularProgressIndicator(modifier = Modifier.padding(vertical = 16.dp))\n        }\n\n        Spacer(modifier = Modifier.height(16.dp))\n\n        if (isSpatial && spatialText.isNotEmpty()) {\n            Text(\n                text = spatialText,\n                fontFamily = FontFamily.Monospace,\n                style = MaterialTheme.typography.bodySmall\n            )\n        } else {\n            LazyColumn(verticalArrangement = Arrangement.spacedBy(8.dp)) {\n                items(results) { item ->\n                    Card(modifier = Modifier.fillMaxWidth()) {\n                        Row(\n                            modifier = Modifier.padding(12.dp),\n                            horizontalArrangement = Arrangement.SpaceBetween\n                        ) {\n                            Text(text = item.text, modifier = Modifier.weight(1f))\n                            Text(\n                                text = \"${(item.score * 100).toInt()}%\",\n                                style = MaterialTheme.typography.bodySmall,\n                                color = MaterialTheme.colorScheme.primary\n                            )\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n",[183,988,989,995,999,1006,1013,1020,1029,1036,1043,1052,1061,1068,1075,1082,1089,1097,1104,1111,1115,1120,1130,1143,1178,1212,1234,1256,1277,1282,1297,1313,1323,1341,1352,1358,1363,1368,1377,1396,1407,1412,1421,1440,1464,1473,1492,1498,1518,1524,1539,1550,1563,1569,1580,1596,1601,1619,1624,1637,1647,1657,1662,1668,1674,1679,1689,1694,1699,1730,1763,1771,1794,1814,1820,1833,1838,1843,1851,1862,1880,1912,1917,1922,1927,1935,1960,1965,1970,1991,1996,2016,2024,2035,2046,2057,2062,2072,2093,2104,2120,2128,2148,2159,2165,2192,2199,2241,2252,2263,2269,2275,2280,2285,2290,2295,2300],{"__ignoreMap":215},[219,990,991,993],{"class":221,"line":222},[219,992,374],{"class":373},[219,994,378],{"class":377},[219,996,997],{"class":221,"line":229},[219,998,323],{"emptyLinePlaceholder":322},[219,1000,1001,1003],{"class":221,"line":235},[219,1002,387],{"class":373},[219,1004,1005],{"class":377}," android.net.Uri\n",[219,1007,1008,1010],{"class":221,"line":245},[219,1009,387],{"class":373},[219,1011,1012],{"class":377}," androidx.activity.compose.rememberLauncherForActivityResult\n",[219,1014,1015,1017],{"class":221,"line":253},[219,1016,387],{"class":373},[219,1018,1019],{"class":377}," androidx.activity.result.contract.ActivityResultContracts\n",[219,1021,1022,1024,1027],{"class":221,"line":272},[219,1023,387],{"class":373},[219,1025,1026],{"class":377}," androidx.compose.foundation.layout.",[219,1028,401],{"class":400},[219,1030,1031,1033],{"class":221,"line":278},[219,1032,387],{"class":373},[219,1034,1035],{"class":377}," androidx.compose.foundation.lazy.LazyColumn\n",[219,1037,1038,1040],{"class":221,"line":446},[219,1039,387],{"class":373},[219,1041,1042],{"class":377}," androidx.compose.foundation.lazy.items\n",[219,1044,1045,1047,1050],{"class":221,"line":473},[219,1046,387],{"class":373},[219,1048,1049],{"class":377}," androidx.compose.material3.",[219,1051,401],{"class":400},[219,1053,1054,1056,1059],{"class":221,"line":478},[219,1055,387],{"class":373},[219,1057,1058],{"class":377}," androidx.compose.runtime.",[219,1060,401],{"class":400},[219,1062,1063,1065],{"class":221,"line":484},[219,1064,387],{"class":373},[219,1066,1067],{"class":377}," androidx.compose.ui.Modifier\n",[219,1069,1070,1072],{"class":221,"line":500},[219,1071,387],{"class":373},[219,1073,1074],{"class":377}," androidx.compose.ui.platform.LocalContext\n",[219,1076,1077,1079],{"class":221,"line":518},[219,1078,387],{"class":373},[219,1080,1081],{"class":377}," androidx.compose.ui.text.font.FontFamily\n",[219,1083,1084,1086],{"class":221,"line":532},[219,1085,387],{"class":373},[219,1087,1088],{"class":377}," androidx.compose.ui.unit.dp\n",[219,1090,1091,1093,1095],{"class":221,"line":554},[219,1092,387],{"class":373},[219,1094,397],{"class":377},[219,1096,401],{"class":400},[219,1098,1099,1101],{"class":221,"line":567},[219,1100,387],{"class":373},[219,1102,1103],{"class":377}," kotlinx.coroutines.Dispatchers\n",[219,1105,1106,1108],{"class":221,"line":580},[219,1107,387],{"class":373},[219,1109,1110],{"class":377}," kotlinx.coroutines.withContext\n",[219,1112,1113],{"class":221,"line":591},[219,1114,323],{"emptyLinePlaceholder":322},[219,1116,1117],{"class":221,"line":597},[219,1118,1119],{"class":413},"@Composable\n",[219,1121,1122,1125,1128],{"class":221,"line":603},[219,1123,1124],{"class":373},"fun",[219,1126,1127],{"class":466}," DocumentScannerScreen",[219,1129,639],{"class":225},[219,1131,1132,1135,1138,1140],{"class":221,"line":617},[219,1133,1134],{"class":373},"    val",[219,1136,1137],{"class":225}," context ",[219,1139,509],{"class":373},[219,1141,1142],{"class":225}," LocalContext.current\n",[219,1144,1145,1148,1151,1154,1157,1160,1163,1166,1168,1171,1175],{"class":221,"line":622},[219,1146,1147],{"class":373},"    var",[219,1149,1150],{"class":225}," selectedUri ",[219,1152,1153],{"class":420},"by",[219,1155,1156],{"class":466}," remember",[219,1158,1159],{"class":225}," { ",[219,1161,1162],{"class":466},"mutableStateOf",[219,1164,1165],{"class":225},"\u003C",[219,1167,710],{"class":413},[219,1169,1170],{"class":225},"?>(",[219,1172,1174],{"class":1173},"sMTiH","null",[219,1176,1177],{"class":225},") }\n",[219,1179,1180,1182,1185,1187,1189,1191,1193,1195,1198,1200,1203,1206,1209],{"class":221,"line":627},[219,1181,1147],{"class":373},[219,1183,1184],{"class":225}," results ",[219,1186,1153],{"class":420},[219,1188,1156],{"class":466},[219,1190,1159],{"class":225},[219,1192,1162],{"class":466},[219,1194,1165],{"class":225},[219,1196,1197],{"class":413},"List",[219,1199,1165],{"class":225},[219,1201,1202],{"class":413},"TextResult",[219,1204,1205],{"class":225},">>(",[219,1207,1208],{"class":466},"emptyList",[219,1210,1211],{"class":225},"()) }\n",[219,1213,1214,1216,1219,1221,1223,1225,1227,1229,1232],{"class":221,"line":642},[219,1215,1147],{"class":373},[219,1217,1218],{"class":225}," spatialText ",[219,1220,1153],{"class":420},[219,1222,1156],{"class":466},[219,1224,1159],{"class":225},[219,1226,1162],{"class":466},[219,1228,417],{"class":225},[219,1230,1231],{"class":263},"\"\"",[219,1233,1177],{"class":225},[219,1235,1236,1238,1241,1243,1245,1247,1249,1251,1254],{"class":221,"line":653},[219,1237,1147],{"class":373},[219,1239,1240],{"class":225}," isSpatial ",[219,1242,1153],{"class":420},[219,1244,1156],{"class":466},[219,1246,1159],{"class":225},[219,1248,1162],{"class":466},[219,1250,417],{"class":225},[219,1252,1253],{"class":961},"false",[219,1255,1177],{"class":225},[219,1257,1258,1260,1263,1265,1267,1269,1271,1273,1275],{"class":221,"line":658},[219,1259,1147],{"class":373},[219,1261,1262],{"class":225}," isLoading ",[219,1264,1153],{"class":420},[219,1266,1156],{"class":466},[219,1268,1159],{"class":225},[219,1270,1162],{"class":466},[219,1272,417],{"class":225},[219,1274,1253],{"class":961},[219,1276,1177],{"class":225},[219,1278,1280],{"class":221,"line":1279},27,[219,1281,323],{"emptyLinePlaceholder":322},[219,1283,1285,1287,1290,1292,1295],{"class":221,"line":1284},28,[219,1286,1134],{"class":373},[219,1288,1289],{"class":225}," photoPicker ",[219,1291,509],{"class":373},[219,1293,1294],{"class":466}," rememberLauncherForActivityResult",[219,1296,515],{"class":225},[219,1298,1300,1303,1305,1308,1311],{"class":221,"line":1299},29,[219,1301,1302],{"class":225},"        contract ",[219,1304,509],{"class":373},[219,1306,1307],{"class":225}," ActivityResultContracts.",[219,1309,1310],{"class":466},"PickVisualMedia",[219,1312,242],{"class":225},[219,1314,1316,1319],{"class":221,"line":1315},30,[219,1317,1318],{"class":225},"    ) { uri ",[219,1320,1322],{"class":1321},"srJo8","->\n",[219,1324,1326,1329,1332,1335,1338],{"class":221,"line":1325},31,[219,1327,1328],{"class":606},"        if",[219,1330,1331],{"class":225}," (uri ",[219,1333,1334],{"class":373},"!=",[219,1336,1337],{"class":1173}," null",[219,1339,1340],{"class":225},") {\n",[219,1342,1344,1347,1349],{"class":221,"line":1343},32,[219,1345,1346],{"class":225},"            selectedUri ",[219,1348,509],{"class":373},[219,1350,1351],{"class":225}," uri\n",[219,1353,1355],{"class":221,"line":1354},33,[219,1356,1357],{"class":225},"        }\n",[219,1359,1361],{"class":221,"line":1360},34,[219,1362,275],{"class":225},[219,1364,1366],{"class":221,"line":1365},35,[219,1367,323],{"emptyLinePlaceholder":322},[219,1369,1371,1374],{"class":221,"line":1370},36,[219,1372,1373],{"class":466},"    LaunchedEffect",[219,1375,1376],{"class":225},"(selectedUri, isSpatial) {\n",[219,1378,1380,1382,1385,1387,1390,1393],{"class":221,"line":1379},37,[219,1381,503],{"class":373},[219,1383,1384],{"class":225}," uri ",[219,1386,509],{"class":373},[219,1388,1389],{"class":225}," selectedUri ?: ",[219,1391,1392],{"class":606},"return",[219,1394,1395],{"class":225},"@LaunchedEffect\n",[219,1397,1399,1402,1404],{"class":221,"line":1398},38,[219,1400,1401],{"class":225},"        isLoading ",[219,1403,509],{"class":373},[219,1405,1406],{"class":961}," true\n",[219,1408,1410],{"class":221,"line":1409},39,[219,1411,323],{"emptyLinePlaceholder":322},[219,1413,1415,1418],{"class":221,"line":1414},40,[219,1416,1417],{"class":466},"        withContext",[219,1419,1420],{"class":225},"(Dispatchers.Default) {\n",[219,1422,1424,1427,1429,1432,1435,1438],{"class":221,"line":1423},41,[219,1425,1426],{"class":225},"            RustO.",[219,1428,467],{"class":466},[219,1430,1431],{"class":225},"(context).",[219,1433,1434],{"class":466},"use",[219,1436,1437],{"class":225}," { ocr ",[219,1439,1322],{"class":1321},[219,1441,1443,1446,1449,1451,1453,1455,1458,1461],{"class":221,"line":1442},42,[219,1444,1445],{"class":373},"                val",[219,1447,1448],{"class":225}," source ",[219,1450,509],{"class":373},[219,1452,707],{"class":225},[219,1454,710],{"class":466},[219,1456,1457],{"class":225},"(uri.",[219,1459,1460],{"class":466},"toString",[219,1462,1463],{"class":225},"())\n",[219,1465,1467,1470],{"class":221,"line":1466},43,[219,1468,1469],{"class":606},"                if",[219,1471,1472],{"class":225}," (isSpatial) {\n",[219,1474,1476,1479,1482,1484,1487,1490],{"class":221,"line":1475},44,[219,1477,1478],{"class":373},"                    val",[219,1480,1481],{"class":225}," spatialRes ",[219,1483,509],{"class":373},[219,1485,1486],{"class":225}," ocr.",[219,1488,1489],{"class":466},"detectText",[219,1491,515],{"class":225},[219,1493,1495],{"class":221,"line":1494},45,[219,1496,1497],{"class":225},"                        source,\n",[219,1499,1501,1504,1507,1509,1512,1514,1516],{"class":221,"line":1500},46,[219,1502,1503],{"class":466},"                        OcrRunOptions",[219,1505,1506],{"class":225},"(output ",[219,1508,509],{"class":373},[219,1510,1511],{"class":225}," OutputGranularity.SPATIAL, lineYThreshold ",[219,1513,509],{"class":373},[219,1515,847],{"class":846},[219,1517,718],{"class":225},[219,1519,1521],{"class":221,"line":1520},47,[219,1522,1523],{"class":225},"                    )\n",[219,1525,1527,1530,1533,1536],{"class":221,"line":1526},48,[219,1528,1529],{"class":606},"                    if",[219,1531,1532],{"class":225}," (spatialRes ",[219,1534,1535],{"class":373},"is",[219,1537,1538],{"class":225}," DetectTextResult.Spatial) {\n",[219,1540,1542,1545,1547],{"class":221,"line":1541},49,[219,1543,1544],{"class":225},"                        spatialText ",[219,1546,509],{"class":373},[219,1548,1549],{"class":225}," spatialRes.text\n",[219,1551,1553,1556,1558,1561],{"class":221,"line":1552},50,[219,1554,1555],{"class":225},"                        results ",[219,1557,509],{"class":373},[219,1559,1560],{"class":466}," emptyList",[219,1562,242],{"class":225},[219,1564,1566],{"class":221,"line":1565},51,[219,1567,1568],{"class":225},"                    }\n",[219,1570,1572,1575,1578],{"class":221,"line":1571},52,[219,1573,1574],{"class":225},"                } ",[219,1576,1577],{"class":606},"else",[219,1579,438],{"class":225},[219,1581,1583,1585,1588,1590,1592,1594],{"class":221,"line":1582},53,[219,1584,1478],{"class":373},[219,1586,1587],{"class":225}," structRes ",[219,1589,509],{"class":373},[219,1591,1486],{"class":225},[219,1593,1489],{"class":466},[219,1595,515],{"class":225},[219,1597,1599],{"class":221,"line":1598},54,[219,1600,1497],{"class":225},[219,1602,1604,1606,1608,1610,1613,1615,1617],{"class":221,"line":1603},55,[219,1605,1503],{"class":466},[219,1607,1506],{"class":225},[219,1609,509],{"class":373},[219,1611,1612],{"class":225}," OutputGranularity.LINES, textScore ",[219,1614,509],{"class":373},[219,1616,847],{"class":846},[219,1618,718],{"class":225},[219,1620,1622],{"class":221,"line":1621},56,[219,1623,1523],{"class":225},[219,1625,1627,1629,1632,1634],{"class":221,"line":1626},57,[219,1628,1529],{"class":606},[219,1630,1631],{"class":225}," (structRes ",[219,1633,1535],{"class":373},[219,1635,1636],{"class":225}," DetectTextResult.Structured) {\n",[219,1638,1640,1642,1644],{"class":221,"line":1639},58,[219,1641,1555],{"class":225},[219,1643,509],{"class":373},[219,1645,1646],{"class":225}," structRes.items\n",[219,1648,1650,1652,1654],{"class":221,"line":1649},59,[219,1651,1544],{"class":225},[219,1653,509],{"class":373},[219,1655,1656],{"class":263}," \"\"\n",[219,1658,1660],{"class":221,"line":1659},60,[219,1661,1568],{"class":225},[219,1663,1665],{"class":221,"line":1664},61,[219,1666,1667],{"class":225},"                }\n",[219,1669,1671],{"class":221,"line":1670},62,[219,1672,1673],{"class":225},"            }\n",[219,1675,1677],{"class":221,"line":1676},63,[219,1678,1357],{"class":225},[219,1680,1682,1684,1686],{"class":221,"line":1681},64,[219,1683,1401],{"class":225},[219,1685,509],{"class":373},[219,1687,1688],{"class":961}," false\n",[219,1690,1692],{"class":221,"line":1691},65,[219,1693,275],{"class":225},[219,1695,1697],{"class":221,"line":1696},66,[219,1698,323],{"emptyLinePlaceholder":322},[219,1700,1702,1705,1708,1710,1713,1716,1719,1722,1724,1727],{"class":221,"line":1701},67,[219,1703,1704],{"class":466},"    Column",[219,1706,1707],{"class":225},"(modifier ",[219,1709,509],{"class":373},[219,1711,1712],{"class":225}," Modifier.",[219,1714,1715],{"class":466},"fillMaxSize",[219,1717,1718],{"class":225},"().",[219,1720,1721],{"class":466},"padding",[219,1723,417],{"class":225},[219,1725,1726],{"class":846},"16",[219,1728,1729],{"class":225},".dp)) {\n",[219,1731,1733,1736,1738,1740,1742,1745,1748,1750,1753,1756,1758,1761],{"class":221,"line":1732},68,[219,1734,1735],{"class":466},"        Row",[219,1737,1707],{"class":225},[219,1739,509],{"class":373},[219,1741,1712],{"class":225},[219,1743,1744],{"class":466},"fillMaxWidth",[219,1746,1747],{"class":225},"(), horizontalArrangement ",[219,1749,509],{"class":373},[219,1751,1752],{"class":225}," Arrangement.",[219,1754,1755],{"class":466},"spacedBy",[219,1757,417],{"class":225},[219,1759,1760],{"class":846},"8",[219,1762,1729],{"class":225},[219,1764,1766,1769],{"class":221,"line":1765},69,[219,1767,1768],{"class":466},"            Button",[219,1770,515],{"class":225},[219,1772,1774,1777,1779,1782,1785,1788,1791],{"class":221,"line":1773},70,[219,1775,1776],{"class":225},"                onClick ",[219,1778,509],{"class":373},[219,1780,1781],{"class":225}," { photoPicker.",[219,1783,1784],{"class":466},"launch",[219,1786,1787],{"class":225},"(androidx.activity.result.",[219,1789,1790],{"class":466},"PickVisualMediaRequest",[219,1792,1793],{"class":225},"()) },\n",[219,1795,1797,1800,1802,1804,1807,1809,1812],{"class":221,"line":1796},71,[219,1798,1799],{"class":225},"                modifier ",[219,1801,509],{"class":373},[219,1803,1712],{"class":225},[219,1805,1806],{"class":466},"weight",[219,1808,417],{"class":225},[219,1810,1811],{"class":846},"1f",[219,1813,718],{"class":225},[219,1815,1817],{"class":221,"line":1816},72,[219,1818,1819],{"class":225},"            ) {\n",[219,1821,1823,1826,1828,1831],{"class":221,"line":1822},73,[219,1824,1825],{"class":466},"                Text",[219,1827,417],{"class":225},[219,1829,1830],{"class":263},"\"Pilih Dokumen\"",[219,1832,718],{"class":225},[219,1834,1836],{"class":221,"line":1835},74,[219,1837,1673],{"class":225},[219,1839,1841],{"class":221,"line":1840},75,[219,1842,323],{"emptyLinePlaceholder":322},[219,1844,1846,1849],{"class":221,"line":1845},76,[219,1847,1848],{"class":466},"            FilterChip",[219,1850,515],{"class":225},[219,1852,1854,1857,1859],{"class":221,"line":1853},77,[219,1855,1856],{"class":225},"                selected ",[219,1858,509],{"class":373},[219,1860,1861],{"class":225}," isSpatial,\n",[219,1863,1865,1867,1869,1872,1874,1877],{"class":221,"line":1864},78,[219,1866,1776],{"class":225},[219,1868,509],{"class":373},[219,1870,1871],{"class":225}," { isSpatial ",[219,1873,509],{"class":373},[219,1875,1876],{"class":373}," !",[219,1878,1879],{"class":225},"isSpatial },\n",[219,1881,1883,1886,1888,1890,1893,1895,1898,1901,1904,1907,1910],{"class":221,"line":1882},79,[219,1884,1885],{"class":225},"                label ",[219,1887,509],{"class":373},[219,1889,1159],{"class":225},[219,1891,1892],{"class":466},"Text",[219,1894,417],{"class":225},[219,1896,1897],{"class":606},"if",[219,1899,1900],{"class":225}," (isSpatial) ",[219,1902,1903],{"class":263},"\"Tata Letak Spasial\"",[219,1905,1906],{"class":606}," else",[219,1908,1909],{"class":263}," \"Baris Terstruktur\"",[219,1911,1177],{"class":225},[219,1913,1915],{"class":221,"line":1914},80,[219,1916,594],{"class":225},[219,1918,1920],{"class":221,"line":1919},81,[219,1921,1357],{"class":225},[219,1923,1925],{"class":221,"line":1924},82,[219,1926,323],{"emptyLinePlaceholder":322},[219,1928,1930,1932],{"class":221,"line":1929},83,[219,1931,1328],{"class":606},[219,1933,1934],{"class":225}," (isLoading) {\n",[219,1936,1938,1941,1943,1945,1947,1949,1952,1954,1957],{"class":221,"line":1937},84,[219,1939,1940],{"class":466},"            CircularProgressIndicator",[219,1942,1707],{"class":225},[219,1944,509],{"class":373},[219,1946,1712],{"class":225},[219,1948,1721],{"class":466},[219,1950,1951],{"class":225},"(vertical ",[219,1953,509],{"class":373},[219,1955,1956],{"class":846}," 16",[219,1958,1959],{"class":225},".dp))\n",[219,1961,1963],{"class":221,"line":1962},85,[219,1964,1357],{"class":225},[219,1966,1968],{"class":221,"line":1967},86,[219,1969,323],{"emptyLinePlaceholder":322},[219,1971,1973,1976,1978,1980,1982,1985,1987,1989],{"class":221,"line":1972},87,[219,1974,1975],{"class":466},"        Spacer",[219,1977,1707],{"class":225},[219,1979,509],{"class":373},[219,1981,1712],{"class":225},[219,1983,1984],{"class":466},"height",[219,1986,417],{"class":225},[219,1988,1726],{"class":846},[219,1990,1959],{"class":225},[219,1992,1994],{"class":221,"line":1993},88,[219,1995,323],{"emptyLinePlaceholder":322},[219,1997,1999,2001,2004,2007,2010,2013],{"class":221,"line":1998},89,[219,2000,1328],{"class":606},[219,2002,2003],{"class":225}," (isSpatial ",[219,2005,2006],{"class":373},"&&",[219,2008,2009],{"class":225}," spatialText.",[219,2011,2012],{"class":466},"isNotEmpty",[219,2014,2015],{"class":225},"()) {\n",[219,2017,2019,2022],{"class":221,"line":2018},90,[219,2020,2021],{"class":466},"            Text",[219,2023,515],{"class":225},[219,2025,2027,2030,2032],{"class":221,"line":2026},91,[219,2028,2029],{"class":225},"                text ",[219,2031,509],{"class":373},[219,2033,2034],{"class":225}," spatialText,\n",[219,2036,2038,2041,2043],{"class":221,"line":2037},92,[219,2039,2040],{"class":225},"                fontFamily ",[219,2042,509],{"class":373},[219,2044,2045],{"class":225}," FontFamily.Monospace,\n",[219,2047,2049,2052,2054],{"class":221,"line":2048},93,[219,2050,2051],{"class":225},"                style ",[219,2053,509],{"class":373},[219,2055,2056],{"class":225}," MaterialTheme.typography.bodySmall\n",[219,2058,2060],{"class":221,"line":2059},94,[219,2061,594],{"class":225},[219,2063,2065,2068,2070],{"class":221,"line":2064},95,[219,2066,2067],{"class":225},"        } ",[219,2069,1577],{"class":606},[219,2071,438],{"class":225},[219,2073,2075,2078,2081,2083,2085,2087,2089,2091],{"class":221,"line":2074},96,[219,2076,2077],{"class":466},"            LazyColumn",[219,2079,2080],{"class":225},"(verticalArrangement ",[219,2082,509],{"class":373},[219,2084,1752],{"class":225},[219,2086,1755],{"class":466},[219,2088,417],{"class":225},[219,2090,1760],{"class":846},[219,2092,1729],{"class":225},[219,2094,2096,2099,2102],{"class":221,"line":2095},97,[219,2097,2098],{"class":466},"                items",[219,2100,2101],{"class":225},"(results) { item ",[219,2103,1322],{"class":1321},[219,2105,2107,2110,2112,2114,2116,2118],{"class":221,"line":2106},98,[219,2108,2109],{"class":466},"                    Card",[219,2111,1707],{"class":225},[219,2113,509],{"class":373},[219,2115,1712],{"class":225},[219,2117,1744],{"class":466},[219,2119,2015],{"class":225},[219,2121,2123,2126],{"class":221,"line":2122},99,[219,2124,2125],{"class":466},"                        Row",[219,2127,515],{"class":225},[219,2129,2131,2134,2136,2138,2140,2142,2145],{"class":221,"line":2130},100,[219,2132,2133],{"class":225},"                            modifier ",[219,2135,509],{"class":373},[219,2137,1712],{"class":225},[219,2139,1721],{"class":466},[219,2141,417],{"class":225},[219,2143,2144],{"class":846},"12",[219,2146,2147],{"class":225},".dp),\n",[219,2149,2151,2154,2156],{"class":221,"line":2150},101,[219,2152,2153],{"class":225},"                            horizontalArrangement ",[219,2155,509],{"class":373},[219,2157,2158],{"class":225}," Arrangement.SpaceBetween\n",[219,2160,2162],{"class":221,"line":2161},102,[219,2163,2164],{"class":225},"                        ) {\n",[219,2166,2168,2171,2174,2176,2179,2181,2183,2185,2187,2189],{"class":221,"line":2167},103,[219,2169,2170],{"class":466},"                            Text",[219,2172,2173],{"class":225},"(text ",[219,2175,509],{"class":373},[219,2177,2178],{"class":225}," item.text, modifier ",[219,2180,509],{"class":373},[219,2182,1712],{"class":225},[219,2184,1806],{"class":466},[219,2186,417],{"class":225},[219,2188,1811],{"class":846},[219,2190,2191],{"class":225},"))\n",[219,2193,2195,2197],{"class":221,"line":2194},104,[219,2196,2170],{"class":466},[219,2198,515],{"class":225},[219,2200,2202,2205,2207,2210,2214,2218,2221,2224,2227,2230,2233,2236,2239],{"class":221,"line":2201},105,[219,2203,2204],{"class":225},"                                text ",[219,2206,509],{"class":373},[219,2208,2209],{"class":263}," \"",[219,2211,2213],{"class":2212},"slF1C","${",[219,2215,2217],{"class":2216},"s-euU","(item.score ",[219,2219,2220],{"class":373},"*",[219,2222,2223],{"class":846}," 100",[219,2225,2226],{"class":2216},").",[219,2228,2229],{"class":466},"toInt",[219,2231,2232],{"class":2216},"()",[219,2234,2235],{"class":2212},"}",[219,2237,2238],{"class":263},"%\"",[219,2240,529],{"class":225},[219,2242,2244,2247,2249],{"class":221,"line":2243},106,[219,2245,2246],{"class":225},"                                style ",[219,2248,509],{"class":373},[219,2250,2251],{"class":225}," MaterialTheme.typography.bodySmall,\n",[219,2253,2255,2258,2260],{"class":221,"line":2254},107,[219,2256,2257],{"class":225},"                                color ",[219,2259,509],{"class":373},[219,2261,2262],{"class":225}," MaterialTheme.colorScheme.primary\n",[219,2264,2266],{"class":221,"line":2265},108,[219,2267,2268],{"class":225},"                            )\n",[219,2270,2272],{"class":221,"line":2271},109,[219,2273,2274],{"class":225},"                        }\n",[219,2276,2278],{"class":221,"line":2277},110,[219,2279,1568],{"class":225},[219,2281,2283],{"class":221,"line":2282},111,[219,2284,1667],{"class":225},[219,2286,2288],{"class":221,"line":2287},112,[219,2289,1673],{"class":225},[219,2291,2293],{"class":221,"line":2292},113,[219,2294,1357],{"class":225},[219,2296,2298],{"class":221,"line":2297},114,[219,2299,275],{"class":225},[219,2301,2303],{"class":221,"line":2302},115,[219,2304,281],{"class":225},[2306,2307,2308],"style",{},"html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sQqfL, html code.shiki .sQqfL{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sSsL9, html code.shiki .sSsL9{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .s8HiA, html code.shiki .s8HiA{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sMTiH, html code.shiki .sMTiH{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .slF1C, html code.shiki .slF1C{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#F92672}html pre.shiki code .s-euU, html code.shiki .s-euU{--shiki-light:#90A4AE;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#F8F8F2}",{"title":215,"searchDepth":229,"depth":229,"links":2310},[2311,2312,2313,2314,2316],{"id":201,"depth":229,"text":15},{"id":349,"depth":229,"text":350},{"id":665,"depth":229,"text":666},{"id":797,"depth":229,"text":2315},"3. Opsi Permintaan Lokal (OcrRunOptions)",{"id":979,"depth":229,"text":980},"Penggunaan RustO! pada aplikasi Android Kotlin dan Jetpack Compose via JitPack.","md",null,{},{"icon":59},{"title":2323,"description":2317},"Menggunakan Android (Kotlin) - RustO!","Zp-zwoaHqLFZRukxIo2Y-EOTN9hBtWsoVcLkHRfZj3s",[2326,2328],{"title":51,"path":52,"stem":53,"description":2327,"icon":54,"children":-1},"Integrasi RustO! pada aplikasi iOS Swift dan SwiftUI via Swift Package Manager (SPM) atau CocoaPods.",{"title":61,"path":62,"stem":63,"description":2329,"icon":64,"children":-1},"Panduan integrasi C \u002F C++ dan Foreign Function Interface (FFI) untuk RustO!.",1792905890510]