Resume & Cover Letter Writer

Resume & Cover Letter Writer

Craft professional job application documents with ease.

Personal Information

Dear ${coverLetter.hiringManager || 'Hiring Team'},

${coverLetter.letterBody || ''}

Sincerely,

${personal.fullName || ''}

`; document.getElementById('letter-preview').innerHTML = html; } function downloadPDF(type) { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const data = getFormData(); const margin = 20; const pageWidth = doc.internal.pageSize.getWidth(); let yPos = margin; doc.setFont('Times', 'normal'); doc.setFontSize(12); const renderWrappedText = (text, x, y, options) => { const lines = doc.splitTextToSize(text, options.maxWidth || (pageWidth - margin * 2)); doc.text(lines, x, y); return y + (lines.length * (options.lineHeight || 5)); }; if (type === 'resume') { const { personal, experience, education, skills } = data; // Header doc.setFont('Times', 'bold'); doc.setFontSize(24); doc.text(personal.fullName, pageWidth / 2, yPos, { align: 'center' }); yPos += 8; doc.setFont('Times', 'normal'); doc.setFontSize(10); const contactLine = `${personal.address} | ${personal.phone} | ${personal.email}${personal.linkedin ? ' | ' + personal.linkedin : ''}`; doc.text(contactLine, pageWidth / 2, yPos, { align: 'center' }); yPos += 5; doc.setLineWidth(0.5); doc.line(margin, yPos, pageWidth - margin, yPos); yPos += 10; // Experience if (experience.length > 0) { doc.setFont('Times', 'bold'); doc.setFontSize(14); doc.text('Experience', margin, yPos); yPos += 6; experience.forEach(exp => { doc.setFontSize(12); doc.text(exp.title + ' - ' + exp.company, margin, yPos); doc.text(formatMonthYear(exp.startDate) + ' - ' + formatMonthYear(exp.endDate), pageWidth - margin, yPos, {align: 'right'}); yPos += 5; doc.setFont('Times', 'italic'); doc.setFontSize(10); doc.text(exp.location, margin, yPos); yPos += 5; doc.setFont('Times', 'normal'); const descItems = exp.description.split('-').map(i => i.trim()).filter(Boolean); descItems.forEach(item => { yPos = renderWrappedText(`• ${item}`, margin + 4, yPos, { lineHeight: 6 }); }); yPos += 4; }); } // Education if (education.length > 0) { doc.setFont('Times', 'bold'); doc.setFontSize(14); doc.text('Education', margin, yPos); yPos += 6; education.forEach(edu => { doc.setFontSize(12); doc.text(`${edu.degree}, ${edu.institution}`, margin, yPos); doc.text(formatMonthYear(edu.gradDate), pageWidth - margin, yPos, {align: 'right'}); yPos += 5; doc.setFont('Times', 'italic'); doc.setFontSize(10); doc.text(edu.location, margin, yPos); yPos += 8; }); } // Skills if (skills.length > 0) { doc.setFont('Times', 'bold'); doc.setFontSize(14); doc.text('Skills', margin, yPos); yPos += 6; doc.setFont('Times', 'normal'); doc.setFontSize(12); renderWrappedText(skills.join(', '), margin, yPos, {}); } doc.save(`Resume_${personal.fullName.replace(/\s/g, '_')}.pdf`); } else if (type === 'letter') { const { personal, coverLetter } = data; const today = new Date().toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC' }); doc.setFontSize(12); // Sender info doc.text(personal.fullName, pageWidth - margin, yPos, { align: 'right' }); yPos += 5; doc.text(personal.address, pageWidth - margin, yPos, { align: 'right' }); yPos += 5; doc.text(`${personal.phone} | ${personal.email}`, pageWidth - margin, yPos, { align: 'right' }); yPos += 15; // Date doc.text(today, margin, yPos); yPos += 10; // Recipient info doc.text(coverLetter.hiringManager || 'Hiring Manager', margin, yPos); yPos += 5; doc.text(coverLetter.companyName, margin, yPos); yPos += 5; doc.text(coverLetter.companyAddress, margin, yPos); yPos += 15; // Body doc.text(`Dear ${coverLetter.hiringManager || 'Hiring Team'},`, margin, yPos); yPos += 10; yPos = renderWrappedText(coverLetter.letterBody, margin, yPos, { lineHeight: 7 }); yPos += 10; doc.text('Sincerely,', margin, yPos); yPos += 15; doc.text(personal.fullName, margin, yPos); doc.save(`Cover_Letter_${personal.fullName.replace(/\s/g, '_')}.pdf`); } } // Initialize showTab(currentTab); addEntry('experience-template', elements.expEntries); addEntry('education-template', elements.eduEntries); });
Scroll to Top