main.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. import uvicorn
  2. from fastapi import FastAPI,Form
  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)