Mendapatkan Titik Koordinat Teks di PDF

Bismillah,
Assalamu'alaikum Warohmatullah Wabarokatuh,


Di artikel kali ini, insyaAllah saya akan memberikan sedikit tips bagaimana cara untuk mendapatkan titik koordinat dari sebuah teks yang ada di dalam file PDF.

Tujuannya adalah untuk melanjutkan dari artikel sebelumnya terkait integrasi dengan mekari esign. Dimana titik koordinat dibutuhkan untuk meletakan digital signature.
Syarat agar titik koordinat bisa dibaca adalah :
* file PDF berupa text yang bisa dicopas atau bukan gambar hasil scan
* text yang dibaca untuk posisi digital signature bersifat unik agar posisi digital signature sesuai dengan yang diharapkan

Berikut langkah - langkahnya :

1. Pastikan libary python PyMuPDF (fitz) sudah terinstall

2. Buat fungsi untuk membaca titik koordinat

def read_pdf_coordinates(self, pdf_file, target_text, name=False, email=False, meterai=False):
try:
with tempfile.NamedTemporaryFile(delete=False) as temp_pdf:
temp_pdf.write(base64.b64decode(pdf_file))

# Open the PDF using PyMuPDF (fitz)
pdf_document = fitz.open(temp_pdf.name)

# Iterate through each page in the PDF document
for page_number in range(pdf_document.page_count):
page = pdf_document[page_number]

text_found = [x for x in page.get_text("words") if target_text in x[4]]
for text in text_found:

print(f"Teks '{target_text}' ditemukan pada Halaman {page_number + 1}, "
f"Koordinat x dan y: {(text[0])*0.93}, {text[1]*0.93}")
# posx = (text[0]+15)*0.93
posx = (text[0]-15)*0.93
posy = text[1]*0.93
data = {
'page': page_number + 1,
'pos_x': posx,
'pos_y': posy,
'is_meterai': meterai,
'name': name,
'email': email,
}
if not name and not email:
tb_sign = text[4].split('#')
if len(tb_sign) > 2:
name = tb_sign[1].replace('&',' ')
email = tb_sign[2].replace('}', '').replace('\n', '')
if tb_sign[1] == 'False' or tb_sign[2] == 'False':
raise ValidationError('Nama atau Email di Catatan Pembelian / Penyimpanan produk belum terisi!')

data['name'] = name
data['email'] = email
data['height'] = 60
data['width'] = 60
data['pos_x'] = data.get('pos_x') + 10
data['pos_y'] = data.get('pos_y') - 10
name = False
email = False

self.generate_partner_sign(data)

pdf_document.close()



Note : fungsi generate_partner_sign() untuk menyimpan titik koordinat atau atribut yang lain untuk keperluan integrasi ke mekari esign

def generate_partner_sign(self, data):
self.sign_attach_line = [(0,0, data)]

3. Panggil fungsi poin 2 di tempat yang dibutuhkan

def print_attachment(self):
for rec in self:
if rec.is_completed:
raise ValidationError('Dokumen telah selesai ditandangani, jika ingin men-generate ulang silahkan uncheck field "Sign Completed"?')

res = super(AqnCertificationLineAttachment, self).print_attachment()
for rec in self:
rec.sign_attach_line = False
reg_signers = rec.get_signers_regis_form()
if '${leader_esign}' in rec.template_attachment:
rec.read_pdf_coordinates(rec.attachment,'${leader_esign}', reg_signers.get('leader_name'), reg_signers.get('leader_email'))
rec.remove_esign_tags('${leader_esign}')
if '${penyelia_esign}' in rec.template_attachment:
rec.read_pdf_coordinates(rec.attachment,'${penyelia_esign}', reg_signers.get('penyelia_name'), reg_signers.get('penyelia_email'))
rec.remove_esign_tags('${penyelia_esign}')
if '${leader_esign_meterai}' in rec.template_attachment:
rec.read_pdf_coordinates(rec.attachment,'${leader_esign_meterai}', reg_signers.get('leader_name'), reg_signers.get('leader_email'), meterai=True)
rec.remove_esign_tags('${leader_esign_meterai}')
if '${tb_esign#' in rec.template_attachment:
rec.read_pdf_coordinates(rec.attachment,'${tb_esign#')

return res


Terima kasih, semoga bermanfaat.
Kahfi
Wassalamu'alaikum Warohmatullah Wabarokatuh








Cara Menghilangkan Nilai "en_US" Yang Ada Pada Hasil Query SQL dan Mengubahnya menjadi Text