File size: 4,067 Bytes
d9df056
 
 
 
1414f69
 
 
d9df056
 
1414f69
d9df056
 
 
 
 
 
 
 
 
 
 
 
8e6ef27
d9df056
 
 
 
 
 
1414f69
 
d9df056
 
 
 
 
ee2be50
d9df056
 
 
 
 
1414f69
 
d9df056
1414f69
 
 
d9df056
 
 
 
 
 
 
1414f69
 
 
d9df056
 
1414f69
 
d9df056
 
1414f69
d9df056
 
1414f69
 
 
 
 
 
 
d9df056
 
 
1414f69
 
d9df056
 
 
 
 
 
1414f69
d9df056
 
 
1414f69
 
 
 
 
 
 
 
 
d9df056
 
1414f69
d9df056
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const fs = require('fs');
const https = require('https');

async function extractTextFromImage(imageBuffer) {
    console.log('[DEBUG] extractTextFromImage: Starting image text extraction');
    console.log('[DEBUG] Image buffer size:', imageBuffer.length, 'bytes');
    
    return new Promise((resolve, reject) => {
        const base64Image = imageBuffer.toString('base64');
        console.log('[DEBUG] Base64 image length:', base64Image.length);

        const requestData = JSON.stringify({
            "contents": [
                {
                    "parts": [
                        {
                            "inline_data": {
                                "mime_type": "image/png",
                                "data": base64Image
                            }
                        },
                        {
                            "text": "Berikan text yang ada di gambar ini saja, tidak ada informasi lain cukup yang ada di gambar saja, jangan ada text lain kalo bukan dari gambar nya."
                        }
                    ]
                }
            ]
        });

        console.log('[DEBUG] Request data prepared, length:', requestData.length);

        const options = {
            hostname: 'generativelanguage.googleapis.com',
            path: '/v1beta/models/gemini-2.5-flash-lite:generateContent',
            method: 'POST',
            headers: {
                'x-goog-api-key': 'AIzaSyB3-2egs0udKCDX_F7I58uVRAwv7OUX1G8',
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(requestData)
            }
        };

        console.log('[DEBUG] Making request to Gemini API...');

        const req = https.request(options, (res) => {
            console.log('[DEBUG] API Response status:', res.statusCode);
            console.log('[DEBUG] API Response headers:', res.headers);

            let data = '';

            res.on('data', (chunk) => {
                data += chunk;
            });

            res.on('end', () => {
                console.log('[DEBUG] Received all response data');
                console.log('[DEBUG] Response data length:', data.length);
                
                try {
                    const response = JSON.parse(data);
                    console.log('[DEBUG] Response parsed successfully');
                    
                    if (response.candidates && response.candidates[0] && response.candidates[0].content) {
                        const text = response.candidates[0].content.parts[0].text;
                        console.log('[DEBUG] βœ… Text extracted:', text);
                        resolve({ status: true, response: text });
                    } else {
                        console.log('[DEBUG] ❌ No text found in response');
                        console.log('[DEBUG] Response structure:', JSON.stringify(response, null, 2));
                        
                        if (response.error) {
                            console.log('[DEBUG] API Error:', response.error);
                        }
                        
                        resolve({ status: false, response: 'Tidak ada teks yang ditemukan' });
                    }
                } catch (error) {
                    console.error('[DEBUG] ❌ JSON parse error:', error);
                    console.log('[DEBUG] Raw response data:', data);
                    reject(error);
                }
            });
        });

        req.on('error', (error) => {
            console.error('[DEBUG] ❌ Request error:', error);
            reject(error);
        });

        req.on('timeout', () => {
            console.error('[DEBUG] ❌ Request timeout');
            req.destroy();
            reject(new Error('Request timeout'));
        });

        req.setTimeout(30000); // 30 second timeout

        console.log('[DEBUG] Sending request...');
        req.write(requestData);
        req.end();
        console.log('[DEBUG] Request sent');
    });
}

module.exports = { extractTextFromImage };