ഒരു സർട്ടിഫിക്കറ്റിന് മൂല്യമുണ്ടാകുന്നത് ആളുകൾ അതിനെ വിശ്വസിക്കുന്നുണ്ടെങ്കിൽ മാത്രമാണ്. ഒരു പഠിതാവ് ഒരു ജോബ് ആപ്ലിക്കേഷനിൽ ഒരു PDF ഘടിപ്പിക്കുമ്പോൾ, അത് യഥാർത്ഥമാണെന്ന് സെക്കൻഡുകൾക്കുള്ളിൽ സ്ഥിരീകരിക്കാൻ ഒരു ഹയറിംഗ് മാനേജർക്ക് കഴിയണം. ഒരു തേർഡ് പാർട്ടി പ്ലാറ്റ്‌ഫോമിനെ ആശ്രയിക്കാതെ തന്നെ ആ വിശ്വാസം സ്വയം കെട്ടിപ്പടുക്കാനുള്ള ടൂളുകൾ Laravel നിങ്ങൾക്ക് നൽകുന്നു. ബ്രാൻഡിംഗ്, ഡാറ്റ, വെരിഫിക്കേഷൻ ചെയിൻ എന്നിവയുടെ പൂർണ്ണ നിയന്ത്രണം നിങ്ങൾക്ക് ഉണ്ടായിരിക്കും.

ലക്ഷ്യം ലളിതമാണ്: പ്രിന്റ് ചെയ്യുമ്പോൾ മികച്ച രീതിയിൽ കാണപ്പെടുന്ന ഒരു പ്രൊഫഷണൽ PDF നിർമ്മിക്കുക, ഉടനടി പരിശോധനയ്ക്കായി സ്കാൻ ചെയ്യാവുന്ന ഒരു QR കോഡ് ഉൾപ്പെടുത്തുക, കൂടാതെ ഊഹിച്ചെടുക്കാനോ വ്യാജമായി നിർമ്മിക്കാനോ കഴിയാത്ത ഒരു യുണീക് റെക്കോർഡ് സൂക്ഷിക്കുക. ഇത് എങ്ങനെ തയ്യാറാക്കാം എന്ന് നോക്കാം.

ഡാറ്റാബേസ് ലെയറിൽ നിന്ന് തുടങ്ങാം

സർട്ടിഫിക്കറ്റുകൾക്കായി ഓട്ടോ-ഇൻക്രിമെന്റിംഗ് (auto-incrementing) ഐഡികൾ ഉപയോഗിക്കരുത്. 8473 പോലുള്ള ഒരു ഐഡി ഊഹിച്ചെടുക്കാൻ എളുപ്പമാണ്. ആരെങ്കിലും നിങ്ങളുടെ വെരിഫിക്കേഷൻ പേജിലെ നമ്പറുകൾ മാറ്റി മാറ്റി പരിശോധിച്ചാൽ നിങ്ങൾ ഇതുവരെ നൽകിയ എല്ലാ സർട്ടിഫിക്കറ്റുകളും അവർക്ക് ലഭിച്ചേക്കാം. അതിനുപകരം, സർട്ടിഫിക്കറ്റ് റെക്കോർഡ് ക്രിയേറ്റ് ചെയ്യുമ്പോൾ ഒരു UUID ജനറേറ്റ് ചെയ്യുക.

