Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -114,4 +114,62 @@ def generate_heatmap(risk_scores):
|
|
| 114 |
buffer.seek(0)
|
| 115 |
return buffer
|
| 116 |
|
| 117 |
-
def generate_pdf_report(results,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
buffer.seek(0)
|
| 115 |
return buffer
|
| 116 |
|
| 117 |
+
def generate_pdf_report(results, heatmap_buffer):
|
| 118 |
+
"""Generate PDF report with summary and heatmap."""
|
| 119 |
+
buffer = BytesIO()
|
| 120 |
+
c = canvas.Canvas(buffer, pagesize=letter)
|
| 121 |
+
c.setFont("Helvetica", 12)
|
| 122 |
+
c.drawString(50, 750, "Contract Risk Analysis Report")
|
| 123 |
+
|
| 124 |
+
# Summary
|
| 125 |
+
c.drawString(50, 720, "Summary of Risk-Prone Clauses:")
|
| 126 |
+
y = 700
|
| 127 |
+
for result in results[:5]: # Limit to top 5 for brevity
|
| 128 |
+
text = f"Clause {result['clause_id']}: {result['clause_type'].capitalize()} (Risk: {result['risk_score']})"
|
| 129 |
+
c.drawString(50, y, text[:80] + "..." if len(text) > 80 else text)
|
| 130 |
+
y -= 20
|
| 131 |
+
|
| 132 |
+
# Embed heatmap
|
| 133 |
+
if heatmap_buffer:
|
| 134 |
+
c.drawImage(BytesIO(heatmap_buffer.read()), 50, y-200, width=500, height=100)
|
| 135 |
+
|
| 136 |
+
c.showPage()
|
| 137 |
+
c.save()
|
| 138 |
+
buffer.seek(0)
|
| 139 |
+
return buffer
|
| 140 |
+
|
| 141 |
+
def process_contract(pdf_file):
|
| 142 |
+
"""Main function to process uploaded contract."""
|
| 143 |
+
# Extract text
|
| 144 |
+
text = extract_text_from_pdf(pdf_file)
|
| 145 |
+
if "Error" in text:
|
| 146 |
+
return text, None, None, {"Error": text}
|
| 147 |
+
|
| 148 |
+
# Parse and classify
|
| 149 |
+
results, risk_scores = parse_contract(text)
|
| 150 |
+
if not results:
|
| 151 |
+
return "No relevant clauses detected.", None, None, {"Summary": "No risk-prone clauses found."}
|
| 152 |
+
|
| 153 |
+
# Generate outputs
|
| 154 |
+
json_output = json.dumps(results, indent=2)
|
| 155 |
+
heatmap_buffer = generate_heatmap(risk_scores)
|
| 156 |
+
pdf_report = generate_pdf_report(results, heatmap_buffer)
|
| 157 |
+
|
| 158 |
+
return json_output, heatmap_buffer, pdf_report, {"Summary": f"Detected {len(results)} risk-prone clauses."}
|
| 159 |
+
|
| 160 |
+
# Gradio interface
|
| 161 |
+
iface = gr.Interface(
|
| 162 |
+
fn=process_contract,
|
| 163 |
+
inputs=gr.File(label="Upload Contract PDF"),
|
| 164 |
+
outputs=[
|
| 165 |
+
gr.Textbox(label="JSON Output"),
|
| 166 |
+
gr.Image(label="Risk Heatmap"),
|
| 167 |
+
gr.File(label="Download PDF Report"),
|
| 168 |
+
gr.JSON(label="Summary")
|
| 169 |
+
],
|
| 170 |
+
title="Contract Risk Analyzer",
|
| 171 |
+
description="Upload a contract PDF to analyze risk-prone clauses and visualize results."
|
| 172 |
+
)
|
| 173 |
+
|
| 174 |
+
if __name__ == "__main__":
|
| 175 |
+
iface.launch()
|