-
Notifications
You must be signed in to change notification settings - Fork 6
/
menu_extrair.py
63 lines (54 loc) · 2.14 KB
/
menu_extrair.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from pathlib import Path
import pypdf
import streamlit as st
from utilidades import pegar_dados_pdf
def exibir_menu_extrair(coluna):
"""Exibe o menu para extrair uma página de um arquivo PDF."""
with coluna:
st.markdown(
"""
# Extrair página de PDF
Escolha um arquivo PDF para extrair uma página:
"""
)
arquivo_pdf = st.file_uploader(
label="Selecione o arquivo PDF...",
type='pdf',
accept_multiple_files=False,
)
if arquivo_pdf:
botoes_desativados = False
else:
botoes_desativados = True
numero_pagina = st.number_input('Página para extrair', disabled=botoes_desativados, min_value=1)
clicou_processar = st.button(
'Clique para processar o arquivo PDF...',
disabled=botoes_desativados,
use_container_width=True,
)
if clicou_processar:
dados_pdf = extrair_pagina_pdf(arquivo_pdf=arquivo_pdf, numero_pagina=numero_pagina)
if dados_pdf is None: # Problema no processamento, emitir aviso
st.warning(f'PDF não possui página de número {numero_pagina}!')
else: # Processamento correu OK, exibir botão de download
nome_arquivo = f'{Path(arquivo_pdf.name).stem}_pg{numero_pagina:03d}.pdf'
st.download_button(
'Clique para baixar o arquivo PDF...',
type='primary',
data=dados_pdf,
file_name=nome_arquivo,
mime='application/pdf',
use_container_width=True,
)
def extrair_pagina_pdf(arquivo_pdf, numero_pagina):
# Pegar página
leitor = pypdf.PdfReader(arquivo_pdf)
try:
pagina = leitor.pages[numero_pagina - 1]
except IndexError: # O valor de numero_pagina está além do limite de páginas do PDF
return None
# Escrever página para PDF temporário e ler os seus dados
escritor = pypdf.PdfWriter()
escritor.add_page(pagina)
dados_pdf = pegar_dados_pdf(escritor=escritor)
return dados_pdf