നിങ്ങളുടെ മൈഗ്രേഷനിൽ (migration), UUID ഒരു സ്ട്രിംഗ് (string) ആയി സൂക്ഷിക്കുക. ഒരു ഉപയോക്താവ് കോഴ്സ് പൂർത്തിയാക്കുമ്പോൾ, ആ ഉപയോക്താവിനെയും കോഴ്സിനെയും ബന്ധിപ്പിച്ചുകൊണ്ട് ഒരു Certificate മോഡൽ ക്രിയേറ്റ് ചെയ്യുന്നതിനായി ഒരു ഇവന്റ് (event) ഫയർ ചെയ്യുക. വെരിഫിക്കേഷൻ എൻഡ്പോയിന്റ് (verification endpoint) ഓതന്റിക്കേറ്റഡ് ഡാഷ്‌ബോർഡുകളിൽ നിന്ന് പൂർണ്ണമായും വേർതിരിച്ചു നിർത്തുക. /verify/{uuid} പോലുള്ള ഒരു പബ്ലിക് റൂട്ട് റെക്കോർഡ് തിരയുകയും സ്വീകർത്താവിന്റെ പേര്, കോഴ്സ് ടൈറ്റിൽ, കോഴ്സ് പൂർത്തിയാക്കിയ തീയതി എന്നിവ പ്രദർശിപ്പിക്കുകയും വേണം. UUID ഇല്ലെങ്കിൽ, 404 റിട്ടേൺ ചെയ്യുക. അധികമായി ലോഗിൻ ചെയ്യേണ്ട ആവശ്യമില്ല.

ഈ ഒരു ഡിസൈൻ തീരുമാനം സ്വകാര്യത സംരക്ഷിക്കുകയും എൻുമറേഷൻ അറ്റാക്കുകൾ (enumeration attacks) തടയുകയും ചെയ്യുന്നു.

Blade ടെംപ്ലേറ്റ് ഡിസൈൻ ചെയ്യുക

നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് ഡിസൈൻ ഒരു സാധാരണ Blade വ്യൂവിൽ (view) ആണെങ്കിലും, ഒരു സാധാരണ വെബ് പേജിനെപ്പോലെ ഇതിനെ കാണരുത്. PDF റെൻഡറിംഗ് എൻജിനുകൾ ബ്രൗസറുകളെപ്പോലെയല്ല പ്രവർത്തിക്കുന്നത്. എക്സ്റ്റേണൽ സ്റ്റൈൽഷീറ്റുകൾ (external stylesheets) വിശ്വസനീയമല്ല, കാരണം PDF കൺവെർട്ടർ അവ കൃത്യമായി എടുക്കണമെന്നില്ല. അതിനാൽ ഇൻലൈൻ CSS (inline CSS) മാത്രം ഉപയോഗിക്കുക.

ഫിസിക്കൽ ഡൈമെൻഷനുകളെക്കുറിച്ച് (physical dimensions) ചിന്തിക്കുക. നിങ്ങൾക്ക് ഒരു ലാൻഡ്‌സ്‌കേപ്പ് (landscape) സർട്ടിഫിക്കറ്റ് വേണമെങ്കിൽ, കണ്ടെയ്നറിന്റെ വീതിയും ഉയരവും നേരിട്ട് സെറ്റ് ചെയ്യുക:

<div style="width: 11in; height: 8.5in; position: relative; padding: 40px; font-family: Georgia, serif;">

ആ കണ്ടെയ്നറിനുള്ളിൽ അബ്സല്യൂട്ട് പൊസിഷനിംഗ് (absolute positioning) ഉപയോഗിച്ച് സിഗ്നേച്ചറുകൾ, സീലുകൾ, ബോർഡറുകൾ എന്നിവ ക്രമീകരിക്കുക. വെബ് സേഫ് ഫോണ്ടുകൾ (web-safe fonts) ഉപയോഗിക്കുന്നതാണ് ഏറ്റവും സുരക്ഷിതം, എങ്കിലും ശ്രദ്ധിച്ചാൽ ചില PDF എൻജിനുകൾ ഫോണ്ട് എംബെഡ് ചെയ്യാൻ അനുവദിക്കാറുണ്ട്. നിങ്ങളുടെ റെൻഡറിംഗ് എൻജിൻ ഇത് പിന്തുണയ്ക്കുന്നുണ്ടെന്ന് ഉറപ്പില്ലെങ്കിൽ CSS Grid അല്ലെങ്കിൽ അഡ്വാൻസ്ഡ് Flexbox എന്നിവയിൽ അമിതമായി ആശ്രയിക്കുന്നത് ഒഴിവാക്കുക. കൂടുതൽ കംപാറ്റിബിലിറ്റിക്കായി, മോഡേൺ CSS-ന് പോലും ഒരു PDF എൻജിനുള്ളിൽ ഉറപ്പിച്ചു നൽകാൻ കഴിയാത്ത അലൈൻമെന്റ് പ്രശ്നങ്ങൾ പരിഹരിക്കാൻ പഴയ രീതിയിലുള്ള table ലേഔട്ടുകൾ ഇപ്പോഴും ഉപയോഗിക്കാം.

