Membuat Banyak E-Certificate

John kembali dengan tugas remeh lainnya. Bagaimana caranya memberi nama dan nomor pada banyak e-certificate.

Kode Lima Detik

from openpyxl import load_workbook
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

wb = load_workbook('nama_sertifikat.xlsx', data_only = True)
ws = wb.active
last_row = ws.max_row + 1
for row in range(2, last_row):
    number = 'Nomor: ' + ws['A' + str(row)].value
    participant = ws['B' + str(row)].value
    
    photo = Image.open('latar_sertifikat.png')
    drawing = ImageDraw.Draw(photo)

    # participant
    font = ImageFont.truetype("Pacifico-Regular.ttf", 68)    
    filename = participant.replace(' ', '_') + '.png'
    width, height = photo.size
    w, h = drawing.textsize(participant, font=font)

    x = (width-w) / 2
    y = 220

    xy = (x, y)
    drawing.text(xy, participant, fill='black', font=font)

    # number
    font = ImageFont.truetype("AnticSlab-Regular.ttf", 24)    
    w, h = drawing.textsize(number, font=font)
    x = (width-w) / 2
    y = 630

    xy = (x, y)
    drawing.text(xy, number, fill='black', font=font)

    photo.save(filename)

Latar Belakang

Seperti cendawan di musim hujan, webinar sekarang memenuhi hari-hari kita. Semua orang membuatnya dan semua orang berlomba-lomba mengumpulkan bukti keikutsertaannya.

John ingin menjadi seperti orang-orang, jadi Ia (tergabung dalam tim yang) membuat webinar juga.

Meski semua dilakukan melalui daring namun ternyata tydack sesederhana yang dibayangkan. Ada banyak ubo rampe yang perlu dipersiapkan dari mencari pembicara, membuat registrasi, publikasi hingga, yang paling mengganggu, menyiapkan e-certificate untuk peserta.

Menyiapkan e-certificate bisa sangat memakan waktu karena masing-masing gambar harus diberi nama peserta dan nomor yang berbeda. Membayangkan saja sudah cukup melelahkan.

Latar sertifikat yang telah berisi judul dan waktu webinar seperti ini.

Harus satu per satu ditambahkan nama peserta dan nomor sertifikat sehingga menjadi seperti ini.

Menggunakan pengolah gambar, John harus mengetik masing-masing nama (dan nomor sertifikat) lalu menyimpannya dengan menggunakan nama file sesuai nama. Begitu terus sampai sebanyak jumlah peserta.

John lalu teringat postulat yang ia buat sendiri.

Pekerjaan menggunakan komputer yang dilakukan berulang-ulang dan tidak membutuhkan banyak waktu untuk berpikir adalah jenis yang cocok untuk didelegasikan ke komputer.

Ada jalan merebut kembali waktu rebahan John.


Teknologi Digunakan

Daftar nama dan nomor sertifikat ada dalam Excel file. Karena itu John akan menggunakan openpyxl dan Pillow seperti yang dibahas di sini dan sini.

Untuk nama, akan digunakan Pacifico Font sedang nomor sertifikat menggunakan Antic Slab, keduanya dari Google Fonts.

Sebagai catatan, nama yang digunakan di bawah ini bukanlah nama dari tokoh yang benar-benar ada namun rekaan yang dibuat oleh ninjaname.


Langkah Kerja

Instalasi

Font

Unduh Pacifico dan Antic Slab kemudian ekstraksi. Pindahkan berkas berekstensi .ttf ke folder tempat python script yang akan dibuat.

openpyxl

Python library untuk membaca Excel file ini dapat diunduh dengan mengetik perintah ini di terminal/command prompt/console.

pip install openpyxl

Pillow

Library ini digunakan untuk memanipulasi gambar, dalam kasus John sekarang adalah menambahkan teks di atas gambar.

pip install pillow

Kode

Kode akan berisi dua bagian. Pertama membaca Excel file dan selanjutnya menuliskan di atas latar sertifikat.

Pertama John perlu me-load library yang akan digunakan.

from openpyxl import load_workbook
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

Baca Excel

Excel file bernama nama_sertifikat.xlsx berisi data kurang lebih seperti ini.

Untuk percobaan, John menuliskan kode di bawah ini, dengan tujuan memastikan semua data telah dibaca.

wb = load_workbook('nama_sertifikat.xlsx', data_only = True)
ws = wb.active
last_row = ws.max_row + 1
for row in range(2, last_row):
    print(ws['A' + str(row)].value, ws['B' + str(row)].value)

Penggunaan sederhana openpyxl dapat dibaca di sini. Untuk contoh penggunaan selanjutnya, John lebih sering menggunakan mesin pencari, ketimbang merujuk pada dokumentasi.

Menulis Nama

Untuk mendapatkan lokasi dan proporsi peletakkan nama peserta yang tepat pada latar sertifikat, John perlu berlatih dengan berbagai kombinasi ukuran font dan koordinat.

Koordinat x, y = 0, 0

Fungsi utama library Pillow yang digunakan adalah ImageDraw.text untuk menambahkan teks pada gambar. Salah satu parameter yang perlu diisi adalah koordinat (x, y).

Parameter inilah yang memerlukan beberapa kali percobaan. Sebagai awalan, koordinat yang digunakan adalah (0, 0), yang akan meletakkan teks mulai pojok kiri atas gambar.

