1. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

[Python] não estou conseguindo aplicar a lógica de usar uma outra search-string [fechada]

Discussão em 'Python' iniciado por Stack, Setembro 10, 2024.

  1. Stack

    Stack Membro Participativo

    estou usando strings de busca para iterar sobre textos de pdfs em busca de padrões de correspondência que referenciam a tabela que quero identificar e extrair (usei como métrica elementos únicos, mas há casos onde apenas isso não basta, por isso decidi usar outra string de busca, mas não estou conseguindo colocar pra funcionar

    Descrição do Código:

    Objetivo: O código processa arquivos PDF em um diretório para encontrar e extrair tabelas baseadas em textos específicos presentes nas páginas. As tabelas são então salvas em arquivos CSV com uma coluna adicional indicando o município. CÓDIGO:

    search_string = "ao disposto no art. 42"
    # Texto para verificar no cabeçalho da tabela
    table_search_string = "discriminação"
    search_string2 = "discriminação"
    nao_encontrados = []

    def extrair_municipio(pdf):
    nome_municipio = None
    first_page = pdf.pages[0]
    first_page_text = first_page.extract_text()
    match = pattern.search(first_page_text)
    if match:
    nome_municipio = match.group()
    return nome_municipio

    def find_pages(path, search):
    with pdfplumber.open(path) as pdf:
    for i, page in enumerate(pdf.pages):
    text = page.extract_text()
    if text and search in text:
    return i
    return None

    def find_string_position(page, search):
    text = page.extract_text()
    if not text:
    return None
    index = text.find(search)
    return index

    def extract_tables_after_text(page, search_text_position):
    tables = page.extract_tables()
    dfs = []
    page_text = page.extract_text()

    for table in tables:
    if table and table[0]:
    # Verificar se "discriminação" aparece no cabeçalho da tabela
    if table_search_string.lower() in table[0][0].lower():
    df = pd.DataFrame(table[1:], columns=table[0])
    dfs.append(df)
    break # Encontrou a tabela certa, então interrompe o loop
    return dfs

    # Iterar sobre todos os arquivos no diretório
    for filename in os.listdir(dir):
    if filename.endswith(".pdf"):
    pdf_path = os.path.join(dir, filename)
    print(f"Processando arquivo: {filename}")

    with pdfplumber.open(pdf_path) as pdf:
    # Extrair o nome do município da primeira página
    nome_municipio = extrair_municipio(pdf)
    if not nome_municipio:
    print(f"Município não encontrado no arquivo {filename}")
    nao_encontrados.append(filename)
    continue

    # Encontrar a página com o texto de busca original
    page_number = find_pages(pdf_path, search_string)

    if page_number is not None:
    page = pdf.pages[page_number]
    text_position = find_string_position(page, search_string)

    if text_position is not None:
    tables = extract_tables_after_text(page, text_position)
    if tables:
    for i, df in enumerate(tables):
    # Adicionar a coluna 'municipios' ao DataFrame
    df['municipios'] = nome_municipio

    # Salvar o DataFrame em um CSV
    csv_path = os.path.join(dir, f"{os.path.splitext(filename)[0]}_tabela_{i + 1}.csv")
    df.to_csv(csv_path, index=False)
    print(f'Tabela {i + 1} salva em {csv_path}')
    else:
    nao_encontrados.append(nome_municipio)
    print('Nenhuma tabela encontrada após o texto especificado.')
    else:
    print('Texto especificado não encontrado na página.')
    nao_encontrados.append(nome_municipio)
    else:
    print(f'Página com o search_string "{search_string}" não encontrada no arquivo {filename}.')
    nao_encontrados.append(nome_municipio)
    else:
    print(f'Página com o search_string "{search_string}" não encontrada no arquivo {filename}.')
    print(f"processando a segunda search_string {search_string2}")
    nao_encontrados.append(nome_municipio)
    var = True
    if var == True:
    for filename in os.listdir(dir):
    if filename.endswith(".pdf"):
    pdf_path = os.path.join(dir, filename)
    print(f"Processando arquivo: {filename}")

    with pdfplumber.open(pdf_path) as pdf:
    # Extrair o nome do município da primeira página
    nome_municipio = extrair_municipio(pdf)
    if not nome_municipio:
    print(f"Município não encontrado no arquivo {filename}")
    nao_encontrados.append(filename)
    continue

    # Encontrar a página com o texto de busca original
    page_number = find_pages(pdf_path, search_string)

    if page_number is not None:
    page = pdf.pages[page_number]
    text_position = find_string_position(page, search_string)

    if text_position is not None:
    tables = extract_tables_after_text(page, text_position)
    if tables:
    for i, df in enumerate(tables):
    # Adicionar a coluna 'municipios' ao DataFrame
    df['municipios'] = nome_municipio

    # Salvar o DataFrame em um CSV
    csv_path = os.path.join(dir, f"{os.path.splitext(filename)[0]}_tabela_{i + 1}.csv")
    df.to_csv(csv_path, index=False)
    print(f'Tabela {i + 1} salva em {csv_path}')

    print("Processamento concluído.")
    print(f"Municípios não encontrados: {nao_encontrados}")


    Funções:

    extrair_municipio(pdf): Extrai o nome do município da primeira página usando uma expressão regular.

    find_pages(path, search): Encontra o número da página que contém um texto específico.

    find_string_position(page, search): Encontra a posição de um texto específico dentro do texto extraído da página.

    extract_tables_after_text(page, search_text_position): Extrai tabelas de uma página após a posição de um texto de busca, verificando se o cabeçalho da tabela contém uma string específica.

    process_file(filename, search_string, search_string_fallback): Processa um arquivo PDF, buscando tabelas após um texto específico e salvando-as como arquivos CSV. Se o texto principal não for encontrado, tenta um texto alternativo. Execução:

    O código itera sobre todos os arquivos PDF no diretório especificado e aplica a função process_file a cada um, com um texto principal e um texto alternativo para a busca.

    Continue reading...

Compartilhe esta Página