മാർക്കപ്പ് (markup) വൃത്തിയായി സൂക്ഷിക്കുക. HTML ലളിതമാകുന്തോറും, ലേഔട്ട് തകരാറിലാകാനുള്ള സാധ്യത കുറയും.

QR കോഡ് ചേർക്കുക

Simple QRCode പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുക. നിങ്ങളുടെ വെരിഫിക്കേഷൻ പേജിലേക്ക് നേരിട്ട് പോകുന്ന ഒരു QR കോഡ് നിങ്ങൾക്ക് ആവശ്യമാണ്. നിങ്ങളുടെ Blade ടെംപ്ലേറ്റിൽ ഇത് ഇപ്രകാരം റെൻഡർ ചെയ്യാം:

<img src="{!! QrCode::size(150)->generate(route('certificates.verify', $certificate->uuid)) !!}" style="position: absolute; bottom: 40px; right: 40px;">

ഒരു തൊഴിലുടമ ഫോൺ ഉപയോഗിച്ച് ആ കോഡ് സ്കാൻ ചെയ്യുമ്പോൾ, അവർ നിങ്ങളുടെ Laravel ആപ്പിൽ എത്തുകയും ലൈവ് റെക്കോർഡ് കാണുകയും ചെയ്യുന്നു. ഈ ഫിസിക്കൽ-ടു-ഡിജിറ്റൽ പാലമാണ് സർട്ടിഫിക്കറ്റിനെ വെരിഫിക്കബിൾ ആക്കുന്നത്. മനോഹരമായ ഒരു PDF മാത്രം കൊണ്ട് കാര്യമില്ല. QR കോഡ് വിശ്വാസ്യത ഉടനടി ലഭ്യമാക്കുന്നു.

ഒരു PDF എൻജിൻ തിരഞ്ഞെടുക്കുക

Laravel ഡെവലപ്പർമാർ സാധാരണയായി മൂന്ന് വഴികളിലൊന്നാണ് തിരഞ്ഞെടുക്കാറുള്ളത്. ഓരോന്നിനും അതിന്റേതായ ഗുണദോഷങ്ങളുണ്ട്.

DomPDF പൂർണ്ണമായും PHP-യിൽ പ്രവർത്തിക്കുന്നു. Composer വഴി ഇത് ഇൻസ്റ്റാൾ ചെയ്യാം, നിങ്ങളുടെ Blade-റണ്ടർ ചെയ്ത HTML ഇതിലേക്ക് പാസ്സ് ചെയ്ത് ഔട്ട്പുട്ട് സേവ് ചെയ്യാം. ഇതിന് അധികമായി സെർവർ സോഫ്റ്റ്‌വെയർ ആവശ്യമില്ല, അതിനാൽ ഷെയേർഡ് ഹോസ്റ്റിംഗിൽ (shared hosting) ഉപയോഗിക്കാൻ ഇത് അനുയോജ്യമാണ്. ഇതിന്റെ പോരായ്മ CSS സപ്പോർട്ടാണ്. Flexbox, Grid തുടങ്ങിയ മോഡേൺ ലേഔട്ട് ടൂളുകൾ ഭാഗികമായി മാത്രമേ സപ്പോർട്ട് ചെയ്യുകയുള്ളൂ അല്ലെങ്കിൽ അവ ശരിയായി പ്രവർത്തിക്കില്ല. കസ്റ്റം വെബ്ഫോണ്ടുകൾ (custom webfonts) ഉപയോഗിക്കുന്നത് ബുദ്ധിമുട്ടായേക്കാം, കൂടാതെ സങ്കീർണ്ണമായ ബാക്ക്ഗ്രൗണ്ടുകൾ പലപ്പോഴും തെറ്റായി കാണപ്പെട്ടേക്കാം. നിങ്ങളുടെ സർട്ടിഫിക്കറ്റ് ഡിസൈൻ ലളിതമാണെങ്കിൽ DomPDF ഉപയോഗിക്കാം. എന്നാൽ കൃത്യത ആവശ്യമാണെങ്കിൽ ഇത് നിങ്ങളെ നിരാശപ്പെടുത്തിയേക്കാം.