font = ImageFont.truetype("Pacifico-Regular.ttf", 68)
photo = Image.open('latar_sertifikat.png')
drawing = ImageDraw.Draw(photo)
participant = 'Fatahilah Alvino Pringganti' # nama peserta, dapat berubah
x = 0
y = 0
xy = (x, y) # koordinat (x, y) diubah sesuai kebutuhan
drawing.text(xy, participant, fill='black', font=font)
photo.save('fatahilah00.png')
Koordinat y = 200

Setelah beberapa kali akhirnya ditemukan posisi yang lebih tepat, yaitu koordinat y adalah 200.

font = ImageFont.truetype("Pacifico-Regular.ttf", 68)
photo = Image.open('latar_sertifikat.png')
drawing = ImageDraw.Draw(photo)
participant = 'Fatahilah Alvino Pringganti' # nama peserta, dapat berubah
x = 0
y = 220
xy = (x, y) # koordinat (x, y) diubah sesuai kebutuhan
drawing.text(xy, participant, fill='black', font=font)
photo.save('fatahilah220.png')
Teks di tengah

Setelah mendapatkan koordinat y, langkah selanjutnya adalah menemukan koordinat x.

Kali ini lebih eksak.

Karena John ingin teks berada di tengah maka tinggal mengukur lebar teks saja, untuk kemudian dihitung bersama lebar latar sertifikat.

Lebar latar sertifikat didapatkan dari properti size. Sedang untuk ukuran teks dari fungsi textsize.

font = ImageFont.truetype("Pacifico-Regular.ttf", 68)
photo = Image.open('latar_sertifikat.png')
drawing = ImageDraw.Draw(photo)

participant = 'Fatahilah Alvino Pringganti'
filename = participant.replace(' ', '_') + '.png' # nama file gambar sesuai peserta
width, height = photo.size # mendapatkan ukuran sertifikat
w, h = drawing.textsize(stamp, font=font) # mendapatkan ukuran teks

x = (width-w) / 2 # koordinat x agar teks di tengah sertifikat
y = 220

xy = (x, y)
drawing.text(xy, participant, fill='black', font=font)
photo.save(filename)
Nomor Sertifikat

Puas dengan peletakkan nama peserta, John dapat menambahkan nomor sertifikat di bagian bawah. Kali ini lebih mudah karena tinggal mengulangi beberapa langkah yang diaplikasikan pada nama peserta.

photo = Image.open('latar_sertifikat.png')
drawing = ImageDraw.Draw(photo)

# participant
font = ImageFont.truetype("Pacifico-Regular.ttf", 68)
participant = 'Fatahilah Alvino Pringganti'
filename = participant.replace(' ', '_') + '.png'
width, height = photo.size
w, h = drawing.textsize(participant, font=font)

x = (width-w) / 2
y = 220

xy = (x, y)
drawing.text(xy, participant, fill='black', font=font)

# number
font = ImageFont.truetype("AnticSlab-Regular.ttf", 24)
number = 'Nomor: 16/Rajab/1344/Ahad/001'
w, h = drawing.textsize(number, font=font)
x = (width-w) / 2
y = 630

xy = (x, y)
drawing.text(xy, number, fill='black', font=font)

photo.save(filename)

Proses Semua!

Semua sudah ketemu, tinggal menggabungkan langkah membaca Excel file dan menambahkan teks pada gambar.

from openpyxl import load_workbook
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

wb = load_workbook('nama_sertifikat.xlsx', data_only = True)
ws = wb.active
last_row = ws.max_row + 1
for row in range(2, last_row):
    number = 'Nomor: ' + ws['A' + str(row)].value
    participant = ws['B' + str(row)].value
    
    photo = Image.open('latar_sertifikat.png')
    drawing = ImageDraw.Draw(photo)

    # participant
    font = ImageFont.truetype("Pacifico-Regular.ttf", 68)    
    filename = participant.replace(' ', '_') + '.png'
    width, height = photo.size
    w, h = drawing.textsize(participant, font=font)

    x = (width-w) / 2
    y = 220

    xy = (x, y)
    drawing.text(xy, participant, fill='black', font=font)

    # number
    font = ImageFont.truetype("AnticSlab-Regular.ttf", 24)    
    w, h = drawing.textsize(number, font=font)
    x = (width-w) / 2
    y = 630

    xy = (x, y)
    drawing.text(xy, number, fill='black', font=font)

    photo.save(filename)

Aye, aye!

Proses yang sederhana dengan hasil yang lebih dari cukup.


Simpulan

Meme by Meming Wiki

Hidup bergerak makin cepat.

John menginsyafi bahwa di era ini data tiba-tiba membludak dalam volume yang tidak terbayangkan sebelumnya.

Cara-cara yang berhasil kemarin tak lagi dapat serta merta diaplikasikan pada lingkungan yang ada hari ini. Apalagi karena John tidak ingin waktu kerjanya bertambah.

Namun John tak khawatir karena ada solusi untuk setiap kondisi.

Kali ini hadir dalam bentuk beberapa baris kode bersahaja.


Langganan dan Saran

Apakah pembaca setuju? Adakah kisah lain yang serupa yang pembaca alami? Silahkan tuliskan di kolom komentar di bawah ini.

Jika suka tulisan di sini boleh berlangganan agar kami dapat mengirimkan pemberitahuan tulisan baru. Punya saran atau keluhan terhadap blog ini, sila ajukan langsung pada kami.

Kami juga membagi tips harian melalui Twitter.


Cover Photo by Liam Truong on Unsplash


Referensi


One Reply to “Membuat Banyak E-Certificate”

Leave a Reply

Your email address will not be published.