app.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import os
  2. import sys
  3. import uuid
  4. import tempfile
  5. import pdfplumber
  6. from flask import Flask, request, jsonify, send_file
  7. from add_signature import find_signature_positions, add_signature_to_pdf
  8. from add_watermark import add_watermark_to_pdf
  9. from extract_table import extract_temp_time, extract_pdf_table_to_excel, extract_temp_by_datetime_pattern, allowed_file, \
  10. safe_filename
  11. from lib import Qiniu
  12. from werkzeug.utils import secure_filename
  13. app = Flask(__name__)
  14. UPLOAD_FOLDER = tempfile.gettempdir()
  15. app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
  16. @app.route('/add_signature', methods=['POST'])
  17. def add_signature():
  18. try:
  19. # 获取请求参数
  20. data = request.get_json()
  21. pdf_url = data.get('pdf_url')
  22. if not pdf_url:
  23. return jsonify({"error": "缺少pdf_url参数"}), 400
  24. # 下载PDF文件
  25. local_pdf = Qiniu.download_file(pdf_url)
  26. # 查找签名位置(使用默认公章图片)
  27. signature_img = './static/报告专用章.png' # 确保项目目录下有这个文件
  28. positions = find_signature_positions(local_pdf)
  29. if not positions:
  30. os.remove(local_pdf)
  31. return jsonify({"error": "未找到签名位置"}), 400
  32. # 生成带公章的PDF
  33. signature_pdf = os.path.join("./temp", f"signature_{os.path.basename(local_pdf)}")
  34. add_signature_to_pdf(local_pdf, signature_pdf, signature_img, positions)
  35. # 上传到七牛云
  36. file_key = f"UpImage/{uuid.uuid4()}.pdf"
  37. new_pdf_url = Qiniu.upload_to_qiniu(signature_pdf, file_key)
  38. # 清理临时文件
  39. os.remove(local_pdf)
  40. os.remove(signature_pdf)
  41. return jsonify({
  42. "success": True,
  43. "signature_pdf_url": new_pdf_url
  44. })
  45. except Exception as e:
  46. return jsonify({
  47. "error": str(e),
  48. "success": False,
  49. }), 500
  50. @app.route('/add_watermark', methods=['POST'])
  51. def add_watermark():
  52. try:
  53. # 获取请求参数
  54. data = request.get_json()
  55. pdf_url = data.get('pdf_url')
  56. if not pdf_url:
  57. return jsonify({"error": "缺少pdf_url参数"}), 400
  58. # 下载PDF文件
  59. local_pdf = Qiniu.download_file(pdf_url)
  60. # 水印文件
  61. pdf_file_mark = './static/watermark.pdf' # 确保项目目录下有这个文件
  62. # 生成带公章的PDF
  63. watermark_pdf = os.path.join("./temp", f"watermark_{os.path.basename(local_pdf)}")
  64. add_watermark_to_pdf(local_pdf, pdf_file_mark, watermark_pdf)
  65. # 上传到七牛云
  66. file_key = f"UpImage/{uuid.uuid4()}.pdf"
  67. new_pdf_url = Qiniu.upload_to_qiniu(watermark_pdf, file_key)
  68. # 清理临时文件
  69. os.remove(local_pdf)
  70. os.remove(watermark_pdf)
  71. return jsonify({
  72. "success": True,
  73. "watermark_pdf_url": new_pdf_url
  74. })
  75. except Exception as e:
  76. return jsonify({
  77. "error": str(e),
  78. "success": False,
  79. }), 500
  80. @app.route('/extract_table', methods=['POST'])
  81. def extract_table():
  82. if 'file' not in request.files:
  83. return jsonify({'error': 'No file part'}), 400
  84. file = request.files['file']
  85. if file.filename == '':
  86. return jsonify({'error': 'No selected file'}), 400
  87. if file and allowed_file(file.filename):
  88. original_filename = file.filename
  89. filename = safe_filename(original_filename)
  90. # filename = secure_filename(safe_name)
  91. filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
  92. file.save(filepath)
  93. df = None
  94. with pdfplumber.open(filepath) as pdf:
  95. # 获取第一页
  96. first_page = pdf.pages[0]
  97. text = first_page.extract_text()
  98. if text:
  99. if "温湿度数据报告" in text:
  100. df = extract_pdf_table_to_excel(filepath)
  101. if "历史数据表" in text:
  102. df = extract_temp_time(filepath)
  103. if "设备汇总报告" in text:
  104. df = extract_temp_by_datetime_pattern(filepath)
  105. if df is None:
  106. os.remove(filepath)
  107. return jsonify({'error': '所有处理方法均失败'}), 400
  108. # 保存Excel文件
  109. output_filename = filename.replace('.pdf', '.xlsx')
  110. output_path = os.path.join(app.config['UPLOAD_FOLDER'], output_filename)
  111. df.to_excel(output_path, index=False, engine='openpyxl')
  112. # 删除上传的PDF文件
  113. os.remove(filepath)
  114. # 返回Excel文件
  115. try:
  116. return send_file(
  117. output_path,
  118. as_attachment=True,
  119. download_name=output_filename,
  120. mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  121. )
  122. finally:
  123. # 确保临时文件最终被删除
  124. try:
  125. os.remove(output_path)
  126. except:
  127. pass
  128. else:
  129. return jsonify({'error': 'Invalid file type'}), 400
  130. if __name__ == '__main__':
  131. print("项目地址:", os.path.dirname(__file__))
  132. if len(sys.argv) != 2:
  133. print("请填写端口号")
  134. sys.exit()
  135. # app.debug = True # 设置调试模式,生产模式的时候要关掉debug
  136. # app.config['JSON_AS_ASCII'] = False
  137. app.run(host='0.0.0.0', port=6500, debug=True)