XML to PDF XML to PDF Converter XML to PDF Converter Upload XML File Or Paste XML Here { if (pdfData) { pdfData.save('converted-data.pdf'); } }); async function handleConversion() { let xmlData; // Hide previous messages outputContainer.classList.add('hidden'); errorMessage.classList.add('hidden'); statusMessage.classList.remove('hidden'); try { // Check if file was uploaded if (xmlInput.files.length > 0) { const file = xmlInput.files[0]; xmlData = await readFileAsText(file); } // Otherwise check if text was pasted else if (xmlTextarea.value.trim() !== '') { xmlData = xmlTextarea.value; } else { throw new Error('Please provide XML data either by uploading a file or pasting it.'); } // Parse XML const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlData, "application/xml"); // Check for XML parsing errors if (xmlDoc.getElementsByTagName("parsererror").length > 0) { throw new Error('Invalid XML format. Please check your XML data.'); } // Simulate progress simulateProgress(); // Generate PDF after a short delay to show progress setTimeout(() => { generatePDF(xmlDoc); statusMessage.classList.add('hidden'); // Auto-download if file was uploaded if (xmlInput.files.length > 0) { pdfData.save('converted-data.pdf'); } // Show download button if text was pasted else { outputContainer.classList.remove('hidden'); } }, 1500); } catch (error) { showError(error.message); console.error('Conversion error:', error); } } function readFileAsText(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = event => resolve(event.target.result); reader.onerror = error => reject(error); reader.readAsText(file); }); } function generatePDF(xmlDoc) { // Create new PDF document const doc = new jsPDF(); // Add title doc.setFontSize(20); doc.text('XML Data Export', 105, 20, { align: 'center' }); // Convert XML to readable format const xmlString = formatXML(xmlDoc); // Add content to PDF doc.setFontSize(12); const lines = doc.splitTextToSize(xmlString, 180); doc.text(lines, 15, 30); // Save the PDF data for download pdfData = doc; } function formatXML(xmlDoc) { // Convert XML to formatted string const serializer = new XMLSerializer(); let xmlString = serializer.serializeToString(xmlDoc); // Format with indentation (basic formatting) xmlString = xmlString .replace(/>\n<') .replace(/<([^>]+)>/g, (match, p1) => { if (match.startsWith('')) { return ' '.repeat(getIndentLevel(p1)) + match; } return ' '.repeat(getIndentLevel(p1)) + match; }); return xmlString; } function getIndentLevel(tagName) { // Simple indentation logic if (tagName.startsWith('/')) return 0; if (tagName.includes('?xml')) return 0; return 1; } function simulateProgress() { let progress = 0; const interval = setInterval(() => { progress += Math.random() * 20; if (progress >= 100) { progress = 100; clearInterval(interval); } progressBar.style.width = `${progress}%`; }, 200); } function showError(message) { errorText.textContent = message; errorMessage.classList.remove('hidden'); statusMessage.classList.add('hidden'); }