Back
Professional CV Builder

CV Builder

Fill in your details and see your CV update in real-time

Personal Information

`; hasSkills = true; } if (section.soft) { sectionHTML += `

Soft Skills: ${section.soft.replace(/\n/g, ', ')}

`; hasSkills = true; } if (section.languages) { sectionHTML += `

Languages: ${section.languages.replace(/\n/g, ', ')}

`; hasSkills = true; } sectionHTML += `
`; if (!hasSkills) sectionHTML = ''; break; default: if (section.content) { sectionHTML = `
${section.type.charAt(0).toUpperCase() + section.type.slice(1)}

${section.content.replace(/\n/g, '
')}

`; } } return sectionHTML; }function exportAsPDF() { // Check if jsPDF is available if (typeof jsPDF !== 'undefined') { const { jsPDF } = window.jspdf; const doc = new jsPDF('p', 'pt', 'a4'); // Get the CV preview element const element = document.getElementById('cv-preview'); // Use html2canvas to capture the CV preview html2canvas(element, { scale: 2, logging: false, useCORS: true, allowTaint: true }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const imgWidth = doc.internal.pageSize.getWidth(); const imgHeight = canvas.height * imgWidth / canvas.width; doc.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight); doc.save('my-cv.pdf'); }); } else { alert('PDF export functionality not loaded. Please try again.'); } }function exportAsImage() { // Get the CV preview element const element = document.getElementById('cv-preview'); // Use html2canvas to capture the CV preview html2canvas(element, { scale: 2, logging: false, useCORS: true, allowTaint: true }).then(canvas => { const link = document.createElement('a'); link.download = 'my-cv.png'; link.href = canvas.toDataURL('image/png'); link.click(); }); }// Helper functions for data management function getPersonalInfo() { const profilePicPreview = document.getElementById('profile-pic-preview').querySelector('img'); return { fullName: document.getElementById('full-name').value, address: document.getElementById('address').value, email: document.getElementById('email').value, phone: document.getElementById('phone').value, profilePic: profilePicPreview ? profilePicPreview.src : null }; }function getAllSectionsData() { const sections = []; document.querySelectorAll('.sections-container .section').forEach(sectionEl => { const sectionId = sectionEl.id; const sectionType = sectionId.split('-')[0]; let sectionData = { type: sectionType }; switch(sectionType) { case 'education': const educationItems = []; sectionEl.querySelectorAll('.education-item').forEach(itemEl => { educationItems.push({ degree: itemEl.querySelector('.education-degree')?.value, institution: itemEl.querySelector('.education-institution')?.value, dates: itemEl.querySelector('.education-dates')?.value, description: itemEl.querySelector('.education-description')?.value }); }); sectionData.items = educationItems; break; case 'experience': const experienceItems = []; sectionEl.querySelectorAll('.experience-item').forEach(itemEl => { experienceItems.push({ title: itemEl.querySelector('.experience-title')?.value, company: itemEl.querySelector('.experience-company')?.value, dates: itemEl.querySelector('.experience-dates')?.value, description: itemEl.querySelector('.experience-description')?.value }); }); sectionData.items = experienceItems; break; case 'skills': sectionData.technical = sectionEl.querySelector('.skills-technical')?.value; sectionData.soft = sectionEl.querySelector('.skills-soft')?.value; sectionData.languages = sectionEl.querySelector('.skills-languages')?.value; break; default: sectionData.content = sectionEl.querySelector('textarea')?.value; } sections.push(sectionData); }); return sections; }function saveToLocalStorage(data) { try { localStorage.setItem('cvBuilderData', JSON.stringify(data)); } catch (e) { console.error('Failed to save to localStorage', e); } }function loadFromLocalStorage() { try { const savedData = localStorage.getItem('cvBuilderData'); if (savedData) { const data = JSON.parse(savedData); // Load personal info if (data.personalInfo) { document.getElementById('full-name').value = data.personalInfo.fullName || ''; document.getElementById('address').value = data.personalInfo.address || ''; document.getElementById('email').value = data.personalInfo.email || ''; document.getElementById('phone').value = data.personalInfo.phone || ''; if (data.personalInfo.profilePic) { document.getElementById('profile-pic-preview').innerHTML = ` `; } } // Load template if (data.template) { document.getElementById('template-selector').value = data.template; } // Load sections if (data.sections && data.sections.length > 0) { document.getElementById('sections-container').innerHTML = ''; data.sections.forEach(section => { addSection(section.type); // Wait for the section to be added, then populate it setTimeout(() => { const lastSection = document.querySelector('.sections-container .section:last-child'); if (!lastSection) return; switch(section.type) { case 'education': if (section.items && section.items.length > 0) { // Clear the default item lastSection.querySelector('.education-items').innerHTML = ''; section.items.forEach((item, index) => { if (index > 0) { lastSection.querySelector('.add-education-btn').click(); } const itemsContainer = lastSection.querySelector('.education-items'); const itemEl = itemsContainer.querySelector('.education-item:last-child'); if (itemEl) { if (item.degree) itemEl.querySelector('.education-degree').value = item.degree; if (item.institution) itemEl.querySelector('.education-institution').value = item.institution; if (item.dates) itemEl.querySelector('.education-dates').value = item.dates; if (item.description) itemEl.querySelector('.education-description').value = item.description; } }); } break; case 'experience': if (section.items && section.items.length > 0) { // Clear the default item lastSection.querySelector('.experience-items').innerHTML = ''; section.items.forEach((item, index) => { if (index > 0) { lastSection.querySelector('.add-experience-btn').click(); } const itemsContainer = lastSection.querySelector('.experience-items'); const itemEl = itemsContainer.querySelector('.experience-item:last-child'); if (itemEl) { if (item.title) itemEl.querySelector('.experience-title').value = item.title; if (item.company) itemEl.querySelector('.experience-company').value = item.company; if (item.dates) itemEl.querySelector('.experience-dates').value = item.dates; if (item.description) itemEl.querySelector('.experience-description').value = item.description; } }); } break; case 'skills': if (section.technical) lastSection.querySelector('.skills-technical').value = section.technical; if (section.soft) lastSection.querySelector('.skills-soft').value = section.soft; if (section.languages) lastSection.querySelector('.skills-languages').value = section.languages; break; default: if (section.content) lastSection.querySelector('textarea').value = section.content; } }, 10); }); } } } catch (e) { console.error('Failed to load from localStorage', e); } }// Load external libraries dynamically function loadExternalLibraries() { // Check if jsPDF is already loaded if (typeof jsPDF === 'undefined') { const script = document.createElement('script'); script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js'; script.onload = function() { // Check if html2canvas is already loaded if (typeof html2canvas === 'undefined') { const script2 = document.createElement('script'); script2.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; document.head.appendChild(script2); } }; document.head.appendChild(script); } else if (typeof html2canvas === 'undefined') { const script = document.createElement('script'); script.src = 'https://html2canvas.hertzen.com/dist/html2canvas.min.js'; document.head.appendChild(script); } }// Initialize library loading loadExternalLibraries();