Browsershot മറ്റൊരു രീതിയാണ് സ്വീകരിക്കുന്നത്. ഇത് ഒരു ഹെഡ്‌ലെസ്സ് ക്രോം (headless Chrome) ഇൻസ്റ്റൻസ് പ്രവർത്തിപ്പിക്കാൻ Puppeteer ഉപയോഗിക്കുന്നു, അങ്ങനെ നിങ്ങളുടെ HTML ഒരു ബ്രൗസറിൽ കാണുന്നത് പോലെ തന്നെ റെൻഡർ ചെയ്ത് ഒരു PDF ആയി എക്‌സ്‌പോർട്ട് ചെയ്യുന്നു. ഇത് യഥാർത്ഥ ക്രോം ആയതുകൊണ്ട് തന്നെ നിങ്ങളുടെ Tailwind സ്റ്റൈലുകൾ, കസ്റ്റം ഫോണ്ടുകൾ, റെസ്പോൺസീവ് ലേഔട്ടുകൾ എന്നിവയെല്ലാം കൃത്യമായി ലഭിക്കും. ഇതിന്റെ വെല്ലുവിളി സെർവർ സെറ്റപ്പാണ്. നിങ്ങൾക്ക് Node.js, Puppeteer, Chrome എന്നിവ ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. ചില പ്ലാറ്റ്‌ഫോമുകളിൽ, പ്രോസസ്സുകൾ തടസ്സപ്പെടാതിരിക്കാൻ നിങ്ങൾ ക്രോം സാൻഡ്ബോക്സ് (Chrome sandbox) ഡിസേബിൾ ചെയ്യുകയോ മെമ്മറി ശ്രദ്ധാപൂർവ്വം കൈകാര്യം ചെയ്യുകയോ ചെയ്യേണ്ടി വരും. നിങ്ങൾക്ക് സെർവറിൽ നിയന്ത്രണമുണ്ടെങ്കിൽ മികച്ച ഡിസൈൻ കൃത്യതയ്ക്കായി Browsershot ആണ് ഏറ്റവും നല്ലത്.

HTML to PDF API എന്നത് മൂന്നാമത്തെ മാർഗ്ഗമാണ്. നിങ്ങൾ റെൻഡർ ചെയ്ത Blade HTML ഒരു സ്ട്രിംഗ് ആയി ശേഖരിക്കുകയും, അത് ഒരു എക്സ്റ്റേണൽ സർവീസിലേക്ക് POST ചെയ്യുകയും, തിരികെ ഒരു PDF ലഭിക്കുകയും ചെയ്യുന്നു. ഇതിന്റെ പ്രായോഗിക നേട്ടം സെർവർ സൈഡ് ഡിപെൻഡൻസി (dependency) ഇല്ല എന്നതാണ്. നിങ്ങൾക്ക് Chrome ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതില്ല. PHP ഫോണ്ട് സംബന്ധമായ പ്രശ്നങ്ങൾ പരിഹരിക്കേണ്ടി വരുന്നില്ല. ശരിയായ രീതിയിൽ ഫോർമാറ്റ് ചെയ്ത ഒരു വെക്റ്റർ PDF നിങ്ങൾക്ക് ലഭിക്കുന്നു. ഈ സേവനങ്ങളിൽ ഭൂരിഭാഗവും ഓരോ ഡോക്യുമെന്റിനും ചാർജ് ഈടാക്കുന്നുണ്ടെങ്കിലും, പല ആപ്ലിക്കേഷനുകളിലും ഇതിന്റെ പ്രവർത്തനക്ഷമത ആ ചിലവിനെ അർഹമാക്കുന്നു. സിസ്റ്റം അഡ്മിനിസ്ട്രേഷൻ ജോലികൾ ഇല്ലാതെ ഉയർന്ന നിലവാരമുള്ള ഔട്ട്പുട്ട് വേണമെന്നുണ്ടെങ്കിൽ, പ്രൊഡക്ഷനിലേക്ക് എത്തുന്നതിനുള്ള ഏറ്റവും വേഗമേറിയ മാർഗ്ഗം ഇതാണ്.

