File size: 6,710 Bytes
73196e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import os
import zipfile
import shutil
from utils.utils import unzip_office_file, translate_text, preprocess_text, postprocess_text
from powerpoint.xml_handling import *
from pymongo import MongoClient
import gridfs
from io import BytesIO

def create_pptx_and_store_in_mongodb(temp_dir, pptx_filename):
    """
    Tạo file PPTX từ thư mục chứa nội dung đã giải nén và lưu vào MongoDB mà không lưu file trên ổ cứng.
    """
    pptx_buffer = BytesIO()  

    with zipfile.ZipFile(pptx_buffer, 'w', zipfile.ZIP_DEFLATED) as zipf:
        for root_dir, _, files in os.walk(temp_dir):
            for file in files:
                file_path = os.path.join(root_dir, file)
                arcname = os.path.relpath(file_path, temp_dir)
                zipf.write(file_path, arcname)

    pptx_buffer.seek(0)  

    client = MongoClient("mongodb+srv://admin:[email protected]/?retryWrites=true&w=majority&appName=Cluster0")
    db = client['pptx']
    fs = gridfs.GridFS(db, collection='final_file')

    file_id = fs.put(pptx_buffer, filename=pptx_filename)

    print(f"PPTX đã được lưu vào MongoDB với ID: {file_id}")
    client.close()

    return file_id

def translate_and_replace_pptx(xml_folder, file_name, source_lang='vn', target_lang='en', slides_per_batch=5):
    slides_dir = os.path.join(xml_folder, "ppt/slides")
    all_slides = sorted([f for f in os.listdir(slides_dir)
                         if f.startswith("slide") and f.endswith(".xml")],
                        key=lambda x: int(x[5:-4]))

    # Xử lý theo từng batch slide
    for i in range(0, len(all_slides), slides_per_batch):
        batch_slides = all_slides[i:i + slides_per_batch]
        slide_text_mapping = {}  
        smartart_text_mapping = {} 

        for slide_file in batch_slides:
            slide_index = int(slide_file[5:-4])
            slide_path = os.path.join(slides_dir, slide_file)
            slide_text_mapping[slide_index] = extract_text_from_slide(slide_path)  # Lấy list các tuple (text, rPr)

            # Xử lý SmartArt qua file .rels của slide
            rels_file = os.path.join(xml_folder, "ppt/slides/_rels", slide_file + ".rels")
            base_path = os.path.join(xml_folder, "ppt")
            smartart_data_path = get_smartart_data_file(rels_file, base_path)
            if smartart_data_path:
                smartart_text_mapping[slide_index] = extract_text_from_smartart(smartart_data_path) # Lấy list các tuple (text, rPr)


        # Gộp text để dịch theo batch, giữ lại rPr
        combined_slide_text_list = []
        for slide_index in sorted(slide_text_mapping.keys()):
            combined_slide_text_list.extend(slide_text_mapping[slide_index])

        combined_smartart_text_list = []
        for slide_index in sorted(smartart_text_mapping.keys()):
            combined_smartart_text_list.extend(smartart_text_mapping[slide_index])
        
        # Tách text ra khỏi tuple để dịch
        slide_texts_to_translate = [text for text, _ in combined_slide_text_list]
        smartart_texts_to_translate = [text for text, _ in combined_smartart_text_list]

        # Dịch văn bản slide và SmartArt
        combined_slide_text_string = preprocess_text(slide_texts_to_translate)
        combined_smartart_text_string = preprocess_text(smartart_texts_to_translate)

        translated_slide_string = translate_text(combined_slide_text_string, source_lang, target_lang)
        translated_smartart_string = translate_text(combined_smartart_text_string, source_lang, target_lang)

        # Postprocess để có list các văn bản đã dịch
        translated_slide_texts = postprocess_text(translated_slide_string)
        translated_smartart_texts = postprocess_text(translated_smartart_string)

        # **Quan trọng:** Tạo danh sách tuple (translated_text, rPr)
        translated_slide_data = []
        for i, (original_text, rPr) in enumerate(combined_slide_text_list):
            if i < len(translated_slide_texts):
                translated_slide_data.append((translated_slide_texts[i], rPr))
            else:
                translated_slide_data.append(("", rPr)) # Trường hợp không đủ translated text
        
        translated_smartart_data = []
        for i, (original_text, rPr) in enumerate(combined_smartart_text_list):
            if i < len(translated_smartart_texts):
                translated_smartart_data.append((translated_smartart_texts[i], rPr))
            else:
                translated_smartart_data.append(("", rPr))  # Trường hợp không đủ translated text

        # Thay thế văn bản trong slide
        slide_index = 0
        for slide_index in sorted(slide_text_mapping.keys()):
            slide_file = f"slide{slide_index}.xml"
            slide_path = os.path.join(slides_dir, slide_file)
            num_texts = len(slide_text_mapping[slide_index])
            replace_data = translated_slide_data[:num_texts]
            replace_text_in_slide(slide_path, replace_data) # truyền vào danh sách (translated_text, rPr)
            translated_slide_data = translated_slide_data[num_texts:]  # Cập nhật danh sách cho slide tiếp theo

        # Thay thế văn bản trong SmartArt
        for slide_index in sorted(smartart_text_mapping.keys()):
            rels_file = os.path.join(xml_folder, "ppt/slides/_rels", f"slide{slide_index}.xml.rels")
            base_path = os.path.join(xml_folder, "ppt")
            smartart_data_path = get_smartart_data_file(rels_file, base_path)
            if smartart_data_path:
                num_texts = len(smartart_text_mapping[slide_index])
                replace_data = translated_smartart_data[:num_texts]
                replace_text_in_smartart(smartart_data_path, replace_data, None) # truyền vào danh sách (translated_text, rPr)
                translated_smartart_data = translated_smartart_data[num_texts:]  # Cập nhật danh sách cho slide tiếp theo

    file_id = create_pptx_and_store_in_mongodb(xml_folder, file_name)
    return file_id

def translate_pptx(pptx_id, file_name, source_lang='vn', target_lang='en', slides_per_batch=5):
    client = MongoClient("mongodb+srv://admin:[email protected]/?retryWrites=true&w=majority&appName=Cluster0")
    db = client['pptx']
    fs = gridfs.GridFS(db, collection='root_file')
    
    ppt_file = fs.get(pptx_id)
    prs = BytesIO(ppt_file.read())
    
    xml_folder = unzip_office_file(prs)
    file_id =  translate_and_replace_pptx(xml_folder, file_name, source_lang, target_lang, slides_per_batch=slides_per_batch)
    shutil.rmtree(xml_folder)

    return file_id