ArtStones commited on
Commit
2fb98d3
·
verified ·
1 Parent(s): af8d012

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +37 -50
src/streamlit_app.py CHANGED
@@ -3,7 +3,7 @@ import re
3
  from datetime import datetime
4
  from typing import List
5
 
6
- import gradio as gr
7
  from pypdf import PdfReader
8
 
9
  from reportlab.lib.pagesizes import A4
@@ -34,13 +34,11 @@ def safe_date_default() -> str:
34
 
35
 
36
  def normalize_hora(hora_input: str) -> str:
37
- # Mantém o padrão EXATO por default
38
  if not hora_input:
39
  return "_____ : _____"
40
  s = hora_input.strip()
41
  if s in {"_____:_____", "_____ : _____", "____ : ____"}:
42
  return "_____ : _____"
43
- # se usuário colocar algo tipo 20:15, mantém
44
  return s
45
 
46
 
@@ -59,7 +57,7 @@ def render_print_pdf(out_path: str, data_coleta: str, hora_coleta: str, keys: Li
59
 
60
  y = top
61
 
62
- # Cabeçalho (EXATO)
63
  y = draw("CLIENTE:", y)
64
  y -= line_h * 1.3
65
 
@@ -71,7 +69,7 @@ def render_print_pdf(out_path: str, data_coleta: str, hora_coleta: str, keys: Li
71
  y = draw(hora_coleta, y)
72
  y -= line_h * 0.9
73
 
74
- # Lista única (EXATO)
75
  y = draw("CHAVES DE ACESSO:", y)
76
  y -= line_h * 0.2
77
 
@@ -101,65 +99,54 @@ def render_print_pdf(out_path: str, data_coleta: str, hora_coleta: str, keys: Li
101
  c.save()
102
 
103
 
104
- def build_txt(out_path: str, keys: List[str]):
105
- with open(out_path, "w", encoding="utf-8") as f:
106
- f.write("\n".join(keys))
107
- f.write("\n")
108
 
 
 
 
109
 
110
- def run(pdf_path: str, data_coleta: str, hora_coleta: str):
111
- # pdf_path vem como string (caminho) quando type="filepath"
112
- if not pdf_path or not os.path.exists(pdf_path):
113
- raise gr.Error("Envie um PDF válido.")
114
 
115
- keys = extract_keys_from_pdf(pdf_path)
 
 
 
 
 
116
  if not keys:
117
- raise gr.Error("Não encontrei chaves de acesso (44 dígitos) no PDF.")
 
118
 
119
  data_coleta = (data_coleta or safe_date_default()).strip()
120
- hora_coleta = normalize_hora(hora_coleta)
121
 
122
  ts = datetime.now().strftime("%Y%m%d-%H%M%S")
123
-
124
- # No HF, /tmp é o caminho mais seguro para saída
125
  out_pdf = os.path.join("/tmp", f"chaves_prontas_{ts}.pdf")
126
  out_txt = os.path.join("/tmp", f"chaves_{ts}.txt")
127
 
128
- render_print_pdf(out_pdf, data_coleta, hora_coleta, keys)
129
- build_txt(out_txt, keys)
130
-
131
- preview = (
132
- f"PDF recebido: {os.path.basename(pdf_path)}\n"
133
- f"Chaves encontradas: {len(keys)}\n\n"
134
- "Primeiras chaves:\n" + "\n".join(keys[:10])
135
- )
136
-
137
- return preview, out_pdf, out_txt
138
 
 
 
139
 
140
- with gr.Blocks(title="Extrator de Chaves NF-e (PDF PDF para imprimir)") as demo:
141
- gr.Markdown("## Extrator de Chaves NF-e (PDF → PDF para imprimir)")
142
 
143
- with gr.Row():
144
- pdf = gr.File(
145
- label="Envie o PDF",
146
- file_types=[".pdf"],
147
- type="filepath", # <-- ESSENCIAL no Hugging Face para evitar 403
 
148
  )
149
- preview = gr.Textbox(label="Prévia", lines=12)
150
 
151
- with gr.Row():
152
- data_coleta = gr.Textbox(label="Data da coleta", value=safe_date_default())
153
- hora_coleta = gr.Textbox(label="Hora da coleta", value="_____ : _____")
154
-
155
- btn = gr.Button("Gerar arquivos")
156
- out_pdf = gr.File(label="PDF pronto para imprimir")
157
- out_txt = gr.File(label="TXT (opcional)")
158
-
159
- btn.click(
160
- fn=run,
161
- inputs=[pdf, data_coleta, hora_coleta],
162
- outputs=[preview, out_pdf, out_txt],
163
- )
164
 
165
- demo.launch()
 
3
  from datetime import datetime
4
  from typing import List
5
 
6
+ import streamlit as st
7
  from pypdf import PdfReader
8
 
9
  from reportlab.lib.pagesizes import A4
 
34
 
35
 
36
  def normalize_hora(hora_input: str) -> str:
 
37
  if not hora_input:
38
  return "_____ : _____"
39
  s = hora_input.strip()
40
  if s in {"_____:_____", "_____ : _____", "____ : ____"}:
41
  return "_____ : _____"
 
42
  return s
43
 
44
 
 
57
 
58
  y = top
59
 
60
+ # Cabeçalho (modelo)
61
  y = draw("CLIENTE:", y)
62
  y -= line_h * 1.3
63
 
 
69
  y = draw(hora_coleta, y)
70
  y -= line_h * 0.9
71
 
72
+ # Título da lista
73
  y = draw("CHAVES DE ACESSO:", y)
74
  y -= line_h * 0.2
75
 
 
99
  c.save()
100
 
101
 
102
+ st.set_page_config(page_title="Extrator de Chaves NF-e", layout="centered")
103
+ st.title("Extrator de Chaves NF-e (PDF → PDF para imprimir)")
 
 
104
 
105
+ pdf = st.file_uploader("Envie o PDF", type=["pdf"])
106
+ data_coleta = st.text_input("Data da coleta", value=safe_date_default())
107
+ hora_coleta = st.text_input("Hora da coleta", value="_____ : _____")
108
 
109
+ if pdf is not None:
110
+ st.caption(f"Arquivo: {pdf.name}")
 
 
111
 
112
+ if st.button("Gerar arquivos", disabled=(pdf is None)):
113
+ tmp_in = os.path.join("/tmp", f"entrada_{datetime.now().strftime('%Y%m%d-%H%M%S')}.pdf")
114
+ with open(tmp_in, "wb") as f:
115
+ f.write(pdf.read())
116
+
117
+ keys = extract_keys_from_pdf(tmp_in)
118
  if not keys:
119
+ st.error("Não encontrei chaves de acesso (44 dígitos) no PDF.")
120
+ st.stop()
121
 
122
  data_coleta = (data_coleta or safe_date_default()).strip()
123
+ hora_coleta_norm = normalize_hora(hora_coleta)
124
 
125
  ts = datetime.now().strftime("%Y%m%d-%H%M%S")
 
 
126
  out_pdf = os.path.join("/tmp", f"chaves_prontas_{ts}.pdf")
127
  out_txt = os.path.join("/tmp", f"chaves_{ts}.txt")
128
 
129
+ render_print_pdf(out_pdf, data_coleta, hora_coleta_norm, keys)
 
 
 
 
 
 
 
 
 
130
 
131
+ with open(out_txt, "w", encoding="utf-8") as f:
132
+ f.write("\n".join(keys) + "\n")
133
 
134
+ st.success(f"{len(keys)} chaves encontradas.")
 
135
 
136
+ with open(out_pdf, "rb") as f:
137
+ st.download_button(
138
+ "Baixar PDF pronto para imprimir",
139
+ data=f,
140
+ file_name=os.path.basename(out_pdf),
141
+ mime="application/pdf",
142
  )
 
143
 
144
+ with open(out_txt, "rb") as f:
145
+ st.download_button(
146
+ "Baixar TXT (opcional)",
147
+ data=f,
148
+ file_name=os.path.basename(out_txt),
149
+ mime="text/plain",
150
+ )
 
 
 
 
 
 
151
 
152
+ st.text_area("Prévia (primeiras 10 chaves)", value="\n".join(keys[:10]), height=200)