import os import glob import comtypes.client import docx from fastapi import FastAPI, File, UploadFile from pydantic import BaseModel from starlette.responses import FileResponse import zipfile import io app = FastAPI() UPLOAD_FOLDER = 'uploads/' if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) @app.post('/convert') async def convert_pdfs(pdf_files: list[UploadFile] = File(...)): if not pdf_files: return {"detail": "No selected file"} for pdf_file in pdf_files: filename = pdf_file.filename with open(os.path.join(UPLOAD_FOLDER, filename), "wb") as f: f.write(await pdf_file.read()) path_pdf = UPLOAD_FOLDER path_docx = UPLOAD_FOLDER word = comtypes.client.CreateObject('Word.Application') word.visible = 0 for i, doc in enumerate(glob.iglob(path_pdf + '*.pdf')): filename = doc.split('\\')[-1] in_file = os.path.abspath(doc) wdoc = word.Documents.Open(in_file) out_file = os.path.abspath(path_docx + filename[:-4] + '.docx') wdoc.SaveAs2(out_file, FileFormat=16) wdoc.Close() word.Quit() memory_file = io.BytesIO() with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf: for root, _, filenames in os.walk(UPLOAD_FOLDER): for filename in filenames: if filename.endswith('.docx'): filepath = os.path.join(root, filename) zf.write(filepath, filename) memory_file.seek(0) return FileResponse(memory_file, filename='converted_docx.zip', media_type='application/zip') if __name__ == '__main__': import uvicorn uvicorn.run(app, host='0.0.0.0', port=7860)