main.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import uvicorn
  2. from fastapi import FastAPI, Form, HTTPException
  3. from pydantic import BaseModel
  4. from tool.pdf2md import pdf2ai
  5. from utils import dmQuery
  6. from utils.shellUtil import execute_command_on_linux
  7. from utils.text_to_html import save_html_to_file
  8. from utils.markd_pdf.markdown_pdf import *
  9. from utils.markd_pdf.minio_upload import *
  10. from utils.markd_pdf.save_markdown import *
  11. app = FastAPI() # 创建API实例
  12. @app.get("/")
  13. async def root():
  14. return {"message": "Hello World"}
  15. # 将数据模型定义为继承BaseModel的类
  16. class Item(BaseModel):
  17. sql: str
  18. class Pdf2md(BaseModel):
  19. pdfUrl: str
  20. prompt: str
  21. pageNum: int
  22. class Saved2text(BaseModel):
  23. htmlContent: str
  24. fileName: str
  25. class MarkdownRequest(BaseModel):
  26. content: str #Markdown文本内容
  27. output_dir: Optional[str] = os.getcwd() # 输出文件保存目录(可选),默认保存在当前目录
  28. keep_docx: Optional[bool] = False #是否保留中间生成的DOCX文件(可选),仅PDF转换时有效
  29. class MinIORequest(BaseModel):
  30. file_path: str #本地文件路径,例如:D:/output/test.pdf
  31. object_name: Optional[str] = None #MinIO中存储的文件名(可选),默认使用本地文件名
  32. class MinIODownloadRequest(BaseModel):
  33. object_name: str # MinIO中要下载的文件名
  34. local_file_path: Optional[str] = None # 本地保存路径(可选),默认保存在当前目录
  35. @app.put("/exsql")
  36. async def create_item( item: Item, q: str = None):
  37. result = {**item.dict()}
  38. results = dmQuery.execute_query(item.sql)
  39. return results
  40. @app.put("/exshell")
  41. async def create_item( item: Item, q: str = None):
  42. # 配置 Linux 服务器信息
  43. host = '119.29.146.254'
  44. port = 22
  45. username = 'root'
  46. password = 'zrd1236987!'
  47. # 要执行的命令
  48. result = execute_command_on_linux(host, port, username, password, item.sql)
  49. return result
  50. @app.put("/pdf2md")
  51. async def pdf2md(item: Pdf2md, q: str = None):
  52. pdf_url = 'http://42.194.163.46:9007/ywd/%E6%89%AB%E6%8F%8F%E5%85%A8%E8%83%BD%E7%8E%8B%202025-03-20%2021.38.pdf'
  53. prompt = "提取有效信息,只输出图片有效信息无效信息不用。"
  54. result = pdf2ai(item.pdfUrl, item.prompt, item.pageNum)
  55. return result
  56. @app.put("/md2html")
  57. async def saved2text(htmlContent: str = Form(...), fileName: str = Form(...)):
  58. pdf_url = 'http://42.194.163.46:9007/ywd/%E6%89%AB%E6%8F%8F%E5%85%A8%E8%83%BD%E7%8E%8B%202025-03-20%2021.38.pdf'
  59. prompt = "提取有效信息,只输出图片有效信息无效信息不用。"
  60. result = save_html_to_file(htmlContent, fileName)
  61. return result
  62. @app.get("/test")
  63. async def test_api():
  64. """
  65. 测试接口
  66. :return: 包含测试信息的JSON响应
  67. """
  68. return {
  69. "status": "success",
  70. "message": "服务运行正常",
  71. "timestamp": os.path.getmtime(__file__),
  72. "version": "1.0.0"
  73. }
  74. @app.post("/convert/pdf",
  75. summary="Markdown转PDF",
  76. description="将Markdown文本内容转换为PDF文件,支持中文和代码高亮")
  77. async def convert_to_pdf(request: MarkdownRequest):
  78. try:
  79. # 创建临时文件保存Markdown内容
  80. temp_md = "temp.md"
  81. with open(temp_md, "w", encoding="utf-8") as f:
  82. f.write(request.content)
  83. # 转换PDF
  84. pdf_path = markdown_to_pdf(temp_md, request.output_dir)
  85. # 清理临时文件
  86. os.remove(temp_md)
  87. return {"status": "success", "pdf_path": pdf_path}
  88. except Exception as e:
  89. raise HTTPException(status_code=500, detail=str(e))
  90. @app.post("/convert/docx",
  91. summary="Markdown转DOCX",
  92. description="将Markdown文本内容转换为DOCX文件,保留原始格式")
  93. async def convert_to_docx(request: MarkdownRequest):
  94. try:
  95. # 创建临时文件保存Markdown内容
  96. temp_md = "temp.md"
  97. with open(temp_md, "w", encoding="utf-8") as f:
  98. f.write(request.content)
  99. # 转换DOCX
  100. docx_path = markdown_to_docx(temp_md, request.output_dir)
  101. # 清理临时文件
  102. os.remove(temp_md)
  103. return {"status": "success", "docx_path": docx_path}
  104. except Exception as e:
  105. raise HTTPException(status_code=500, detail=str(e))
  106. @app.post("/save/markdown",
  107. summary="保存Markdown文件",
  108. description="将Markdown内容保存为本地文件")
  109. async def save_markdown_file(request: MarkdownRequest):
  110. try:
  111. # 使用当前时间戳作为默认文件名
  112. import time
  113. filename = f"markdown_{int(time.time())}"
  114. # 保存文件
  115. filepath = save_markdown(request.content, filename, request.output_dir)
  116. return {
  117. "status": "success",
  118. "message": "Markdown文件保存成功",
  119. "file_path": filepath
  120. }
  121. except Exception as e:
  122. raise HTTPException(status_code=500, detail=str(e))
  123. @app.post("/minio/upload",
  124. summary="上传文件到MinIO",
  125. description="将本地文件上传到MinIO存储服务")
  126. async def upload_file(request: MinIORequest):
  127. try:
  128. success = upload_to_minio(request.file_path, request.object_name)
  129. if success:
  130. return {"status": "success", "message": "文件上传成功"}
  131. else:
  132. raise HTTPException(status_code=500, detail="文件上传失败")
  133. except Exception as e:
  134. raise HTTPException(status_code=500, detail=str(e))
  135. @app.post("/minio/download",
  136. summary="从MinIO下载文件",
  137. description="从MinIO存储服务下载文件到本地")
  138. async def download_file(request: MinIODownloadRequest):
  139. try:
  140. success = download_from_minio(request.object_name, request.local_file_path)
  141. if success:
  142. return {"status": "success", "message": "文件下载成功"}
  143. else:
  144. raise HTTPException(status_code=500, detail="文件下载失败")
  145. except Exception as e:
  146. raise HTTPException(status_code=500, detail=str(e))
  147. if __name__ == "__main__":
  148. uvicorn.run(app, host="0.0.0.0", port=29015, timeout_keep_alive=600)