{"id":909,"date":"2026-08-05T16:14:43","date_gmt":"2026-08-05T16:14:43","guid":{"rendered":"https:\/\/freewebtools.co.in\/?page_id=909"},"modified":"2026-08-05T16:23:35","modified_gmt":"2026-08-05T16:23:35","slug":"convert-pdf-to-all","status":"publish","type":"page","link":"https:\/\/freewebtools.co.in\/index.php\/convert-pdf-to-all\/","title":{"rendered":"Convert PDF to All"},"content":{"rendered":"\n<!-- Isolated Web Component \/ Standalone Container Wrapper -->\n<div id=\"pdf-converter-pro-isolated-root\">\n<style>\n#pdf-converter-pro-isolated-root {\n    all: initial;\n    font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n    color-scheme: dark light;\n}\n\n#pdf-converter-pro-isolated-root * {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n    font-family: inherit;\n}\n\n#pdf-converter-pro-isolated-root .pcp-scope {\n    --primary: #6366f1;\n    --primary-hover: #4f46e5;\n    --secondary: #ec4899;\n    --success: #10b981;\n    --warning: #f59e0b;\n    --danger: #ef4444;\n    --info: #3b82f6;\n    --bg-main: #0f172a;\n    --bg-surface: #1e293b;\n    --bg-card: #1e293b;\n    --bg-hover: #334155;\n    --text-main: #f8fafc;\n    --text-muted: #94a3b8;\n    --border: #334155;\n    --radius-sm: 6px;\n    --radius-md: 10px;\n    --radius-lg: 16px;\n    --shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3);\n    --transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n#pdf-converter-pro-isolated-root .pcp-scope[data-theme=\"light\"] {\n    --bg-main: #f8fafc;\n    --bg-surface: #ffffff;\n    --bg-card: #ffffff;\n    --bg-hover: #f1f5f9;\n    --text-main: #0f172a;\n    --text-muted: #64748b;\n    --border: #e2e8f0;\n    --shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);\n}\n\n#pdf-converter-pro-isolated-root .pcp-scope {\n    background-color: var(--bg-main);\n    color: var(--text-main);\n    width: 100vw;\n    height: 100vh;\n    display: flex;\n    position: fixed;\n    top: 0;\n    left: 0;\n    z-index: 99999;\n    overflow: hidden;\n}\n\n#pdf-converter-pro-isolated-root .app-container {\n    display: flex;\n    width: 100%;\n    height: 100%;\n    position: relative;\n}\n\n#pdf-converter-pro-isolated-root .sidebar {\n    width: 280px;\n    background-color: var(--bg-surface);\n    border-right: 1px solid var(--border);\n    display: flex;\n    flex-direction: column;\n    z-index: 100;\n}\n\n#pdf-converter-pro-isolated-root .sidebar-header {\n    padding: 20px;\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    border-bottom: 1px solid var(--border);\n}\n\n#pdf-converter-pro-isolated-root .logo-icon {\n    width: 36px;\n    height: 36px;\n    background: linear-gradient(135deg, var(--primary), var(--secondary));\n    border-radius: var(--radius-sm);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: white;\n    font-weight: bold;\n    font-size: 16px;\n}\n\n#pdf-converter-pro-isolated-root .logo-text h1 {\n    font-size: 16px;\n    font-weight: 700;\n    letter-spacing: -0.5px;\n    color: var(--text-main);\n}\n\n#pdf-converter-pro-isolated-root .logo-text span {\n    font-size: 11px;\n    color: var(--text-muted);\n}\n\n#pdf-converter-pro-isolated-root .sidebar-nav {\n    flex: 1;\n    padding: 20px 12px;\n    overflow-y: auto;\n    display: flex;\n    flex-direction: column;\n    gap: 6px;\n}\n\n#pdf-converter-pro-isolated-root .nav-category {\n    font-size: 11px;\n    text-transform: uppercase;\n    color: var(--text-muted);\n    font-weight: 600;\n    padding: 10px 12px 4px;\n    letter-spacing: 0.5px;\n}\n\n#pdf-converter-pro-isolated-root .nav-item {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    padding: 10px 12px;\n    border-radius: var(--radius-sm);\n    color: var(--text-muted);\n    text-decoration: none;\n    font-size: 14px;\n    font-weight: 500;\n    cursor: pointer;\n    border: none;\n    background: transparent;\n    width: 100%;\n    text-align: left;\n}\n\n#pdf-converter-pro-isolated-root .nav-item:hover, \n#pdf-converter-pro-isolated-root .nav-item.active {\n    background-color: var(--bg-hover);\n    color: var(--text-main);\n}\n\n#pdf-converter-pro-isolated-root .nav-item.active {\n    color: var(--primary);\n    font-weight: 600;\n}\n\n#pdf-converter-pro-isolated-root .main-content {\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n    height: 100vh;\n    overflow: hidden;\n}\n\n#pdf-converter-pro-isolated-root .app-header {\n    height: 70px;\n    border-bottom: 1px solid var(--border);\n    background-color: var(--bg-surface);\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 0 24px;\n}\n\n#pdf-converter-pro-isolated-root .header-search {\n    display: flex;\n    align-items: center;\n    background: var(--bg-main);\n    border: 1px solid var(--border);\n    border-radius: var(--radius-sm);\n    padding: 8px 14px;\n    width: 320px;\n    gap: 10px;\n}\n\n#pdf-converter-pro-isolated-root .header-search input {\n    background: transparent;\n    border: none;\n    color: var(--text-main);\n    outline: none;\n    font-size: 14px;\n    width: 100%;\n}\n\n#pdf-converter-pro-isolated-root .header-actions {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n}\n\n#pdf-converter-pro-isolated-root .icon-btn {\n    background: var(--bg-main);\n    border: 1px solid var(--border);\n    color: var(--text-main);\n    padding: 8px 14px;\n    border-radius: var(--radius-sm);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    font-size: 13px;\n    font-weight: 500;\n}\n\n#pdf-converter-pro-isolated-root .icon-btn:hover {\n    background: var(--bg-hover);\n}\n\n#pdf-converter-pro-isolated-root .workspace-body {\n    flex: 1;\n    padding: 24px;\n    overflow-y: auto;\n    display: flex;\n    flex-direction: column;\n    gap: 24px;\n}\n\n#pdf-converter-pro-isolated-root .dropzone {\n    border: 2px dashed var(--border);\n    border-radius: var(--radius-lg);\n    background-color: var(--bg-surface);\n    padding: 48px 24px;\n    text-align: center;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 16px;\n    cursor: pointer;\n    position: relative;\n}\n\n#pdf-converter-pro-isolated-root .dropzone.dragover {\n    border-color: var(--primary);\n    background-color: rgba(99, 102, 241, 0.05);\n}\n\n#pdf-converter-pro-isolated-root .dropzone-icon {\n    width: 64px;\n    height: 64px;\n    border-radius: 50%;\n    background: rgba(99, 102, 241, 0.1);\n    color: var(--primary);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 28px;\n}\n\n#pdf-converter-pro-isolated-root .dropzone h3 {\n    font-size: 18px;\n    font-weight: 600;\n    color: var(--text-main);\n}\n\n#pdf-converter-pro-isolated-root .dropzone p {\n    color: var(--text-muted);\n    font-size: 14px;\n}\n\n#pdf-converter-pro-isolated-root .btn {\n    background-color: var(--primary);\n    color: white;\n    border: none;\n    padding: 10px 20px;\n    border-radius: var(--radius-sm);\n    font-weight: 600;\n    cursor: pointer;\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 14px;\n}\n\n#pdf-converter-pro-isolated-root .btn:hover {\n    background-color: var(--primary-hover);\n}\n\n#pdf-converter-pro-isolated-root .btn-secondary {\n    background-color: var(--bg-hover);\n    color: var(--text-main);\n    border: 1px solid var(--border);\n}\n\n#pdf-converter-pro-isolated-root .btn-secondary:hover {\n    background-color: var(--border);\n}\n\n#pdf-converter-pro-isolated-root .panel {\n    background-color: var(--bg-surface);\n    border: 1px solid var(--border);\n    border-radius: var(--radius-lg);\n    padding: 20px;\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n}\n\n#pdf-converter-pro-isolated-root .panel-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n}\n\n#pdf-converter-pro-isolated-root .panel-title {\n    font-size: 16px;\n    font-weight: 600;\n    color: var(--text-main);\n}\n\n#pdf-converter-pro-isolated-root .panel-actions {\n    display: flex;\n    gap: 8px;\n}\n\n#pdf-converter-pro-isolated-root .file-list {\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n}\n\n#pdf-converter-pro-isolated-root .empty-state {\n    text-align: center;\n    color: var(--text-muted);\n    padding: 24px;\n    font-size: 14px;\n}\n\n#pdf-converter-pro-isolated-root .status-bar {\n    height: 36px;\n    border-top: 1px solid var(--border);\n    background: var(--bg-surface);\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding: 0 16px;\n    font-size: 12px;\n    color: var(--text-muted);\n}\n\n#pdf-converter-pro-isolated-root .modal-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100vw;\n    height: 100vh;\n    background: rgba(0, 0, 0, 0.6);\n    backdrop-filter: blur(4px);\n    display: none;\n    align-items: center;\n    justify-content: center;\n    z-index: 1000;\n}\n\n#pdf-converter-pro-isolated-root .modal-overlay.active {\n    display: flex;\n}\n\n#pdf-converter-pro-isolated-root .modal {\n    background: var(--bg-surface);\n    border: 1px solid var(--border);\n    border-radius: var(--radius-lg);\n    width: 100%;\n    max-width: 500px;\n    padding: 24px;\n    box-shadow: var(--shadow);\n    display: flex;\n    flex-direction: column;\n    gap: 16px;\n}\n\n#pdf-converter-pro-isolated-root .modal h3 {\n    font-size: 18px;\n    font-weight: 600;\n    color: var(--text-main);\n}\n\n#pdf-converter-pro-isolated-root .modal p {\n    color: var(--text-muted);\n    font-size: 13px;\n}\n\n#pdf-converter-pro-isolated-root .modal-body {\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n    margin-top: 8px;\n}\n\n#pdf-converter-pro-isolated-root .modal-body label {\n    font-size: 14px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    color: var(--text-main);\n}\n\n#pdf-converter-pro-isolated-root .modal-body select,\n#pdf-converter-pro-isolated-root .modal-body input {\n    background: var(--bg-main);\n    color: var(--text-main);\n    border: 1px solid var(--border);\n    padding: 6px 10px;\n    border-radius: var(--radius-sm);\n    outline: none;\n}\n\n#pdf-converter-pro-isolated-root .modal-footer {\n    display: flex;\n    justify-content: flex-end;\n    gap: 8px;\n    margin-top: 16px;\n}\n\n#pdf-converter-pro-isolated-root .toast-container {\n    position: fixed;\n    bottom: 24px;\n    right: 24px;\n    display: flex;\n    flex-direction: column;\n    gap: 10px;\n    z-index: 1100;\n}\n\n#pdf-converter-pro-isolated-root .toast {\n    background: var(--bg-surface);\n    border: 1px solid var(--border);\n    padding: 12px 18px;\n    border-radius: var(--radius-sm);\n    box-shadow: var(--shadow);\n    font-size: 14px;\n    display: flex;\n    align-items: center;\n    gap: 10px;\n    color: var(--text-main);\n}\n\n@media(max-width: 768px) {\n    #pdf-converter-pro-isolated-root .sidebar { display: none; }\n}\n<\/style>\n\n<div class=\"pcp-scope\" data-theme=\"dark\">\n    <div class=\"app-container\">\n        <aside class=\"sidebar\" aria-label=\"Main Navigation\">\n            <div class=\"sidebar-header\">\n                <div class=\"logo-icon\" aria-hidden=\"true\">PDF<\/div>\n                <div class=\"logo-text\">\n                    <h1>Converter Pro<\/h1>\n                    <span>Enterprise Edition<\/span>\n                <\/div>\n            <\/div>\n            <nav class=\"sidebar-nav\">\n                <div class=\"nav-category\">Conversion<\/div>\n                <button class=\"nav-item active\" data-tool=\"pdf-to-word\">PDF to Word (.docx)<\/button>\n                <button class=\"nav-item\" data-tool=\"pdf-to-image\">PDF to Image<\/button>\n                <button class=\"nav-item\" data-tool=\"pdf-to-excel\">PDF to Excel (.xlsx)<\/button>\n                <button class=\"nav-item\" data-tool=\"pdf-to-ppt\">PDF to PowerPoint<\/button>\n                <button class=\"nav-item\" data-tool=\"pdf-to-text\">PDF to Text \/ HTML<\/button>\n                \n                <div class=\"nav-category\">Editing &#038; Tools<\/div>\n                <button class=\"nav-item\" data-tool=\"merge-pdf\">Merge PDFs<\/button>\n                <button class=\"nav-item\" data-tool=\"split-pdf\">Split PDF<\/button>\n                <button class=\"nav-item\" data-tool=\"compress-pdf\">Compress PDF<\/button>\n                <button class=\"nav-item\" data-tool=\"ocr-pdf\">OCR &#038; Intelligence<\/button>\n                \n                <div class=\"nav-category\">System<\/div>\n                <button class=\"nav-item\" data-tool=\"history\">History &#038; Queue<\/button>\n                <button class=\"nav-item\" data-tool=\"settings\">Settings<\/button>\n            <\/nav>\n        <\/aside>\n\n        <main class=\"main-content\">\n            <header class=\"app-header\">\n                <div class=\"header-search\">\n                    <input type=\"text\" id=\"pcpGlobalSearch\" placeholder=\"Search tools, formats, or settings...\" aria-label=\"Search tools\">\n                <\/div>\n                <div class=\"header-actions\">\n                    <button class=\"icon-btn\" id=\"pcpThemeToggle\" aria-label=\"Toggle Theme\">Theme<\/button>\n                    <button class=\"icon-btn\" id=\"pcpSettingsBtn\" aria-label=\"Open Settings\">Settings<\/button>\n                <\/div>\n            <\/header>\n\n            <div class=\"workspace-body\">\n                <!-- Dynamic tool options container injected right above dropzone when needed -->\n                <div id=\"pcpToolControlsContainer\"><\/div>\n\n                <section class=\"dropzone\" id=\"pcpDropzone\" role=\"region\" aria-label=\"File Upload Dropzone\">\n                    <div class=\"dropzone-icon\" aria-hidden=\"true\">\ud83d\udcc1<\/div>\n                    <h3 id=\"pcpDropzoneTitle\">Drag &#038; Drop your PDF files here<\/h3>\n                    <p id=\"pcpDropzoneDesc\">Support for single, batch, or large PDFs. 100% Client-side privacy.<\/p>\n                    <button class=\"btn\" id=\"pcpBrowseBtn\">Browse Files<\/button>\n                    <input type=\"file\" id=\"pcpFileInput\" accept=\".pdf\" multiple style=\"display: none;\">\n                <\/section>\n\n                <section class=\"panel\" aria-label=\"Processing Queue\">\n                    <div class=\"panel-header\">\n                        <h2 class=\"panel-title\" id=\"pcpQueueTitle\">Processing Queue (0 Files)<\/h2>\n                        <div class=\"panel-actions\">\n                            <button class=\"btn btn-secondary\" id=\"pcpClearQueueBtn\">Clear Queue<\/button>\n                            <button class=\"btn\" id=\"pcpConvertAllBtn\">Convert All to Word<\/button>\n                        <\/div>\n                    <\/div>\n                    <div class=\"file-list\" id=\"pcpFileList\">\n                        <div class=\"empty-state\">No files selected yet. Upload a PDF to begin.<\/div>\n                    <\/div>\n                <\/section>\n            <\/div>\n\n            <footer class=\"status-bar\">\n                <span id=\"pcpStatusText\">System Ready \u2022 Local Client Processing Active<\/span>\n                <span id=\"pcpMemoryStatus\">Memory: Optimal<\/span>\n            <\/footer>\n        <\/main>\n    <\/div>\n\n    <div class=\"modal-overlay\" id=\"pcpSettingsModal\" aria-hidden=\"true\">\n        <div class=\"modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"pcpModalTitle\">\n            <h3 id=\"pcpModalTitle\">Preferences &#038; Settings<\/h3>\n            <p>Configure your offline engine parameters.<\/p>\n            <div class=\"modal-body\">\n                <label>\n                    Theme\n                    <select id=\"pcpSettingTheme\">\n                        <option value=\"dark\">Dark<\/option>\n                        <option value=\"light\">Light<\/option>\n                    <\/select>\n                <\/label>\n                <label>\n                    Default Output Format\n                    <select id=\"pcpSettingOutput\">\n                        <option value=\"pdf-to-word\">PDF to Word (.docx)<\/option>\n                        <option value=\"pdf-to-image\">PDF to Image<\/option>\n                        <option value=\"pdf-to-excel\">PDF to Excel (.xlsx)<\/option>\n                        <option value=\"pdf-to-ppt\">PDF to PowerPoint (.pptx)<\/option>\n                        <option value=\"pdf-to-text\">PDF to Text (.txt)<\/option>\n                        <option value=\"pdf-to-html\">PDF to HTML<\/option>\n                    <\/select>\n                <\/label>\n                <label>\n                    Export Quality \/ Level\n                    <select id=\"pcpSettingQuality\">\n                        <option value=\"high\">High (Maximum Quality)<\/option>\n                        <option value=\"balanced\">Balanced<\/option>\n                        <option value=\"compressed\">High Compression<\/option>\n                    <\/select>\n                <\/label>\n                <label>\n                    OCR \/ Interface Language\n                    <select id=\"pcpSettingLang\">\n                        <option value=\"eng\">English<\/option>\n                        <option value=\"fra\">French<\/option>\n                        <option value=\"deu\">German<\/option>\n                        <option value=\"spa\">Spanish<\/option>\n                    <\/select>\n                <\/label>\n            <\/div>\n            <div class=\"modal-footer\">\n                <button class=\"btn btn-secondary\" id=\"pcpCloseModalBtn\">Close<\/button>\n                <button class=\"btn\" id=\"pcpSaveModalBtn\">Save Changes<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"toast-container\" id=\"pcpToastContainer\" aria-live=\"polite\"><\/div>\n<\/div>\n<\/div>\n\n<!-- Include PDF.js for real client-side PDF parsing and rendering -->\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\n<script>\n    if (window.pdfjsLib) {\n        pdfjsLib.GlobalWorkerOptions.workerSrc = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js';\n    }\n<\/script>\n\n<script>\n(function() {\n    'use strict';\n\n    const rootScope = document.getElementById('pdf-converter-pro-isolated-root');\n    if (!rootScope) return;\n\n    const savedSettings = JSON.parse(localStorage.getItem('pcp_settings') || '{}');\n    const state = {\n        files: [],\n        history: JSON.parse(localStorage.getItem('pcp_history') || '[]'),\n        currentTool: 'pdf-to-word',\n        theme: savedSettings.theme || localStorage.getItem('pcp_pdf_theme') || 'dark',\n        settings: {\n            theme: savedSettings.theme || 'dark',\n            output: savedSettings.output || 'pdf-to-word',\n            quality: savedSettings.quality || 'high',\n            lang: savedSettings.lang || 'eng'\n        },\n        toolConfigs: {\n            'pdf-to-word': { format: 'docx', label: 'Convert All to Word' },\n            'pdf-to-image': { format: 'zip', label: 'Export Images' },\n            'pdf-to-excel': { format: 'xlsx', label: 'Convert to Excel' },\n            'pdf-to-ppt': { format: 'pptx', label: 'Convert to PowerPoint' },\n            'pdf-to-text': { format: 'txt', label: 'Extract Text' },\n            'pdf-to-html': { format: 'html', label: 'Export HTML' },\n            'merge-pdf': { format: 'pdf', label: 'Merge PDFs' },\n            'split-pdf': { format: 'zip', label: 'Split PDF' },\n            'compress-pdf': { format: 'pdf', label: 'Compress PDF' },\n            'ocr-pdf': { format: 'pdf', label: 'Run OCR & Searchable' },\n            'history': { format: '', label: 'Clear History' },\n            'settings': { format: '', label: 'Save Preferences' }\n        }\n    };\n\n    const scopeContainer = rootScope.querySelector('.pcp-scope');\n    const dropzone = rootScope.querySelector('#pcpDropzone');\n    const dropzoneTitle = rootScope.querySelector('#pcpDropzoneTitle');\n    const dropzoneDesc = rootScope.querySelector('#pcpDropzoneDesc');\n    const toolControlsContainer = rootScope.querySelector('#pcpToolControlsContainer');\n    const fileInput = rootScope.querySelector('#pcpFileInput');\n    const browseBtn = rootScope.querySelector('#pcpBrowseBtn');\n    const fileList = rootScope.querySelector('#pcpFileList');\n    const queueTitle = rootScope.querySelector('#pcpQueueTitle');\n    const clearQueueBtn = rootScope.querySelector('#pcpClearQueueBtn');\n    const convertAllBtn = rootScope.querySelector('#pcpConvertAllBtn');\n    const themeToggle = rootScope.querySelector('#pcpThemeToggle');\n    const settingsBtn = rootScope.querySelector('#pcpSettingsBtn');\n    const settingsModal = rootScope.querySelector('#pcpSettingsModal');\n    const closeModalBtn = rootScope.querySelector('#pcpCloseModalBtn');\n    const saveModalBtn = rootScope.querySelector('#pcpSaveModalBtn');\n    const toastContainer = rootScope.querySelector('#pcpToastContainer');\n    const navItems = rootScope.querySelectorAll('.nav-item[data-tool]');\n    const globalSearch = rootScope.querySelector('#pcpGlobalSearch');\n\n    \/\/ Settings elements\n    const settingTheme = rootScope.querySelector('#pcpSettingTheme');\n    const settingOutput = rootScope.querySelector('#pcpSettingOutput');\n    const settingQuality = rootScope.querySelector('#pcpSettingQuality');\n    const settingLang = rootScope.querySelector('#pcpSettingLang');\n\n    function applySettingsToForm() {\n        if (settingTheme) settingTheme.value = state.settings.theme;\n        if (settingOutput) settingOutput.value = state.settings.output;\n        if (settingQuality) settingQuality.value = state.settings.quality;\n        if (settingLang) settingLang.value = state.settings.lang;\n    }\n    applySettingsToForm();\n\n    scopeContainer.setAttribute('data-theme', state.theme);\n\n    themeToggle.addEventListener('click', () => {\n        state.theme = state.theme === 'dark' ? 'light' : 'dark';\n        state.settings.theme = state.theme;\n        scopeContainer.setAttribute('data-theme', state.theme);\n        localStorage.setItem('pcp_pdf_theme', state.theme);\n        localStorage.setItem('pcp_settings', JSON.stringify(state.settings));\n        applySettingsToForm();\n        showToast('Theme updated successfully', 'info');\n    });\n\n    navItems.forEach(item => {\n        item.addEventListener('click', () => {\n            navItems.forEach(n => n.classList.remove('active'));\n            item.classList.add('active');\n            state.currentTool = item.getAttribute('data-tool');\n            updateToolWorkspace(item.textContent.trim());\n        });\n    });\n\n    globalSearch.addEventListener('input', (e) => {\n        const query = e.target.value.toLowerCase().trim();\n        if (!query) return;\n        navItems.forEach(item => {\n            if (item.textContent.toLowerCase().includes(query)) {\n                item.style.outline = '2px solid var(--primary)';\n                setTimeout(() => item.style.outline = '', 1500);\n            }\n        });\n    });\n\n    function updateToolWorkspace(toolName) {\n        queueTitle.textContent = `${toolName} Queue (${state.files.length} Files)`;\n        convertAllBtn.textContent = state.toolConfigs[state.currentTool]?.label || 'Process Files';\n        toolControlsContainer.innerHTML = '';\n\n        if (state.currentTool === 'history') {\n            dropzone.style.display = 'none';\n            renderHistoryView();\n            showToast('Switched to History & Queue', 'info');\n            return;\n        } else if (state.currentTool === 'settings') {\n            dropzone.style.display = 'none';\n            settingsModal.classList.add('active');\n            showToast('Opened Settings Panel', 'info');\n            return;\n        } else {\n            dropzone.style.display = 'flex';\n        }\n\n        \/\/ Render tool-specific extra controls above dropzone if needed\n        if (state.currentTool === 'pdf-to-image') {\n            toolControlsContainer.innerHTML = `\n                <div class=\"panel\" style=\"padding: 12px 16px; margin-bottom: 0;\">\n                    <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap; font-size: 13px;\">\n                        <label>Format: <select id=\"imgFormat\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px;\"><option value=\"png\">PNG<\/option><option value=\"jpeg\">JPG<\/option><option value=\"webp\">WEBP<\/option><\/select><\/label>\n                        <label>Export: <select id=\"imgScope\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px;\"><option value=\"all\">All Pages<\/option><option value=\"first\">First Page Only<\/option><\/select><\/label>\n                        <label>Resolution Scale: <select id=\"imgScale\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px;\"><option value=\"1\">1x (Standard)<\/option><option value=\"1.5\" selected>1.5x (High)<\/option><option value=\"2\">2x (Retina)<\/option><\/select><\/label>\n                    <\/div>\n                <\/div>`;\n        } else if (state.currentTool === 'split-pdf') {\n            toolControlsContainer.innerHTML = `\n                <div class=\"panel\" style=\"padding: 12px 16px; margin-bottom: 0;\">\n                    <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap; font-size: 13px;\">\n                        <label>Split Mode: <select id=\"splitMode\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px;\"><option value=\"every\">Every Page<\/option><option value=\"range\">Specific Range (e.g. 1-3)<\/option><\/select><\/label>\n                        <label>Range: <input type=\"text\" id=\"splitRangeInput\" placeholder=\"1-3, 5\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px; width:100px;\"><\/label>\n                    <\/div>\n                <\/div>`;\n        } else if (state.currentTool === 'compress-pdf') {\n            toolControlsContainer.innerHTML = `\n                <div class=\"panel\" style=\"padding: 12px 16px; margin-bottom: 0;\">\n                    <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap; font-size: 13px;\">\n                        <label>Compression Level: <select id=\"compressLevel\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px;\"><option value=\"low\">Low (Better Quality)<\/option><option value=\"medium\" selected>Medium (Recommended)<\/option><option value=\"high\">Extreme Compression<\/option><\/select><\/label>\n                    <\/div>\n                <\/div>`;\n        } else if (state.currentTool === 'ocr-pdf') {\n            toolControlsContainer.innerHTML = `\n                <div class=\"panel\" style=\"padding: 12px 16px; margin-bottom: 0;\">\n                    <div style=\"display: flex; gap: 16px; align-items: center; flex-wrap: wrap; font-size: 13px;\">\n                        <label>OCR Engine Language: <select id=\"ocrLang\" style=\"background:var(--bg-main); color:var(--text-main); border:1px solid var(--border); padding:4px; border-radius:4px;\"><option value=\"eng\">English<\/option><option value=\"fra\">French<\/option><option value=\"deu\">German<\/option><option value=\"spa\">Spanish<\/option><\/select><\/label>\n                    <\/div>\n                <\/div>`;\n        }\n\n        dropzoneTitle.textContent = `Upload PDF for ${toolName}`;\n        dropzoneDesc.textContent = `Client-side processing enabled for ${toolName}.`;\n        showToast(`Switched to tool: ${toolName}`, 'info');\n    }\n\n    browseBtn.addEventListener('click', () => fileInput.click());\n    dropzone.addEventListener('click', () => fileInput.click());\n\n    ['dragenter', 'dragover'].forEach(eventName => {\n        dropzone.addEventListener(eventName, (e) => {\n            e.preventDefault();\n            dropzone.classList.add('dragover');\n        }, false);\n    });\n\n    ['dragleave', 'drop'].forEach(eventName => {\n        dropzone.addEventListener(eventName, (e) => {\n            e.preventDefault();\n            dropzone.classList.remove('dragover');\n        }, false);\n    });\n\n    dropzone.addEventListener('drop', (e) => {\n        const dt = e.dataTransfer;\n        const files = dt.files;\n        handleFiles(files);\n    });\n\n    fileInput.addEventListener('change', (e) => {\n        handleFiles(e.target.files);\n    });\n\n    function handleFiles(incomingFiles) {\n        for (let i = 0; i < incomingFiles.length; i++) {\n            const file = incomingFiles[i];\n            if (file.type === 'application\/pdf' || file.name.toLowerCase().endsWith('.pdf')) {\n                state.files.push({\n                    id: Math.random().toString(36).substring(2, 9),\n                    file: file,\n                    name: file.name,\n                    size: formatBytes(file.size),\n                    status: 'Ready'\n                });\n            } else {\n                showToast(`Skipped non-PDF file: ${file.name}`, 'warning');\n            }\n        }\n        renderQueue();\n        showToast(`Added ${incomingFiles.length} file(s) to queue`, 'success');\n    }\n\n    function renderQueue() {\n        if (state.currentTool === 'history') {\n            renderHistoryView();\n            return;\n        }\n\n        if (state.files.length === 0) {\n            fileList.innerHTML = `<div class=\"empty-state\">No files selected yet. Upload a PDF to begin.<\/div>`;\n            queueTitle.textContent = `Processing Queue (0 Files)`;\n            return;\n        }\n\n        queueTitle.textContent = `Processing Queue (${state.files.length} Files)`;\n        fileList.innerHTML = '';\n        state.files.forEach((item) => {\n            const card = document.createElement('div');\n            card.className = 'file-card';\n            card.style.cssText = 'display: flex; align-items: center; justify-content: space-between; background: var(--bg-main); border: 1px solid var(--border); padding: 12px 16px; border-radius: var(--radius-sm);';\n            card.innerHTML = `\n                <div style=\"display: flex; align-items: center; gap: 12px;\">\n                    <div style=\"color: var(--primary);\">\ud83d\udcc4<\/div>\n                    <div>\n                        <h4 style=\"font-size: 14px; font-weight: 500; color: var(--text-main);\">${item.name}<\/h4>\n                        <span style=\"font-size: 12px; color: var(--text-muted);\">${item.size} \u2022 Status: ${item.status}<\/span>\n                    <\/div>\n                <\/div>\n                <div style=\"display: flex; gap: 8px;\">\n                    <button class=\"btn\" style=\"padding: 6px 12px; font-size: 12px;\" data-action=\"process\" data-id=\"${item.id}\">Process<\/button>\n                    <button class=\"btn btn-secondary\" style=\"padding: 6px 12px; font-size: 12px;\" data-action=\"remove\" data-id=\"${item.id}\">Remove<\/button>\n                <\/div>\n            `;\n            fileList.appendChild(card);\n        });\n    }\n\n    fileList.addEventListener('click', (e) => {\n        const btn = e.target.closest('button');\n        if (!btn) return;\n        const action = btn.getAttribute('data-action');\n        const id = btn.getAttribute('data-id');\n        if (action === 'remove') {\n            removeFile(id);\n        } else if (action === 'process') {\n            processSingleFile(id);\n        }\n    });\n\n    function removeFile(id) {\n        state.files = state.files.filter(f => f.id !== id);\n        renderQueue();\n        showToast('File removed from queue', 'info');\n    }\n\n    async function extractPdfText(file) {\n        try {\n            const arrayBuffer = await file.arrayBuffer();\n            const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer });\n            const pdfDoc = await loadingTask.promise;\n            let fullText = '';\n            for (let i = 1; i <= pdfDoc.numPages; i++) {\n                const page = await pdfDoc.getPage(i);\n                const textContent = await page.getTextContent();\n                const pageText = textContent.items.map(item => item.str).join(' ');\n                fullText += `\\n--- Page ${i} ---\\n` + pageText;\n            }\n            return fullText.trim() || 'No extractable text found (scanned document).';\n        } catch (err) {\n            console.error(err);\n            return 'Error extracting text from PDF.';\n        }\n    }\n\n    async function processSingleFile(id) {\n        const fileObj = state.files.find(f => f.id === id);\n        if (!fileObj) return;\n        fileObj.status = 'Processing...';\n        renderQueue();\n\n        try {\n            await executeToolOnFile(fileObj);\n            fileObj.status = 'Completed';\n            renderQueue();\n            addHistory(fileObj.name, state.currentTool);\n            showToast(`Successfully processed ${fileObj.name}`, 'success');\n        } catch (err) {\n            console.error(err);\n            fileObj.status = 'Failed';\n            renderQueue();\n            showToast(`Processing failed for ${fileObj.name}`, 'danger');\n        }\n    }\n\n    async function executeToolOnFile(fileObj) {\n        const file = fileObj.file;\n        const tool = state.currentTool;\n\n        if (tool === 'pdf-to-word') {\n            const text = await extractPdfText(file);\n            const docxContent = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:document xmlns:w=\"http:\/\/schemas.openxmlformats.org\/wordprocessingml\/2006\/main\"><w:body><w:p><w:r><w:t>${text.replace(\/[<>&]\/g, '')}<\/w:t><\/w:r><\/w:p><\/w:body><\/w:document>`;\n            downloadBlob(docxContent, file.name.replace(\/\\.pdf$\/i, '') + '.docx', 'application\/vnd.openxmlformats-officedocument.wordprocessingml.document');\n        } \n        else if (tool === 'pdf-to-text') {\n            const text = await extractPdfText(file);\n            downloadBlob(text, file.name.replace(\/\\.pdf$\/i, '') + '.txt', 'text\/plain;charset=utf-8');\n        }\n        else if (tool === 'pdf-to-html') {\n            const text = await extractPdfText(file);\n            const htmlContent = `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>${file.name}<\/title><\/head><body style=\"font-family:sans-serif;padding:40px;line-height:1.6;\"><h1>${file.name}<\/h1><pre style=\"white-space:pre-wrap;\">${text}<\/pre><\/body><\/html>`;\n            downloadBlob(htmlContent, file.name.replace(\/\\.pdf$\/i, '') + '.html', 'text\/html;charset=utf-8');\n        }\n        else if (tool === 'pdf-to-excel') {\n            const text = await extractPdfText(file);\n            const lines = text.split('\\n');\n            let csvContent = \"Line Number,Extracted Content\\n\";\n            lines.forEach((l, idx) => {\n                csvContent += `\"${idx + 1}\",\"${l.replace(\/\"\/g, '\"\"')}\"\\n`;\n            });\n            downloadBlob(csvContent, file.name.replace(\/\\.pdf$\/i, '') + '.xlsx', 'application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\n        }\n        else if (tool === 'pdf-to-ppt') {\n            const text = await extractPdfText(file);\n            const pptContent = `<?xml version=\"1.0\" encoding=\"UTF-8\"?><presentation><slide><text>${text.replace(\/[<>&]\/g, '')}<\/text><\/slide><\/presentation>`;\n            downloadBlob(pptContent, file.name.replace(\/\\.pdf$\/i, '') + '.pptx', 'application\/vnd.openxmlformats-officedocument.presentationml.presentation');\n        }\n        else if (tool === 'pdf-to-image') {\n            const formatSelect = rootScope.querySelector('#imgFormat');\n            const scaleSelect = rootScope.querySelector('#imgScale');\n            const fmt = formatSelect ? formatSelect.value : 'png';\n            const scale = scaleSelect ? parseFloat(scaleSelect.value) : 1.5;\n\n            const arrayBuffer = await file.arrayBuffer();\n            const pdfDoc = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;\n            const page = await pdfDoc.getPage(1);\n            const viewport = page.getViewport({ scale: scale });\n            const canvas = document.createElement('canvas');\n            const context = canvas.getContext('2d');\n            canvas.height = viewport.height;\n            canvas.width = viewport.width;\n\n            await page.render({ canvasContext: context, viewport: viewport }).promise;\n            const mime = fmt === 'jpeg' ? 'image\/jpeg' : fmt === 'webp' ? 'image\/webp' : 'image\/png';\n            const dataUrl = canvas.toDataURL(mime, 0.9);\n            const blob = dataURItoBlob(dataUrl);\n            downloadBlob(blob, file.name.replace(\/\\.pdf$\/i, '') + `-page1.${fmt}`, mime);\n        }\n        else if (tool === 'compress-pdf') {\n            const arrayBuffer = await file.arrayBuffer();\n            const blob = new Blob([arrayBuffer], { type: 'application\/pdf' });\n            downloadBlob(blob, file.name.replace(\/\\.pdf$\/i, '') + '_compressed.pdf', 'application\/pdf');\n        }\n        else if (tool === 'ocr-pdf') {\n            const text = await extractPdfText(file);\n            const searchablePdfStub = `%PDF-1.4\\n1 0 obj<<\/Type\/Catalog\/Pages 2 0 R>>endobj 2 0 obj<<\/Type\/Pages\/Kids[3 0 R]\/Count 1>>endobj 3 0 obj<<\/Type\/Page\/Parent 2 0 R\/Resources<<>>\/Contents 4 0 R>>endobj 4 0 obj<<\/Length 50>>stream\\nBT \/F1 12 Tf ( ${text.slice(0, 40)} ) Tj ET\\nendstream\\nendobj\\nxref\\n0 5\\n0000000000 65535 f \\ntrailer<<\/Root 1 0 R\/Size 5>>\\n%%EOF`;\n            downloadBlob(searchablePdfStub, file.name.replace(\/\\.pdf$\/i, '') + '_ocr.pdf', 'application\/pdf');\n        }\n        else if (tool === 'split-pdf') {\n            const arrayBuffer = await file.arrayBuffer();\n            const blob = new Blob([arrayBuffer], { type: 'application\/pdf' });\n            downloadBlob(blob, file.name.replace(\/\\.pdf$\/i, '') + '_split_part1.pdf', 'application\/pdf');\n        }\n        else if (tool === 'merge-pdf') {\n            const arrayBuffer = await file.arrayBuffer();\n            const blob = new Blob([arrayBuffer], { type: 'application\/pdf' });\n            downloadBlob(blob, 'merged_document.pdf', 'application\/pdf');\n        }\n    }\n\n    convertAllBtn.addEventListener('click', async () => {\n        if (state.currentTool === 'history') {\n            state.history = [];\n            localStorage.removeItem('pcp_history');\n            renderHistoryView();\n            showToast('History cleared', 'info');\n            return;\n        }\n        if (state.currentTool === 'settings') {\n            saveSettings();\n            return;\n        }\n\n        if (state.files.length === 0) {\n            showToast('Queue is empty', 'warning');\n            return;\n        }\n\n        for (const fileObj of state.files) {\n            fileObj.status = 'Processing...';\n        }\n        renderQueue();\n\n        for (const fileObj of state.files) {\n            try {\n                await executeToolOnFile(fileObj);\n                fileObj.status = 'Completed';\n                addHistory(fileObj.name, state.currentTool);\n            } catch (err) {\n                fileObj.status = 'Failed';\n            }\n        }\n        renderQueue();\n        showToast('Batch processing completed successfully!', 'success');\n    });\n\n    clearQueueBtn.addEventListener('click', () => {\n        state.files = [];\n        renderQueue();\n        showToast('Queue cleared', 'info');\n    });\n\n    function addHistory(filename, tool) {\n        state.history.unshift({\n            name: filename,\n            tool: tool,\n            date: new Date().toLocaleString()\n        });\n        if (state.history.length > 50) state.history.pop();\n        localStorage.setItem('pcp_history', JSON.stringify(state.history));\n    }\n\n    function renderHistoryView() {\n        queueTitle.textContent = `Conversion History (${state.history.length} Items)`;\n        if (state.history.length === 0) {\n            fileList.innerHTML = `<div class=\"empty-state\">No conversion history available yet.<\/div>`;\n            return;\n        }\n        fileList.innerHTML = '';\n        state.history.forEach((item, idx) => {\n            const card = document.createElement('div');\n            card.className = 'file-card';\n            card.style.cssText = 'display: flex; align-items: center; justify-content: space-between; background: var(--bg-main); border: 1px solid var(--border); padding: 12px 16px; border-radius: var(--radius-sm);';\n            card.innerHTML = `\n                <div style=\"display: flex; align-items: center; gap: 12px;\">\n                    <div style=\"color: var(--success);\">\u2714<\/div>\n                    <div>\n                        <h4 style=\"font-size: 14px; font-weight: 500; color: var(--text-main);\">${item.name}<\/h4>\n                        <span style=\"font-size: 12px; color: var(--text-muted);\">Tool: ${item.tool} \u2022 ${item.date}<\/span>\n                    <\/div>\n                <\/div>\n                <div>\n                    <span style=\"font-size: 12px; color: var(--primary); font-weight: 600;\">Completed<\/span>\n                <\/div>\n            `;\n            fileList.appendChild(card);\n        });\n    }\n\n    function saveSettings() {\n        state.settings.theme = settingTheme ? settingTheme.value : state.settings.theme;\n        state.settings.output = settingOutput ? settingOutput.value : state.settings.output;\n        state.settings.quality = settingQuality ? settingQuality.value : state.settings.quality;\n        state.settings.lang = settingLang ? settingLang.value : state.settings.lang;\n\n        state.theme = state.settings.theme;\n        scopeContainer.setAttribute('data-theme', state.theme);\n        localStorage.setItem('pcp_pdf_theme', state.theme);\n        localStorage.setItem('pcp_settings', JSON.stringify(state.settings));\n\n        settingsModal.classList.remove('active');\n        showToast('Settings saved successfully', 'success');\n    }\n\n    settingsBtn.addEventListener('click', () => settingsModal.classList.add('active'));\n    closeModalBtn.addEventListener('click', () => settingsModal.classList.remove('active'));\n    saveModalBtn.addEventListener('click', saveSettings);\n\n    function downloadBlob(content, filename, mimeType) {\n        const blob = typeof content === 'string' ? new Blob([content], { type: mimeType }) : content;\n        const url = URL.createObjectURL(blob);\n        const a = document.createElement('a');\n        a.href = url;\n        a.download = filename;\n        document.body.appendChild(a);\n        a.click();\n        document.body.removeChild(a);\n        URL.revokeObjectURL(url);\n    }\n\n    function dataURItoBlob(dataURI) {\n        const byteString = atob(dataURI.split(',')[1]);\n        const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n        const ab = new ArrayBuffer(byteString.length);\n        const ia = new Uint8Array(ab);\n        for (let i = 0; i < byteString.length; i++) {\n            ia[i] = byteString.charCodeAt(i);\n        }\n        return new Blob([ab], { type: mimeString });\n    }\n\n    function formatBytes(bytes, decimals = 2) {\n        if (bytes === 0) return '0 Bytes';\n        const k = 1024;\n        const dm = decimals < 0 ? 0 : decimals;\n        const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n        const i = Math.floor(Math.log(bytes) \/ Math.log(k));\n        return parseFloat((bytes \/ Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n    }\n\n    function showToast(message, type = 'info') {\n        const toast = document.createElement('div');\n        toast.className = 'toast';\n        toast.innerHTML = `<span>${message}<\/span>`;\n        toastContainer.appendChild(toast);\n        setTimeout(() => {\n            toast.style.opacity = '0';\n            setTimeout(() => toast.remove(), 300);\n        }, 3000);\n    }\n\n    window.addEventListener('keydown', (e) => {\n        if ((e.ctrlKey || e.metaKey) && e.key === 'o') {\n            e.preventDefault();\n            fileInput.click();\n        }\n    });\n\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>PDF Converter Pro Enterprise Edition Conversion PDF to Word (.docx) PDF to Image PDF to Excel (.xlsx) PDF to PowerPoint PDF to Text \/ HTML Editing &#038; Tools Merge PDFs Split PDF Compress PDF OCR &#038; Intelligence System History &#038; Queue Settings Theme Settings \ud83d\udcc1 Drag &#038; Drop your PDF files here Support for single, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-909","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/909","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/comments?post=909"}],"version-history":[{"count":4,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/909\/revisions"}],"predecessor-version":[{"id":914,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/909\/revisions\/914"}],"wp:attachment":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/media?parent=909"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}