<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 PDF táblázatok pandas-ba való alakítása. Olyan PDF-ekre, amelyek képekből vannak - tehát fényképek, szkennelések, vagy hasonló. Ez magában foglalja a sima fényképek (JPG, PNG) szövegfelismerését is. Az átalakítási folyamat három lépéses
Step1:  Olvasd el
Step2:  Olvasd el
Step3:  1
https
Step4:  Készítünk egy mappát, ahová a PDF oldalait exportáljuk képként.
Step5:  2
Szövegfelismerés a képeken
Step6:  3
Step7:  Felismert szöveg beolvasása
Step8:  Sorok felosztása újsork karakterek \n szerint
Step9:  Csak azokat a sorokat tartjuk meg, amelyek számmal kezdődnek
Step10:  Tipikus hibás felismert karaterek javítása
Step11:  Hibás sorok további kiszűrése manuálisan
Step12:  Adatok feldolgozása
A név nem mindenhol ugyanolyan hosszú, ezért ezt normalizáljuk.
A név második neve, az iniciálő sokszor 1 vagy |, l, I. Ezt normalizáljuk I-re.
Step13:  extra
Ez a további rész további tisztítás, ezt végezhetjük már akár Excelben is.
A jegyeknél vagy ahol hiányzik a vessző. Ezt úgy vizsgáljuk, hogy a az első karater után mindig vesszőt teszük, ha már nincs. Aztán számokká konvertáljuk.
<ASSISTANT_TASK:>
Python Code:
!pip install Pillow
!pip install pdf2image
Explanation: PDF táblázatok pandas-ba való alakítása. Olyan PDF-ekre, amelyek képekből vannak - tehát fényképek, szkennelések, vagy hasonló. Ez magában foglalja a sima fényképek (JPG, PNG) szövegfelismerését is. Az átalakítási folyamat három lépéses:
 1. PDF oldalainak képekké alakítása
 2. Szövegfelismerés a képeken (ezt angolul úgy hívják OCR - optical character recognition)
 3. Szöveg táblázattá alakítása
Installs
ImageMagick és GhostSCript
Kell hozzá ImageMagick és GhostScript.
https://www.imagemagick.org/script/download.php
https://www.ghostscript.com/download/gsdnld.html
Poppler
Install Poppler, add to PATH
Go to this page and download the binary of your choice. In this example we will download and use poppler-0.68.0. Extract the archive file poppler-0.68.0_x86.7z into C:\Program Files\poppler. Thus the directory structure should look something like this:
C:
  └ Program Files
    └ poppler
    └ poppler-0.68.0
      └ bin
      └ include
      └ lib
      └ share  
Windows: Add C:\Program Files\poppler\poppler-0.68.0\bin to your system PATH.
Valamit így kell a PATH-hoz hozzáadni: https://www.architectryan.com/2018/03/17/add-to-the-path-on-windows-10/
Tesseract
Install Tesseract: https://github.com/tesseract-ocr/tesseract/wiki
For Windows: https://github.com/UB-Mannheim/tesseract/wiki
Add C:\Program Files\Tesseract-OCR to your system PATH.
Restart Python
Ezután indítsd újra az Anacondát és a JupyterLabet és a Python-t.
Olvasd el: https://www.geeksforgeeks.org/python-reading-contents-of-pdf-using-ocr-optical-character-recognition/
End of explanation
!pip install pytesseract
Explanation: Olvasd el: https://pypi.org/project/pytesseract/
End of explanation
!pip install opencv-python
Explanation: Olvasd el: https://stackoverflow.com/questions/44439443/python-how-to-pip-install-opencv2-with-specific-version-2-4-9
End of explanation
from PIL import Image 
import sys 
from pdf2image import convert_from_path 
import os 
# Path of the pdf 
PDF_file = "Lista inscrisi Admitere Licenta sept 11.09.2015.pdf"
if not os.path.exists('pdf/'+PDF_file+'/'):
    os.makedirs('pdf/'+PDF_file+'/')
Explanation: 1
https://hoineki.com/article.php?a=How_to_convert_PDF_to_Image34
End of explanation
# Store all the pages of the PDF in a variable 
#a masodik szam a felbontas, ezt 300-600 kozott probalgasd
pages = convert_from_path(PDF_file, 300) 
  
# Counter to store images of each page of PDF to image 
image_counter = 1
  
# Iterate through all the pages stored above 
for page in pages: 
  
    # Declaring filename for each page of PDF as JPG 
    # For each page, filename will be: 
    # PDF page 1 -> page_1.jpg 
    # PDF page 2 -> page_2.jpg 
    # PDF page 3 -> page_3.jpg 
    # .... 
    # PDF page n -> page_n.jpg 
    filename = 'pdf/'+PDF_file+"/page_"+str(image_counter)+".jpg"
    print(image_counter,'oldal kész..')
      
    # Save the image of the page in system 
    page.save(filename, 'JPEG') 
  
    # Increment the counter to update filename 
    image_counter = image_counter + 1
Explanation: Készítünk egy mappát, ahová a PDF oldalait exportáljuk képként.
End of explanation
import pytesseract
# Variable to get count of total number of pages 
filelimit = image_counter-1
  
