-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdadosdog.py
More file actions
135 lines (111 loc) · 5.36 KB
/
Copy pathdadosdog.py
File metadata and controls
135 lines (111 loc) · 5.36 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import os
import re
import cv2
import fitz # PyMuPDF
import pandas as pd
import pytesseract
import numpy as np
from pathlib import Path
# Configurar o caminho para o executável do Tesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def extrair_info_pdf(pdf_path):
"""Extrai informações de notas fiscais em PDF."""
try:
# Abrir o PDF com PyMuPDF
doc = fitz.open(pdf_path)
dados = []
for page_num in range(len(doc)):
# Obter a página
page = doc.load_page(page_num)
# Renderizar a página como uma imagem
pix = page.get_pixmap(matrix=fitz.Matrix(300/72, 300/72))
# Converter para formato de imagem compatível com OpenCV
# Método atualizado para compatibilidade com versões mais recentes
img_bytes = pix.tobytes("png")
nparr = np.frombuffer(img_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
# Converter para escala de cinza
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Aplicar threshold para melhorar o contraste
_, img_threshold = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
# Extrair texto com OCR
texto = pytesseract.image_to_string(img_threshold, lang='por')
# Extrair informações usando regex
numero_nf = extrair_numero_nf(texto)
data_emissao = extrair_data_emissao(texto)
valor_total = extrair_valor_total(texto)
cnpj_emitente = extrair_cnpj(texto)
razao_social = extrair_razao_social(texto)
# Adicionar à lista de dados
dados.append({
'Número NF': numero_nf,
'Data Emissão': data_emissao,
'Valor Total': valor_total,
'CNPJ Emitente': cnpj_emitente,
'Razão Social': razao_social,
'Arquivo': os.path.basename(pdf_path),
'Página': page_num + 1
})
doc.close()
return dados
except Exception as e:
print(f"Erro ao processar {pdf_path}: {str(e)}")
return []
def extrair_numero_nf(texto):
"""Extrai o número da nota fiscal do texto."""
padrao = r'N[º°]\s*(?:da\s*)?(?:NF[-:]?(?:e)?|Nota\s*Fiscal[-:]?|NF[-:]?e)\s*([0-9]{1,9})'
match = re.search(padrao, texto, re.IGNORECASE)
if match:
return match.group(1)
# Método alternativo
padrao_alt = r'Nota Fiscal Eletrônica\s*-\s*NF-e\s*([0-9]{1,9})'
match = re.search(padrao_alt, texto, re.IGNORECASE)
return match.group(1) if match else "Não encontrado"
def extrair_data_emissao(texto):
"""Extrai a data de emissão da nota fiscal."""
padrao = r'(?:Data\s*(?:de)?\s*Emiss[ãa]o|Emiss[ãa]o)\s*:?\s*([0-9]{1,2}/[0-9]{1,2}/[0-9]{2,4})'
match = re.search(padrao, texto, re.IGNORECASE)
return match.group(1) if match else "Não encontrado"
def extrair_valor_total(texto):
"""Extrai o valor total da nota fiscal."""
padrao = r'(?:Valor\s*Total\s*(?:da\s*)?(?:Nota|NF)|Total\s*(?:da\s*)?(?:Nota|NF))\s*:?\s*R\$?\s*([0-9]{1,3}(?:\.[0-9]{3})*(?:,[0-9]{2})?)'
match = re.search(padrao, texto, re.IGNORECASE)
return match.group(1) if match else "Não encontrado"
def extrair_cnpj(texto):
"""Extrai o CNPJ do emitente da nota fiscal."""
padrao = r'CNPJ\s*:?\s*([0-9]{2}\.[0-9]{3}\.[0-9]{3}/[0-9]{4}-[0-9]{2})'
match = re.search(padrao, texto, re.IGNORECASE)
return match.group(1) if match else "Não encontrado"
def extrair_razao_social(texto):
"""Extrai a razão social do emitente da nota fiscal."""
padrao = r'(?:Raz[ãa]o\s*Social|Nome/Raz[ãa]o\s*Social|Emitente)\s*:?\s*([^\n\r]*?)\s*(?:CNPJ|$)'
match = re.search(padrao, texto, re.IGNORECASE)
return match.group(1).strip() if match else "Não encontrado"
def main():
# Verificar se o diretório existe
diretorio_pdf = r"Z:\B10_MAT-CONST-CONSULT\A02_REFERENCIAS\02_GOINFRA\07_NOTAS FISCAIS-VISITA-GOINFRA\PDF 123 pag"
if not os.path.exists(diretorio_pdf):
print(f"O diretório {diretorio_pdf} não existe. Por favor, verifique o caminho.")
return
# Obter todos os arquivos PDF no diretório
arquivos_pdf = [os.path.join(diretorio_pdf, arquivo) for arquivo in os.listdir(diretorio_pdf)
if arquivo.lower().endswith('.pdf')]
if not arquivos_pdf:
print(f"Nenhum arquivo PDF encontrado em {diretorio_pdf}")
return
# Extrair informações de cada PDF
todos_dados = []
for pdf_path in arquivos_pdf:
print(f"Processando {os.path.basename(pdf_path)}...")
dados_pdf = extrair_info_pdf(pdf_path)
todos_dados.extend(dados_pdf)
# Criar DataFrame e exportar para Excel
if todos_dados:
df = pd.DataFrame(todos_dados)
caminho_excel = os.path.join(os.path.dirname(diretorio_pdf), "dados_notas_fiscais.xlsx")
df.to_excel(caminho_excel, index=False)
print(f"Dados exportados com sucesso para {caminho_excel}")
else:
print("Nenhum dado foi extraído dos PDFs.")
if __name__ == "__main__":
main()