File size: 4,546 Bytes
f64d424
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import numpy as np
import fitz  # PyMuPDF
import re
import json

def extract_pdf_text(pdf_path):
    """Extract text from a PDF file."""
    with fitz.open(pdf_path) as pdf_document:
        content_text = ""
        for page_num in range(len(pdf_document)):
            page = pdf_document.load_page(page_num)
            content_text += page.get_text() + "\n"
    return content_text

# Streamlit Application
st.title("PDF Data Extractor")

uploaded_file = st.file_uploader("Upload a PDF File", type="pdf")

if uploaded_file is not None:
    with open("temp.pdf", "wb") as f:
        f.write(uploaded_file.getbuffer())

    pdf_text = extract_pdf_text("temp.pdf")

    # Step 2: Extract relevant information from the text using regex
    pattern = r"2\s*3\s*4\s*5\s*\n-1,5\s*0([\s\S]*?)\n\nTrainer & Berater-Feedback"
    matches = re.findall(pattern, pdf_text)

    json_chunks = []
    for match in matches:
        match = match.replace(",", ".")
        values = [value.strip() for value in match.split("\n") if value.strip()]
        if len(values) == 22:
            json_chunks.append({"current": values})
        else:
            current = values[1::2]
            json_chunks.append({"current": current})

    json_output = json.dumps(json_chunks, indent=2)
    json_data = json.loads(json_output)

    # Define the original data structure
    original_data = {
        'Title': [
            "Personal Competence", "Personal Competence", "Personal Competence", "Personal Competence", "Personal Competence", "Personal Competence",
            "Personal Competence", "Personal Competence", "Personal Competence", "Personal Competence", "Personal Competence",
            "Personal Competence", "Personal Competence", "Business Competence", "Business Competence", "Business Competence", "Business Competence",
            "Business Competence", "Management Competence", "Management Competence", "Management Competence", "Management Competence",
        ],
        'Code': ["P1", "P2", "P3", "P4", "P5", "P6", "P7", "P8", "P9", "P10", "P11", "P12",
                 "P13", "B1", "B2", "B3", "B4", "B5", "M1", "M2", "M3", "M4"],
        'Dimensions': [
            "Integrity/ Reliability", "Appearance", "Enthusiasm/Passion", "Learning Motivation/ Self-Development", "Ability to Adapt/Flexibility",
            "Communication/Information", "Cooperation/ Team spirit", "Handling of Complex Situations", "Coolness/Handling of Unclear Situations",
            "Self-reliance/Initiative", "Conflict Management", "Ability to Assert Oneself/ Negotiation Skills", "Tact and Sensitivity",
            "Quality Orientation", "Client Orientation", "Specialized Knowledge", "Methodology/ Didactics/ Language", "Creativity/ Conceptional Skills",
            "Project Management", "Result Orientation", "Leadership Skills", "Coach and Advisor"
        ]
    }

    df = pd.DataFrame(original_data)

    # Add extracted scores to the DataFrame
    score_columns = ['Boss_score', 'Colleague_score', 'Colleague_other_score', 'Report_score', 'Customer_score']
    for idx, col in enumerate(score_columns):
        df[col] = json_data[idx]['current'] + [None] * (len(df) - len(json_data[idx]['current']))

    score_pattern = r"\d{1,2},\d{2}"
    code_pattern = r"[A-Z]\.[0-9]{1,2}"

    all_scores = re.findall(score_pattern, pdf_text)
    all_codes = re.findall(code_pattern, pdf_text)

    scores = [float(score.replace(",", ".")) for score in all_scores]
    codes = [code.strip() for code in all_codes]

    if len(codes) >= 44:
        codes = codes[22:44]
    if len(scores) >= 22:
        scores = scores[0:22]

    df1 = pd.DataFrame({'Code': [code.replace('.', '') for code in codes], 'All_raters_Score': scores})
    df_combined = pd.merge(df, df1, on="Code", how="inner")

    feature_cols = ['Boss_score', 'Colleague_score', 'Report_score', 'Customer_score', 'Colleague_other_score']
    df_combined[feature_cols] = df_combined[feature_cols].astype(float)

    def calculate_self_score(row):
        valid_features = [val for val in row[feature_cols] if pd.notna(val)]
        num_features = len(valid_features)
        if num_features > 1:
            sum_features = sum(valid_features) - row['All_raters_Score']
            return (row['All_raters_Score'] * num_features) - sum_features
        return np.nan

    df_combined['Self_score'] = df_combined.apply(calculate_self_score, axis=1)

    # Display the resultant DataFrame
    st.write("### Extracted Dataset")
    st.dataframe(df_combined)