app.py 5.6 KB

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