OpenQR / app.py
Srevarshan1502's picture
Add QRForge app files for Hugging Face Spaces deployment
bb8fa59
Raw
History Blame Contribute Delete
2.35 kB
from flask import Flask, request, jsonify, send_file
import qrcode
from io import BytesIO
import base64
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from PIL import Image
app = Flask(__name__)
@app.route('/')
def index():
return open('index.html').read()
@app.route('/generate_qr', methods=['POST'])
def generate_qr():
data = request.get_json()
url = data.get('url')
if not url:
return jsonify({'error': 'URL is required'}), 400
# Generate QR code
qr = qrcode.make(url)
# Save to BytesIO buffer as PNG for display
buffer = BytesIO()
qr.save(buffer, format='PNG')
buffer.seek(0)
# Convert to base64 for frontend display
qr_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8')
qr_image = f'data:image/png;base64,{qr_base64}'
return jsonify({'qr_image': qr_image})
@app.route('/download_qr', methods=['POST'])
def download_qr():
data = request.get_json()
url = data.get('url')
format = data.get('format', 'png').lower()
if not url:
return jsonify({'error': 'URL is required'}), 400
# Generate QR code
qr = qrcode.make(url)
buffer = BytesIO()
if format == 'png':
qr.save(buffer, format='PNG')
mime_type = 'image/png'
filename = 'qr_code.png'
elif format == 'jpg':
qr.save(buffer, format='PNG') # Save as PNG first
img = Image.open(buffer).convert('RGB')
buffer = BytesIO()
img.save(buffer, format='JPEG', quality=95)
mime_type = 'image/jpeg'
filename = 'qr_code.jpg'
elif format == 'pdf':
c = canvas.Canvas(buffer, pagesize=letter)
img_buffer = BytesIO()
qr.save(img_buffer, format='PNG')
img = Image.open(img_buffer)
img_width, img_height = img.size
c.drawImage(img_buffer, (letter[0] - img_width) / 2, (letter[1] - img_height) / 2, img_width, img_height)
c.showPage()
c.save()
mime_type = 'application/pdf'
filename = 'qr_code.pdf'
else:
return jsonify({'error': 'Unsupported format'}), 400
buffer.seek(0)
return send_file(buffer, mimetype=mime_type, as_attachment=True, download_name=filename)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=False)