# Creating a text file to write the output 
outfile = 'pdf/'+PDF_file+"/text.txt"
  
# Open the file in append mode so that  
# All contents of all images are added to the same file 
f = open(outfile, "a") 
  
# Iterate from 1 to total number of pages 
for i in range(1, filelimit + 1): 
  
    # Set filename to recognize text from 
    # Again, these files will be: 
    # page_1.jpg 
    # page_2.jpg 
    # .... 
    # page_n.jpg 
    filename = 'pdf/'+PDF_file+"/page_"+str(i)+".jpg"
          
    # Recognize the text as string in image using pytesserct 
    text = str(((pytesseract.image_to_string(Image.open(filename))))) 
    print(i,'oldal kész..')
  
    # The recognized text is stored in variable text 
    # Any string processing may be applied on text 
    # Here, basic formatting has been done: 
    # In many PDFs, at line ending, if a word can't 
    # be written fully, a 'hyphen' is added. 
    # The rest of the word is written in the next line 
    # Eg: This is a sample text this word here GeeksF- 
    # orGeeks is half on first line, remaining on next. 
    # To remove this, we replace every '-\n' to ''. 
    text = text.replace('-\n', '')     
  
    # Finally, write the processed text to the file. 
    f.write(text) 
# Close the file after writing all the text. 
f.close() 
Explanation: 2
Szövegfelismerés a képeken
End of explanation
import pandas as pd
Explanation: 3
End of explanation
pages=open(outfile,'r').read()
Explanation: Felismert szöveg beolvasása
End of explanation
lines=[i for i in pages.split('\n') if i]
Explanation: Sorok felosztása újsork karakterek \n szerint
End of explanation
good_lines=[line for line in lines if line[0].isdigit()]
Explanation: Csak azokat a sorokat tartjuk meg, amelyek számmal kezdődnek
End of explanation
good_lines=[line.replace('_',' ').replace('. ',' ').replace('-',' ').replace('—',' ')\
     .replace('~',' ').replace('=',' ').replace('  ',' ').replace('  ',' ')\
     .replace('»',' ')for line in good_lines]
good_lines[:10]
Explanation: Tipikus hibás felismert karaterek javítása
End of explanation
for i,l in enumerate(good_lines):
    print(str(i)+':::'+l)
good_lines[126]=good_lines[126].split(',ve Nr Leg')[0]
good_lines[146]=good_lines[146].replace('7 AL','7,41')
helper=good_lines[195].split('199 4514')
good_lines[195]=helper[0]
good_lines.append('199 4514'+helper[1])
Explanation: Hibás sorok további kiszűrése manuálisan
End of explanation
clean_lines=[]
for line in good_lines:
    values=line.split(' ')
    
    try:
        for k in [2,3,4]:
            values[k]=values[k].replace('1','I').replace('l','I')\
                .replace('|','I').replace('7','I').replace('0','O')
        counter=0
        name_start=100
        name_end=0
        while counter<len(values)-1:
            counter+=1
            try:
                if not values[counter][0].isdigit():
                    name_start=min(name_start,counter)
                    if values[counter+1][0].isdigit():
                        name_end=counter+1
                        counter=len(values)
            except:
                print('HIBA: '+line)
    
        clean_values=values[:name_start]+[' '.join(values[name_start:name_end])]+values[name_end:]
        clean_values=[szo for szo in clean_values if szo]
        clean_lines.append(clean_values)
    except:
        print('HIBA: '+line)
df=pd.DataFrame(clean_lines)
df=df[range(6)]
df.columns=['ID','Leg','Nume','Admitere','Bac 2','Lb. Mat.']
df.head()
df.to_excel('pdf/'+PDF_file+'/data.xlsx')
Explanation: Adatok feldolgozása
A név nem mindenhol ugyanolyan hosszú, ezért ezt normalizáljuk.
A név második neve, az iniciálő sokszor 1 vagy |, l, I. Ezt normalizáljuk I-re.
End of explanation
for line in clean_lines:
    try:
        for i in [3,4,5]:
            jegy=line[i]
            jegy=jegy.replace('.',',')
            jegy=jegy.replace('I','1').replace('l','1')\
                .replace('|','1').replace('A','4').replace('O','0')
            if jegy[0]==',':jegy=jegy[1:]
            if jegy[-1]==',':jegy=jegy[:-1]
            if jegy!='10,00':
                if jegy!='1000':
                    if len(jegy)<4:
                        jegy=jegy[0]+','+jegy[1:]
                    jegy=float(jegy.replace(',','.'))
                else: jegy=10
            else: jegy=10
            line[i]=jegy
    except:
        print(line)
df=pd.DataFrame(clean_lines)
df=df[range(6)]
df.columns=['ID','Leg','Nume','Admitere','Bac 2','Lb. Mat.']
df.head()
df['Mean']=df.mean(axis=1)
df
Explanation: extra
Ez a további rész további tisztítás, ezt végezhetjük már akár Excelben is.
A jegyeknél vagy ahol hiányzik a vessző. Ezt úgy vizsgáljuk, hogy a az első karater után mindig vesszőt teszük, ha már nincs. Aztán számokká konvertáljuk.
End of explanation
<END_TASK>