Update app.py
Browse files
app.py
CHANGED
@@ -161,14 +161,30 @@ def _download_buttons(results: Dict[str, Any], df: pd.DataFrame):
|
|
161 |
# PDF
|
162 |
with c3:
|
163 |
try:
|
164 |
-
pdf_obj = generate_pdf_report(results)
|
|
|
|
|
|
|
165 |
if isinstance(pdf_obj, (bytes, bytearray)):
|
166 |
pdf_bytes = pdf_obj
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
167 |
else:
|
168 |
-
# Assume
|
169 |
with open(pdf_obj, "rb") as f:
|
170 |
pdf_bytes = f.read()
|
171 |
|
|
|
|
|
|
|
172 |
st.download_button(
|
173 |
"Download PDF",
|
174 |
data=pdf_bytes,
|
@@ -181,6 +197,7 @@ def _download_buttons(results: Dict[str, Any], df: pd.DataFrame):
|
|
181 |
logger.exception(f"PDF generation failed: {e}")
|
182 |
|
183 |
|
|
|
184 |
def _render_audio(audio_files: Dict[str, Any]):
|
185 |
if not audio_files:
|
186 |
return
|
|
|
161 |
# PDF
|
162 |
with c3:
|
163 |
try:
|
164 |
+
pdf_obj = generate_pdf_report(results)
|
165 |
+
|
166 |
+
# Accept bytes, BytesIO/file-like, or path
|
167 |
+
pdf_bytes = None
|
168 |
if isinstance(pdf_obj, (bytes, bytearray)):
|
169 |
pdf_bytes = pdf_obj
|
170 |
+
elif hasattr(pdf_obj, "read"): # file-like object
|
171 |
+
try:
|
172 |
+
pdf_bytes = pdf_obj.read()
|
173 |
+
if not pdf_bytes and hasattr(pdf_obj, "getvalue"):
|
174 |
+
pdf_bytes = pdf_obj.getvalue()
|
175 |
+
finally:
|
176 |
+
try:
|
177 |
+
pdf_obj.close()
|
178 |
+
except Exception:
|
179 |
+
pass
|
180 |
else:
|
181 |
+
# Assume file path
|
182 |
with open(pdf_obj, "rb") as f:
|
183 |
pdf_bytes = f.read()
|
184 |
|
185 |
+
if not pdf_bytes:
|
186 |
+
raise ValueError("Empty PDF bytes")
|
187 |
+
|
188 |
st.download_button(
|
189 |
"Download PDF",
|
190 |
data=pdf_bytes,
|
|
|
197 |
logger.exception(f"PDF generation failed: {e}")
|
198 |
|
199 |
|
200 |
+
|
201 |
def _render_audio(audio_files: Dict[str, Any]):
|
202 |
if not audio_files:
|
203 |
return
|