import os import tempfile import zipfile from flask import Flask, request, render_template_string, send_from_directory from werkzeug.utils import secure_filename from PyPDF2 import PdfReader app = Flask(__name__) app.config['UPLOAD_FOLDER'] = tempfile.mkdtemp() app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024 # 100MB limit ALLOWED_EXTENSIONS = {'pdf', 'zip'} def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def extract_names_from_pdf(pdf_path): try: reader = PdfReader(pdf_path) fields = reader.get_fields() last_name = fields.get('Last Name', {}).get('/V', '') first_name = fields.get('First Name', {}).get('/V', '') if last_name and first_name: return f"{last_name}_{first_name}.pdf" else: return None except Exception as e: return None @app.route('/', methods=['GET', 'POST']) def upload_files(): if request.method == 'POST': files = request.files.getlist('files') processed_files = [] temp_extract_dirs = [] for file in files: if file and allowed_file(file.filename): filename = secure_filename(file.filename) filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(filepath) if filename.lower().endswith('.zip'): # Extract ZIP extract_dir = os.path.join(app.config['UPLOAD_FOLDER'], 'extract_' + os.path.splitext(filename)[0]) os.makedirs(extract_dir, exist_ok=True) temp_extract_dirs.append(extract_dir) with zipfile.ZipFile(filepath, 'r') as zip_ref: zip_ref.extractall(extract_dir) # Process PDFs in extract_dir for root, dirs, files_in_zip in os.walk(extract_dir): for f in files_in_zip: if f.lower().endswith('.pdf'): pdf_path = os.path.join(root, f) new_name = extract_names_from_pdf(pdf_path) if new_name: new_path = os.path.join(root, new_name) counter = 1 while os.path.exists(new_path): base, ext = os.path.splitext(new_name) new_path = os.path.join(root, f"{base}_{counter}{ext}") counter += 1 os.rename(pdf_path, new_path) processed_files.append(('success', os.path.relpath(new_path, extract_dir), new_path)) else: processed_files.append(('skipped', f, None)) else: # Single PDF new_name = extract_names_from_pdf(filepath) if new_name: new_filepath = os.path.join(app.config['UPLOAD_FOLDER'], new_name) counter = 1 while os.path.exists(new_filepath): base, ext = os.path.splitext(new_name) new_filepath = os.path.join(app.config['UPLOAD_FOLDER'], f"{base}_{counter}{ext}") counter += 1 os.rename(filepath, new_filepath) processed_files.append(('success', os.path.basename(new_filepath), new_filepath)) else: processed_files.append(('skipped', filename, None)) # Create ZIP of all successful renames successful_files = [p for p in processed_files if p[0] == 'success'] if successful_files: zip_output = os.path.join(app.config['UPLOAD_FOLDER'], 'renamed_files.zip') with zipfile.ZipFile(zip_output, 'w') as zip_out: for _, rel_name, full_path in successful_files: zip_out.write(full_path, rel_name) zip_name = 'renamed_files.zip' else: zip_name = None skipped = [p[1] for p in processed_files if p[0] == 'skipped'] return render_template_string(''' Results Logo

Processing Results

{% if zip_name %}

Download Renamed PDFs (ZIP)

{% endif %}

Skipped Files:

Upload more files ''', zip_name=zip_name, skipped=skipped) return render_template_string(''' PDF Renamer Logo

Upload PDF Files or ZIP to Rename



''') @app.route('/download/') def download_file(filename): return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True) if __name__ == '__main__': app.run(debug=True, port=3000)