પ્રમાણપત્ર ત્યારે જ મહત્વનું છે જ્યારે લોકો તેના પર વિશ્વાસ કરે. જ્યારે કોઈ શીખનાર (learner) નોકરીની અરજી સાથે PDF જોડે છે, ત્યારે હાયરિંગ મેનેજરને સેકન્ડોમાં તે સાચું છે કે નહીં તે કન્ફર્મ કરી શકવું જોઈએ. Laravel તમને કોઈ તૃતીય-પક્ષ (third-party) પ્લેટફોર્મને નિયંત્રણ સોંપ્યા વિના, જાતે જ તે વિશ્વાસ કેળવવા માટેના સાધનો આપે છે. તમે બ્રાન્ડિંગ, ડેટા અને વેરિફિકેશન ચેઈન પર સંપૂર્ણ નિયંત્રણ રાખી શકો છો.
ધ્યેય સરળ છે: એક પ્રોફેશનલ PDF જનરેટ કરવી જે પ્રિન્ટ કરતી વખતે સ્પષ્ટ દેખાય, જેમાં ત્વરિત વેરિફિકેશન માટે સ્કેન કરી શકાય તેવો QR કોડ હોય, અને એક અનન્ય (unique) રેકોર્ડ સ્ટોર કરે જેને અનુમાનિત કરી ન શકાય અથવા બનાવટી બનાવી ન શકાય. તેને કેવી રીતે તૈયાર કરવું તે અહીં છે.
ડેટાબેઝ લેયરથી શરૂઆત કરો
પ્રમાણપત્રો માટે auto-incrementing IDs નો ઉપયોગ કરશો નહીં. 8473 જેવી ID અનુમાનિત કરવી સરળ છે. કોઈ પણ વ્યક્તિ તમારા વેરિફિકેશન પેજ પર નંબરો બદલીને તમે અત્યાર સુધી ઇશ્યૂ કરેલા દરેક ક્રેડેન્શિયલ મેળવી (scrape) શકે છે. તેના બદલે, જ્યારે તમે પ્રમાણપત્રનો રેકોર્ડ બનાવો ત્યારે UUID જનરેટ કરો.
તમારા migration માં, UUID ને string તરીકે સ્ટોર કરો. જ્યારે યુઝર કોર્સ પૂરો કરે, ત્યારે એક event ફાયર કરો જે યુઝર અને કોર્સ સાથે જોડાયેલું Certificate મોડલ બનાવે. વેરિફિકેશન endpoint ને કોઈપણ authenticated dashboard થી સંપૂર્ણપણે અલગ રાખો. /verify/{uuid} જેવો પબ્લિક રૂટ રેકોર્ડ શોધીને પ્રાપ્તકર્તાનું નામ, કોર્સનું શીર્ષક અને પૂર્ણ થયાની તારીખ દર્શાવવો જોઈએ. જો UUID અસ્તિત્વમાં ન હોય, તો 404 રિટર્ન કરો. કોઈ વધારાના લોગિનની જરૂર નથી.
આ એક જ ડિઝાઇન પસંદગી પ્રાઇવસીનું રક્ષણ કરે છે અને enumeration attacks ને અટકાવે છે.
Blade Template ડિઝાઇન કરવી
તમારી પ્રમાણપત્ર ડિઝાઇન એક સ્ટાન્ડર્ડ Blade view માં હોય છે, પરંતુ તમારે તેને સામાન્ય વેબ પેજ કરતા અલગ રીતે લેવી જોઈએ. PDF rendering engines બ્રાઉઝરની જેમ કામ કરતા નથી. External stylesheets અવિશ્વસનીય છે કારણ કે PDF કન્વર્ટર કદાચ તેને તે જ સંદર્ભમાં ફેચ (fetch) ન કરી શકે. ફક્ત inline CSS નો જ ઉપયોગ કરો.
ભૌતિક પરિમાણો (physical dimensions) વિશે વિચારો. જો તમે લેન્ડસ્કેપ પ્રમાણપત્ર ઈચ્છતા હોવ, તો કન્ટેનરની પહોળાઈ અને ઊંચાઈ સીધી સેટ કરો:
<div style="width: 11in; height: 8.5in; position: relative; padding: 40px; font-family: Georgia, serif;">
તે કન્ટેનરની અંદર absolute positioning નો ઉપયોગ કરીને સહીઓ, સીલ અને બોર્ડર ગોઠવો. Web-safe fonts એ તમારો સૌથી સુરક્ષિત વિકલ્પ છે, જોકે જો તમે સાવધ રહો તો કેટલાક PDF engines ફોન્ટ એમ્બેડિંગની મંજૂરી આપે છે. જ્યાં સુધી તમને ખાતરી ન હોય કે તમારું rendering engine તેને સપોર્ટ કરે છે, ત્યાં સુધી CSS Grid અથવા એડવાન્સ્ડ Flexbox પર વધુ પડતો આધાર રાખવાનું ટાળો. વ્યાપક સુસંગતતા (compatibility) માટે, જૂના જમાનાના table લેઆઉટ હજી પણ એલાઈનમેન્ટની સમસ્યાઓ ઉકેલે છે જે આધુનિક CSS PDF engine ની અંદર ખાતરી આપી શકતું નથી.
માર્કઅપ સાફ રાખો. HTML જેટલું સરળ હશે, કન્વર્ટર દ્વારા બ્રોકન લેઆઉટ સાથે તમને આશ્ચર્યજનક પરિણામ આપવાની શક્યતા તેટલી ઓછી રહેશે.
QR Code ઉમેરવો
Simple QRCode પેકેજ ઇન્સ્ટોલ કરો. તમારે એવા QR કોડની જરૂર છે જે સીધો તમારા વેરિફિકેશન પેજ પર પોઇન્ટ કરે. તમારા Blade template માં, તેને આ રીતે રેન્ડર કરો:
<img src="{!! QrCode::size(150)->generate(route('certificates.verify', $certificate->uuid)) !!}" style="position: absolute; bottom: 40px; right: 40px;">
જ્યારે કોઈ એમ્પ્લોયર ફોનથી તે કોડ સ્કેન કરે છે, ત્યારે તેઓ તમારી Laravel એપ પર પહોંચે છે અને લાઈવ રેકોર્ડ જુએ છે. તે physical-to-digital બ્રિજ જ પ્રમાણપત્રને વેરિફાઇએબલ બનાવે છે. માત્ર એક સુંદર PDF કંઈ સાબિત કરતી નથી. QR કોડ વિશ્વાસને ત્વરિત અને વિઝ્યુઅલ બનાવે છે.
PDF Engine પસંદ કરવું
Laravel ડેવલપર્સ સામાન્ય રીતે ત્રણમાંથી એક માર્ગ પસંદ કરે છે. દરેકના પોતાના ફાયદા અને ગેરફાયદા (trade-offs) છે.
DomPDF સંપૂર્ણપણે PHP માં ચાલે છે. તેને Composer દ્વારા ઇન્સ્ટોલ કરો, તમારું Blade-rendered HTML તેમાં પાસ કરો અને આઉટપુટ સેવ કરો. તેને કોઈ વધારાના સર્વર સોફ્ટવેરની જરૂર નથી, જે તેને shared hosting પર આકર્ષક બનાવે છે. તેની નકારાત્મક બાજુ CSS સપોર્ટ છે. Flexbox અને Grid જેવા આધુનિક લેઆઉટ ટૂલ્સ કાં તો આંશિક રીતે સપોર્ટેડ છે અથવા બગડી જાય છે. કસ્ટમ webfonts મુશ્કેલ હોઈ શકે છે, અને જટિલ બેકગ્રાઉન્ડ ઘણીવાર ખોટી રીતે રેન્ડર થાય છે. જો તમારી પ્રમાણપત્ર ડિઝાઇન સાદી હોય, તો DomPDF કામ કરશે. જો તમારે ચોકસાઈ (precision) જોઈતી હોય, તો તે તમને નિરાશ કરશે.
Browsershot એક અલગ અભિગમ અપનાવે છે. તે હેડલેસ Chrome ઇન્સ્ટન્સ ચલાવવા માટે Puppeteer નો ઉપયોગ કરે છે, તમારા HTML ને બ્રાઉઝર જે રીતે જુએ છે તે જ રીતે રેન્ડર કરે છે અને PDF એક્સપોર્ટ કરે છે. કારણ કે તે અસલી Chrome છે, તમારી Tailwind સ્ટાઇલ્સ, કસ્ટમ ફોન્ટ્સ અને રિસ્પોન્સિવ લેઆઉટ્સ બધું જ સંપૂર્ણ રીતે ટ્રાન્સલેટ થાય છે. તેની મુશ્કેલી સર્વર સેટઅપમાં છે. તમારે Node.js, Puppeteer અને Chrome ઇન્સ્ટોલ કરેલું હોવું જોઈએ. કેટલાક પ્લેટફોર્મ પર, તમારે પ્રોસેસ અટકી ન જાય તે માટે Chrome sandbox ને ડિસેબલ કરવું પડે અથવા મેમરીનું કાળજીપૂર્વક સંચાલન કરવું પડે. જો તમે તમારા સર્વરને નિયંત્રિત કરો છો અને પિક્સેલ-પરફેક્ટ ડિઝાઇન રેપ્લિકેશનની જરૂર છે, તો Browsershot ને હરાવવું મુશ્કેલ છે.
HTML to PDF API એ ત્રીજો રસ્તો છે. તમે તમારા રેન્ડર કરેલા Blade HTML ને સ્ટ્રિંગ તરીકે એકત્રિત કરો છો, તેને બાહ્ય સર્વિસ પર POST કરો છો, અને બદલામાં PDF મેળવો છો. તેનો વ્યવહારુ ફાયદો એ છે કે સર્વર-સાઇડ પર કોઈ નિર્ભરતા રહેતી નથી. તમારે Chrome ઇન્સ્ટોલ કરવાની જરૂર નથી. તમારે PHP ફોન્ટની સમસ્યાઓ (quirks) ને ડિબગ કરવાની પણ જરૂર નથી. તમને યોગ્ય રીતે ફોર્મેટ કરેલ વેક્ટર (vector) PDF મળે છે. આમાંની મોટાભાગની સર્વિસ ડોક્યુમેન્ટ દીઠ ચાર્જ લે છે, પરંતુ ઘણા એપ્લિકેશન્સ માટે, તેની ઓપરેશનલ સરળતા ખર્ચના મૂલ્ય સમાન છે. જો તમે સિસએડમિન (sysadmin) ના કામ વગર ઉચ્ચ-ગુણવત્તાવાળું આઉટપુટ ઈચ્છતા હોવ, તો પ્રોડક્શન માટે આ સામાન્ય રીતે સૌથી ઝડપી માર્ગ છે.
સંપૂર્ણ વર્કફ્લો (Workflow)
એકવાર તમે તમારું એન્જિન પસંદ કરી લો, પછી પાઇપલાઇન સીધી અને સરળ છે. કોર્સ પૂર્ણ થયાની ઇવેન્ટ (event) એવા લિસનરને ટ્રિગર કરવી જોઈએ જે નીચે મુજબના કાર્યો કરે છે:
- એક UUID જનરેટ કરો અને
Certificateરેકોર્ડ બનાવો. view('certificates.pdf', compact('certificate'))->render()નો ઉપયોગ કરીને Blade વ્યુને HTML સ્ટ્રિંગમાં રેન્ડર કરો.- તે HTML સ્ટ્રિંગ તમારી પસંદ કરેલી PDF સર્વિસ અથવા પેકેજને પાસ કરો.
- પરિણામી ફાઇલને
storage/app/certificates/માં એક લોજિકલ પાથ હેઠળ સેવ કરો, જેમ કેcertificates/2024/06/uuid.pdf. - ફાઇલને નોટિફિકેશનમાં જોડો અને તેને આપમેળે લર્નરને ઇમેઇલ કરો.
Laravel ની નોટિફિકેશન સિસ્ટમ ઇમેઇલને સરળતાથી હેન્ડલ કરે છે. જો રેન્ડરિંગમાં એક સેકન્ડથી વધુ સમય લાગે છે, તો જનરેશન જોબને ક્યૂ (Queue) માં મૂકો. તમે ઇચ્છશો નહીં કે પેજ લોડ દરમિયાન લર્નર PDF માટે રાહ જુએ.
જ્યારે યુઝર ફાઇલ ડાઉનલોડ કરે છે, ત્યારે તેમને એક સ્ટાન્ડર્ડ PDF મળે છે જે કોઈપણ વ્યુઅરમાં ખુલી શકે છે. જ્યારે તેઓ તેને પ્રિન્ટ કરે છે, ત્યારે વેક્ટર ટેક્સ્ટ સ્પષ્ટ (crisp) રહે છે. જ્યારે કોઈ એમ્પ્લોયર QR કોડ સ્કેન કરે છે, ત્યારે તમારું Laravel એપ ડેટાબેઝ સામે UUID ની પુષ્ટિ કરે છે અને વિગતો દર્શાવે છે.
વેક્ટર આઉટપુટ શા માટે અનિવાર્ય છે
કેટલીક PDF જનરેશન પદ્ધતિઓ રાસ્ટરાઇઝ્ડ (rasterized) આઉટપુટ આપે છે. તેનો અર્થ એ છે કે ટેક્સ્ટનો દરેક ભાગ એક ઇમેજ બની જાય છે. ઝૂમ કરવાથી અક્ષરો ઝાંખા પડી જાય છે. ફાઇલ સાઇઝ વધી જાય છે. સ્ક્રીન રીડર્સ અને સર્ચ એન્જિન ટેક્સ્ટ કાઢી શકતા નથી.
હંમેશા ખાતરી કરો કે તમારી પસંદ કરેલી પદ્ધતિ સાચું વેક્ટર PDF બનાવે છે. ટેક્સ્ટ સિલેક્ટ કરી શકાય તેવો હોવો જોઈએ. 400 ટકા ઝૂમ પર પણ લાઇન સ્પષ્ટ હોવી જોઈએ. તમારા લર્નર્સ એક એવા દસ્તાવેજને લાયક છે જે સત્તાવાર લાગે, નહીં કે PDF તરીકે સેવ કરેલ સ્ક્રીનશોટ.
વેક્ટર આઉટપુટ તમારા સ્ટોરેજ ખર્ચને પણ ઓછો રાખે છે. વેક્ટર ટેક્સ્ટના એક પેજનું વજન પચાસ કિલોબાઇટ હોઈ શકે છે. હાઇ-રિઝોલ્યુશન ઇમેજ તરીકે તે જ પેજ બે મેગાબાઇટથી વધી શકે છે. મોટા પાયે, આ તફાવત મહત્વનો છે.
એક ઉપયોગી વાત જે તમે અમલમાં મૂકી શકો છો
આને ઇન-હાઉસ બનાવવું એ માત્ર SaaS સર્ટિફિકેટ પ્લેટફોર્મ પર પૈસા બચાવવા વિશે નથી. તે વિશ્વસનીયતા વિશે છે. જ્યારે કોઈ લર્નર દસ્તાવેજ પ્રિન્ટ કરી શકે, તેને ટેબલ પર આપી શકે અને કોઈ અજાણ્યા વ્યક્તિ તેને ફોન દ્વારા તરત જ વેરિફાય કરી શકે, ત્યારે તમે તેમને કંઈક કાયમી આપ્યું છે. તમે ડિઝાઇનને નિયંત્રિત કરો છો. તમે ડેટાને નિયંત્રિત કરો છો. વિશ્વાસ તમારા બ્રાન્ડનો છે, કોઈ વેન્ડરના સબડોમેનનો નથી.
તમે તમારા પોતાના Laravel એપ્લિકેશન્સમાં સર્ટિફિકેટ જનરેશન અને વેરિફિકેશન કેવી રીતે હેન્ડલ કરો છો? મને કોમેન્ટ્સમાં જાણવું ગમશે કે તમારા માટે શું કામ કરી રહ્યું છે.