പൂർണ്ണമായ വർക്ക്ഫ്ലോ (Workflow)

നിങ്ങൾ ഒരു എൻജിൻ തിരഞ്ഞെടുത്തു കഴിഞ്ഞാൽ, അതിന്റെ പ്രക്രിയ വളരെ ലളിതമാണ്. ഒരു കോഴ്സ് പൂർത്തിയാകുന്ന ഇവന്റ് (event), താഴെ പറയുന്ന കാര്യങ്ങൾ ചെയ്യുന്ന ഒരു ലിസണറെ (listener) പ്രവർത്തിപ്പിക്കണം:

  1. ഒരു UUID ജനറേറ്റ് ചെയ്യുക, Certificate റെക്കോർഡ് ക്രിയേറ്റ് ചെയ്യുക.
  2. view('certificates.pdf', compact('certificate'))->render() ഉപയോഗിച്ച് Blade വ്യൂവിനെ ഒരു HTML സ്ട്രിംഗായി റെൻഡർ ചെയ്യുക.
  3. ആ HTML സ്ട്രിംഗ് നിങ്ങൾ തിരഞ്ഞെടുത്ത PDF സർവീസിലേക്കോ പാക്കേജിലേക്കോ കൈമാറുക.
  4. ലഭിച്ച ഫയൽ certificates/2024/06/uuid.pdf പോലുള്ള ഒരു ലോജിക്കൽ പാത്തിലൂടെ storage/app/certificates/ എന്നതിൽ സേവ് ചെയ്യുക.
  5. ഫയൽ ഒരു നോട്ടിഫിക്കേഷനൊപ്പം ചേർത്ത് പഠിതാവിന് (learner) ഓട്ടോമാറ്റിക്കായി ഇമെയിൽ ചെയ്യുക.

Laravel-ന്റെ നോട്ടിഫിക്കേഷൻ സിസ്റ്റം ഇമെയിൽ കാര്യങ്ങൾ കൃത്യമായി കൈകാര്യം ചെയ്യുന്നു. റെൻഡറിംഗ് ഒരു സെക്കൻഡിൽ കൂടുതൽ എടുക്കുന്നുണ്ടെങ്കിൽ, ആ ജോബ് ക്യൂ (Queue) ചെയ്യുക. പേജ് ലോഡ് ചെയ്യുമ്പോൾ ഒരു പഠിതാവ് PDF-നായി കാത്തിരിക്കുന്നത് നിങ്ങൾ ആഗ്രഹിക്കില്ല.

ഉപയോക്താവ് ഫയൽ ഡൗൺലോഡ് ചെയ്യുമ്പോൾ, ഏത് വ്യൂവറിലും തുറക്കാവുന്ന ഒരു സ്റ്റാൻഡേർഡ് PDF അവർക്ക് ലഭിക്കുന്നു. അവർ അത് പ്രിന്റ് ചെയ്യുമ്പോൾ, വെക്റ്റർ ടെക്സ്റ്റ് വ്യക്തമായി നിലനിൽക്കുന്നു. ഒരു തൊഴിലുടമ QR കോഡ് സ്കാൻ ചെയ്യുമ്പോൾ, നിങ്ങളുടെ Laravel ആപ്പ് ഡാറ്റാബേസുമായി UUID താരതമ്യം ചെയ്ത് വിവരങ്ങൾ പ്രദർശിപ്പിക്കുന്നു.

എന്തുകൊണ്ട് വെക്റ്റർ ഔട്ട്പുട്ട് അനിവാര്യമാണ്

ചില PDF ജനറേഷൻ രീതികൾ റാസ്റ്ററൈസ്ഡ് (rasterized) ഔട്ട്പുട്ട് ആണ് നൽകുന്നത്. അതായത്, ഓരോ ടെക്സ്റ്റും ഒരു ചിത്രമായി മാറുന്നു. സൂം ചെയ്യുമ്പോൾ അക്ഷരങ്ങൾ മങ്ങുന്നു. ഫയൽ സൈസ് വളരെയധികം വർദ്ധിക്കുന്നു. സ്ക്രീൻ റീഡറുകൾക്കും സെർച്ച് എഞ്ചിനുകൾക്കും ടെക്സ്റ്റ് വേർതിരിച്ചെടുക്കാൻ കഴിയില്ല.

നിങ്ങൾ തിരഞ്ഞെടുത്ത രീതി ഒരു യഥാർത്ഥ വെക്റ്റർ PDF ആണെന്ന് എപ്പോഴും ഉറപ്പുവരുത്തുക. ടെക്സ്റ്റ് സെലക്ട് ചെയ്യാൻ സാധിക്കണം. 400 ശതമാനം സൂം ചെയ്യുമ്പോഴും വരകൾ വ്യക്തമായിരിക്കണം. നിങ്ങളുടെ പഠിതാക്കൾക്ക് ഒരു PDF ആയി സേവ് ചെയ്ത സ്ക്രീൻഷോട്ട് അല്ല, മറിച്ച് ഔദ്യോഗികമായി തോന്നുന്ന ഒരു രേഖയാണ് ലഭിക്കേണ്ടത്.

വെക്റ്റർ ഔട്ട്പുട്ട് നിങ്ങളുടെ സ്റ്റോറേജ് ചിലവ് കുറയ്ക്കാനും സഹായിക്കുന്നു. വെക്റ്റർ ടെക്സ്റ്റുള്ള ഒരു പേജിന് അൻപത് കിലോബൈറ്റ് മാത്രം വരും. എന്നാൽ അതേ പേജ് ഒരു ഹൈ-റെസല്യൂഷൻ ഇമേജ് ആണെങ്കിൽ രണ്ട് മെഗാബൈറ്റിൽ കൂടുതൽ വരാം. വലിയ തോതിൽ ഉപയോഗിക്കുമ്പോൾ ഈ വ്യത്യാസം വളരെ പ്രധാനമാണ്.

നിങ്ങൾക്ക് ഉപയോഗിക്കാവുന്ന ഒരു പാഠം

ഇത് സ്വന്തമായി നിർമ്മിക്കുന്നത് ഒരു SaaS സർട്ടിഫിക്കറ്റ് പ്ലാറ്റ്‌ഫോമിന് നൽകുന്ന പണം ലാഭിക്കാൻ വേണ്ടി മാത്രമല്ല. ഇത് വിശ്വാസ്യതയെക്കുറിച്ചാണ്. ഒരു പഠിതാവിന് ഒരു രേഖ പ്രിന്റ് ചെയ്ത് മറ്റൊരാൾക്ക് നൽകാനും, ആ വ്യക്തിക്ക് ഫോൺ ഉപയോഗിച്ച് അത് ഉടൻ തന്നെ പരിശോധിക്കാനും കഴിയുമ്പോൾ, നിങ്ങൾ അവർക്ക് ശാശ്വതമായ ഒന്ന് നൽകിക്കഴിഞ്ഞു. ഡിസൈനും ഡാറ്റയും നിങ്ങളുടെ നിയന്ത്രണത്തിലാണ്. വിശ്വാസം നിങ്ങളുടെ ബ്രാൻഡിന്റേതാണ്, ഒരു വെണ്ടറുടെ സബ്ഡൊമെയ്ന്റല്ല.

നിങ്ങളുടെ സ്വന്തം Laravel ആപ്ലിക്കേഷനുകളിൽ സർട്ടിഫിക്കറ്റ് ജനറേഷനും വെരിഫിക്കേഷനും നിങ്ങൾ എങ്ങനെയാണ് കൈകാര്യം ചെയ്യുന്നത്? നിങ്ങൾക്ക് അനുയോജ്യമായ രീതികൾ കമന്റുകളിൽ അറിയിക്കുക.