pdf-web-toolkit/app.py

231 lines
7.3 KiB
Python
Raw Normal View History

2023-12-06 21:26:14 +00:00
import shutil
2023-10-11 17:51:35 +00:00
import os
2024-01-26 15:24:53 +00:00
import glob
import traceback
2023-12-06 21:26:14 +00:00
from flask import Flask, render_template, request, redirect, jsonify, send_from_directory
2024-01-23 16:40:03 +00:00
from pdf_util.pdf_project_manager import pdf_project_manager
2024-01-05 10:53:12 +00:00
import datetime as dt
import logging
import sys
# Setup Logging
logging.basicConfig(
# level=logging.ERROR,
# level=logging.INFO,
level=logging.DEBUG,
2024-01-05 16:40:16 +00:00
format=str(dt.datetime.now()).replace(" ", "_") + " | %(asctime)s [%(levelname)s] %(message)s",
2024-01-05 10:53:12 +00:00
handlers=[
logging.FileHandler("/var/log/" + str(dt.datetime.today().strftime('%Y-%m-%d')) + "_-_cron.log"),
logging.StreamHandler(sys.stdout)
]
)
2023-10-11 17:51:35 +00:00
2024-03-07 10:54:03 +00:00
app = Flask(__name__, static_folder=os.path.abspath('/app/static'))
2024-01-05 10:53:12 +00:00
app.config['UPLOAD_FOLDER'] = 'uploads'
2023-10-11 17:51:35 +00:00
2023-12-06 21:26:14 +00:00
2023-10-11 17:51:35 +00:00
@app.route('/')
def index():
2024-03-07 15:17:38 +00:00
return redirect("/split", code=302)
@app.route('/project')
def project():
2024-03-07 10:54:03 +00:00
return render_template('base.html', page='project', settings='set', error=False)
2024-03-07 15:17:38 +00:00
@app.route('/split')
2024-03-08 08:43:48 +00:00
def split():
2024-03-07 15:17:38 +00:00
return render_template('base.html', page='split', settings='set', error=False)
2024-03-07 10:54:03 +00:00
@app.route('/merge')
def merge():
return render_template('base.html', page='merge', settings='set', error=False)
@app.route('/ocr')
def ocr():
return render_template('base.html', page='ocr', settings='set', error=False)
2023-10-11 17:51:35 +00:00
2023-12-06 21:26:14 +00:00
2023-10-11 17:51:35 +00:00
@app.route('/split/<path:path>')
def send_report(path):
return send_from_directory('split', path)
2023-12-06 21:26:14 +00:00
@app.route('/merge/<path:path>')
def send_merge(path):
return send_from_directory('merge', path)
2024-01-26 15:24:53 +00:00
@app.route('/projects/<path:path>')
def get_project(path):
return send_from_directory('projects', path)
@app.route('/get_single_pages_archive/<uuid>/')
def get_single_pages_archive(uuid):
try:
shutil.make_archive('pdf_splitted', 'zip', "/app/projects/" + uuid + '/splitted')
os.rename('/app/pdf_splitted.zip', '/app/projects/' + uuid + '/pdf_splitted.zip')
response = jsonify({'status': 200, 'url': '/projects/' + uuid + '/pdf_splitted.zip'})
except Exception as e:
logging.debug("There was an error: " + str(e))
logging.debug("Stacktrace: " + str(traceback.format_exc()))
response = jsonify({"status": 500, "error_message": e})
return response
@app.route('/get_single_pages_info/<uuid>/')
def get_single_pages_info(uuid):
try:
pages = []
page_list = glob.glob("/app/projects/" + uuid + "/splitted/*.pdf")
logging.debug("page_list: ")
logging.debug(page_list)
page_list.sort()
logging.debug("sorted_page_list: ")
logging.debug(page_list)
for file in page_list:
pages.append(file[4:]) # Cut of /app
response = jsonify({'status': 200, 'pages': pages})
except Exception as e:
logging.debug("There was an error: " + str(e))
logging.debug("Stacktrace: " + str(traceback.format_exc()))
response = jsonify({"status": 500, "error_message": e})
return response
2024-03-07 10:54:03 +00:00
@app.route('/move_page/<uuid>/<from_page>/<to_page>')
def move_page(uuid, from_page, to_page):
try:
pdf_project = pdf_project_manager(uuid4=uuid)
logging.debug("int(from_page): ")
logging.debug(int(from_page))
logging.debug("int(to_page): ")
logging.debug(int(to_page))
pdf_project.move_page(from_location=int(from_page), to_location=int(to_page))
response = jsonify({'status': 200, 'message': 'page moved successfully'})
except Exception as e:
logging.debug("There was an error: " + str(e))
logging.debug("Stacktrace: " + str(traceback.format_exc()))
response = jsonify({"status": 500, "error_message": e})
return response
2023-12-06 21:26:14 +00:00
@app.route('/split_to_zip', methods=['POST'])
def split_to_zip():
2024-01-23 15:27:40 +00:00
if 'pdf_1' not in request.files:
2023-10-11 17:51:35 +00:00
return redirect(request.url)
2024-01-23 15:27:40 +00:00
pdf_file = request.files['pdf_1']
2023-10-11 17:51:35 +00:00
if pdf_file.filename == '':
return redirect(request.url)
if pdf_file:
2024-01-05 10:53:12 +00:00
in_filename = pdf_file.filename.rsplit('.', 1)[0]
2023-10-11 17:51:35 +00:00
filename = os.path.join(app.config['UPLOAD_FOLDER'], pdf_file.filename)
pdf_file.save(filename)
2024-01-23 16:40:03 +00:00
# Use pdf_project_manager to split File
pdf_project = pdf_project_manager()
pdf_project.add_pdf(filename)
2023-10-11 17:51:35 +00:00
2024-01-05 10:53:12 +00:00
logging.debug(in_filename)
logging.debug(os.path.splitext(pdf_file.filename)[0])
2024-01-23 15:27:40 +00:00
2024-01-23 16:40:03 +00:00
shutil.make_archive(in_filename + '_splitted', 'zip', "/app/projects/" + pdf_project.uuid + '/splitted')
2024-01-05 10:53:12 +00:00
zip_filename = in_filename + "_splitted.zip"
2023-10-11 17:51:35 +00:00
os.rename("/app/" + zip_filename, "/app/split/" + zip_filename)
response = jsonify({"url": "/split/" + zip_filename, "name": zip_filename})
# response.headers.add("Access-Control-Allow-Origin", "*")
return response
2023-12-06 21:26:14 +00:00
@app.route('/merge_to_pdf', methods=['POST'])
def merge_to_pdf():
if 'pdf_1' not in request.files or 'pdf_2' not in request.files:
return redirect(request.url)
pdf_file_1 = request.files['pdf_1']
pdf_file_2 = request.files['pdf_2']
if pdf_file_1.filename == '' or pdf_file_2.filename == '':
return redirect(request.url)
if pdf_file_1:
2024-01-05 10:53:12 +00:00
filename_1 = os.path.join(os.path.dirname(os.path.realpath(__file__)), app.config['UPLOAD_FOLDER'], pdf_file_1.filename)
2023-12-06 21:26:14 +00:00
pdf_file_1.save(filename_1)
if pdf_file_2:
2024-01-05 10:53:12 +00:00
filename_2 = os.path.join(os.path.dirname(os.path.realpath(__file__)), app.config['UPLOAD_FOLDER'], pdf_file_2.filename)
2023-12-06 21:26:14 +00:00
pdf_file_2.save(filename_2)
if pdf_file_1 and pdf_file_2:
2024-01-05 10:53:12 +00:00
logging.debug(filename_1)
logging.debug(filename_2)
2023-12-06 21:26:14 +00:00
2024-01-23 16:40:03 +00:00
# Use pdf_project_manager to split File
pdf_project = pdf_project_manager()
pdf_project.add_pdf(filename_1)
pdf_project.add_pdf(filename_2)
out_path = "/app/projects/" + pdf_project.uuid + "/complete.pdf"
2024-01-05 10:53:12 +00:00
logging.debug(out_path)
os.rename(out_path, "/app/merge/merger.pdf")
2023-12-06 21:26:14 +00:00
2024-01-05 10:53:12 +00:00
response = jsonify({"url": '/merge/merger.pdf', "name": os.path.splitext(os.path.basename(out_path))[0]})
return response
2023-12-06 21:26:14 +00:00
2024-01-26 15:24:53 +00:00
@app.route('/init_project/', methods=['GET'])
def init_project():
try:
pdf_project = pdf_project_manager()
response = jsonify({"status": 200, "project_uuid": pdf_project.uuid})
except Exception as e:
logging.debug("There was an error: " + str(e))
logging.debug("Stacktrace: " + str(traceback.format_exc()))
response = jsonify({"status": 500, "project_uuid": ''})
return response
@app.route('/add_pdf_to_project/', methods=['POST'])
def add_pdf_to_project():
try:
if 'pdf' not in request.files:
logging.debug(request)
return redirect(request.url)
else:
pdf_file = request.files['pdf']
filename_1 = os.path.join(os.path.dirname(os.path.realpath(__file__)), app.config['UPLOAD_FOLDER'], pdf_file.filename)
pdf_file.save(filename_1)
pdf_file = request.files['pdf']
uuid = request.form['uuid']
logging.debug(pdf_file)
logging.debug(uuid)
pdf_project = pdf_project_manager(uuid4=uuid)
pdf_project.add_pdf(filename_1)
response = jsonify({"status": 200, "message": 'PDF added'})
except Exception as e:
logging.debug("There was an error: " + str(e))
logging.debug("Stacktrace: " + str(traceback.format_exc()))
response = jsonify({"status": 500, "error_message": e})
return response
2023-10-11 17:51:35 +00:00
if __name__ == '__main__':
2023-12-06 21:26:14 +00:00
2023-10-11 17:51:35 +00:00
app.run(debug=True)