Skip to content

Instantly share code, notes, and snippets.

@hid0
Created June 2, 2025 06:00
Show Gist options
  • Select an option

  • Save hid0/a4cd01316a1ddc55dc22a9b7e8b80a29 to your computer and use it in GitHub Desktop.

Select an option

Save hid0/a4cd01316a1ddc55dc22a9b7e8b80a29 to your computer and use it in GitHub Desktop.
script scraping data e ijazah
import PyPDF2
import pandas as pd
import re
# Ganti dengan nama file PDF Anda jika berbeda
pdf_file_path = 'ijazah_SMKW9.pdf'
extracted_data = []
try:
with open(pdf_file_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
num_pages = len(reader.pages)
print(f"Mulai mengekstrak data dari {num_pages} halaman...")
for i in range(num_pages):
page = reader.pages[i]
text = page.extract_text()
no_ijazah = None
nama_siswa = None
ttl = None
nisn = None
bidang_program_kompetensi_keahlian = None # Variabel tunggal untuk menampung salah satu dari ketiganya
# Regex untuk Nomor Ijazah
ijazah_match = re.search(r'No\.\s*Ijazah:\s*(\d{15})', text, re.IGNORECASE)
if ijazah_match:
no_ijazah = ijazah_match.group(1).strip()
else:
ijazah_match_alt = re.search(r'No\.\s*Ijazah:\s*(\d+\s*\d+)', text, re.IGNORECASE)
if ijazah_match_alt:
no_ijazah = ijazah_match_alt.group(1).replace(" ", "").strip()
# Regex untuk Nama Siswa
nama_match = re.search(r'Dengan ini menyatakan bahwa:\s*\n\s*(.*?)\n', text, re.IGNORECASE | re.DOTALL)
if nama_match:
nama_siswa = nama_match.group(1).strip()
if "tempat, tanggal lahir" in nama_siswa:
nama_siswa = nama_siswa.split("tempat, tanggal lahir")[0].strip()
if "Nomor Induk Siswa Nasional" in nama_siswa:
nama_siswa = nama_siswa.split("Nomor Induk Siswa Nasional")[0].strip()
else:
nama_match_alt = re.search(r'(?<=Yang bertanda tangan di bawah ini menyatakan bahwa:\s*\n)(.*?)(?=\nNomor Induk Siswa Nasional)', text, re.IGNORECASE | re.DOTALL)
if nama_match_alt:
nama_siswa = nama_match_alt.group(1).strip()
# Regex untuk Tempat, Tanggal Lahir
ttl_match = re.search(r'tempat,\s*tanggal\s*lahir:\s*(.*?)\n', text, re.IGNORECASE)
if ttl_match:
ttl = ttl_match.group(1).strip()
# Regex untuk Nomor Induk Siswa Nasional (NISN)
nisn_match = re.search(r'Nomor Induk Siswa Nasional:\s*(\d{9,10})', text, re.IGNORECASE)
if nisn_match:
nisn = nisn_match.group(1).strip()
# Regex untuk Kompetensi Keahlian, Konsentrasi Keahlian, Program Keahlian, atau Bidang Keahlian
# Prioritaskan Kompetensi Keahlian terlebih dahulu
kompetensi_keahlian_match = re.search(r'Kompetensi Keahlian\s*:\s*(.*?)\n', text, re.IGNORECASE)
if kompetensi_keahlian_match:
bidang_program_kompetensi_keahlian = kompetensi_keahlian_match.group(1).strip()
else:
konsentrasi_keahlian_match = re.search(r'Konsentrasi Keahlian\s*:\s*(.*?)\n', text, re.IGNORECASE)
if konsentrasi_keahlian_match:
bidang_program_kompetensi_keahlian = konsentrasi_keahlian_match.group(1).strip()
else:
program_keahlian_match = re.search(r'Program Keahlian\s*:\s*(.*?)\n', text, re.IGNORECASE)
if program_keahlian_match:
bidang_program_kompetensi_keahlian = program_keahlian_match.group(1).strip()
else:
bidang_keahlian_match = re.search(r'Bidang Keahlian\s*:\s*(.*?)\n', text, re.IGNORECASE)
if bidang_keahlian_match:
bidang_program_kompetensi_keahlian = bidang_keahlian_match.group(1).strip()
# Hanya tambahkan data jika setidaknya Nomor Ijazah ditemukan
if no_ijazah or nama_siswa or nisn or ttl or bidang_program_kompetensi_keahlian:
extracted_data.append({
'Halaman': i + 1,
'No. Ijazah': no_ijazah,
'Nama Siswa': nama_siswa,
'Tempat, tanggal lahir': ttl,
'Nomor Induk Siswa Nasional': nisn,
'Bidang/Program/Kompetensi Keahlian': bidang_program_kompetensi_keahlian # Kolom baru
})
print(f"Total {len(extracted_data)} data berhasil diekstraksi.")
# Buat DataFrame dari data yang diekstrak
df = pd.DataFrame(extracted_data)
# Simpan DataFrame ke file Excel
output_excel_file = 'data_ijazah_all.xlsx'
df.to_excel(output_excel_file, index=False)
print(f"Data lengkap berhasil disimpan ke '{output_excel_file}'")
except FileNotFoundError:
print(f"Error: File '{pdf_file_path}' tidak ditemukan. Pastikan nama file dan lokasi sudah benar.")
except Exception as e:
print(f"Terjadi kesalahan: {e}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment