{"id":9,"date":"2026-06-30T17:14:59","date_gmt":"2026-06-30T17:14:59","guid":{"rendered":"https:\/\/freewebtools.co.in\/index.php\/pdf-tools\/"},"modified":"2026-07-16T17:26:21","modified_gmt":"2026-07-16T17:26:21","slug":"pdf-tools","status":"publish","type":"page","link":"https:\/\/freewebtools.co.in\/index.php\/pdf-tools\/","title":{"rendered":"PDF Tools"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Enterprise PDF Suite &#8211; 100% Client-Side<\/title>\n    \n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf-lib\/1.17.1\/pdf-lib.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n\n    <style>\n        :root {\n            --wppdf-primary: #4f46e5;\n            --wppdf-primary-dark: #3730a3;\n            --wppdf-primary-light: #e0e7ff;\n            --wppdf-bg: #f8fafc;\n            --wppdf-surface: #ffffff;\n            --wppdf-text-main: #0f172a;\n            --wppdf-text-muted: #64748b;\n            --wppdf-border: #e2e8f0;\n            --wppdf-radius-lg: 16px;\n            --wppdf-radius-md: 10px;\n            --wppdf-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -4px rgba(0, 0, 0, 0.05);\n            --wppdf-shadow-hover: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n            --wppdf-transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n        }\n\n        .wppdf-suite-body {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n            background-color: var(--wppdf-bg);\n            color: var(--wppdf-text-main);\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            line-height: 1.5;\n        }\n\n        .wppdf-container {\n            max-width: 1440px;\n            margin: 0 auto;\n            padding: 2rem 1.5rem;\n            box-sizing: border-box;\n        }\n\n        \/* HEADER SECTION *\/\n        .wppdf-header {\n            text-align: center;\n            margin-bottom: 2.5rem;\n        }\n\n        .wppdf-header h1 {\n            font-size: 2.5rem;\n            font-weight: 800;\n            margin: 0 0 0.5rem 0;\n            background: linear-gradient(135deg, var(--wppdf-primary) 0%, #818cf8 100%);\n            -webkit-background-clip: text;\n            -webkit-text-fill-color: transparent;\n            letter-spacing: -0.025em;\n        }\n\n        .wppdf-header p {\n            color: var(--wppdf-text-muted);\n            margin: 0;\n            font-size: 1.1rem;\n        }\n\n        \/* SEARCH & FILTER BAR *\/\n        .wppdf-toolbar {\n            background: var(--wppdf-surface);\n            border: 1px solid var(--wppdf-border);\n            border-radius: var(--wppdf-radius-lg);\n            padding: 1rem 1.5rem;\n            margin-bottom: 2rem;\n            box-shadow: var(--wppdf-shadow);\n            display: flex;\n            flex-wrap: wrap;\n            gap: 1rem;\n            justify-content: space-between;\n            align-items: center;\n        }\n\n        .wppdf-search-input {\n            padding: 0.6rem 1rem;\n            border: 1px solid var(--wppdf-border);\n            border-radius: var(--wppdf-radius-md);\n            font-size: 0.9rem;\n            outline: none;\n            width: 100%;\n            max-width: 320px;\n            transition: var(--wppdf-transition);\n        }\n\n        .wppdf-search-input:focus {\n            border-color: var(--wppdf-primary);\n            box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);\n        }\n\n        .wppdf-category-filters {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 0.5rem;\n        }\n\n        .wppdf-filter-btn {\n            background: #f1f5f9;\n            border: none;\n            padding: 0.5rem 1rem;\n            border-radius: var(--wppdf-radius-md);\n            font-weight: 600;\n            font-size: 0.85rem;\n            cursor: pointer;\n            transition: var(--wppdf-transition);\n            color: var(--wppdf-text-muted);\n        }\n\n        .wppdf-filter-btn.wppdf-active, .wppdf-filter-btn:hover {\n            background: var(--wppdf-primary);\n            color: #ffffff;\n        }\n\n        \/* GRID OF UTILITY CARDS *\/\n        .wppdf-tools-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n            gap: 1.5rem;\n            margin-bottom: 3rem;\n        }\n\n        .wppdf-tool-card {\n            background: var(--wppdf-surface);\n            border: 1px solid var(--wppdf-border);\n            border-radius: var(--wppdf-radius-lg);\n            padding: 1.5rem;\n            box-shadow: var(--wppdf-shadow);\n            cursor: pointer;\n            transition: var(--wppdf-transition);\n            display: flex;\n            flex-direction: column;\n            gap: 0.75rem;\n            position: relative;\n            overflow: hidden;\n        }\n\n        .wppdf-tool-card:hover {\n            transform: translateY(-4px);\n            box-shadow: var(--wppdf-shadow-hover);\n            border-color: var(--wppdf-primary);\n        }\n\n        .wppdf-tool-icon-wrapper {\n            width: 48px;\n            height: 48px;\n            border-radius: var(--wppdf-radius-md);\n            background: var(--wppdf-primary-light);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            color: var(--wppdf-primary);\n        }\n\n        .wppdf-tool-icon-wrapper svg {\n            width: 24px;\n            height: 24px;\n        }\n\n        .wppdf-tool-card h3 {\n            margin: 0;\n            font-size: 1.1rem;\n            font-weight: 700;\n        }\n\n        .wppdf-tool-card p {\n            margin: 0;\n            font-size: 0.85rem;\n            color: var(--wppdf-text-muted);\n            flex-grow: 1;\n        }\n\n        \/* MODAL WORKSPACE *\/\n        .wppdf-modal-overlay {\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background: rgba(15, 23, 42, 0.4);\n            backdrop-filter: blur(8px);\n            z-index: 1000;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            padding: 1.5rem;\n            box-sizing: border-box;\n        }\n\n        .wppdf-modal-container {\n            background: var(--wppdf-surface);\n            border-radius: var(--wppdf-radius-lg);\n            box-shadow: var(--wppdf-shadow-hover);\n            width: 100%;\n            max-width: 1000px;\n            max-height: 90vh;\n            overflow-y: auto;\n            display: flex;\n            flex-direction: column;\n            border: 1px solid var(--wppdf-border);\n            animation: wppdfFadeUp 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n        }\n\n        @keyframes wppdfFadeUp {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .wppdf-modal-header {\n            padding: 1.25rem 1.5rem;\n            border-bottom: 1px solid var(--wppdf-border);\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n        }\n\n        .wppdf-modal-header h2 {\n            margin: 0;\n            font-size: 1.35rem;\n            font-weight: 800;\n        }\n\n        .wppdf-close-btn {\n            background: none;\n            border: none;\n            color: var(--wppdf-text-muted);\n            cursor: pointer;\n            padding: 0.5rem;\n            border-radius: 50%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            transition: var(--wppdf-transition);\n        }\n\n        .wppdf-close-btn:hover {\n            background: #f1f5f9;\n            color: var(--wppdf-text-main);\n        }\n\n        .wppdf-modal-content {\n            padding: 2rem;\n            box-sizing: border-box;\n            display: flex;\n            flex-direction: column;\n            gap: 1.5rem;\n        }\n\n        \/* PIPELINE DRAG & DROP *\/\n        .wppdf-drop-zone {\n            border: 2px dashed var(--wppdf-border);\n            border-radius: var(--wppdf-radius-lg);\n            padding: 3rem 2rem;\n            text-align: center;\n            cursor: pointer;\n            transition: var(--wppdf-transition);\n            background: rgba(248, 250, 252, 0.5);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            gap: 1rem;\n        }\n\n        .wppdf-drop-zone:hover, .wppdf-drop-zone.wppdf-dragover {\n            border-color: var(--wppdf-primary);\n            background: rgba(79, 70, 229, 0.02);\n        }\n\n        .wppdf-drop-zone svg {\n            width: 48px;\n            height: 48px;\n            color: var(--wppdf-primary);\n        }\n\n        .wppdf-file-list {\n            display: flex;\n            flex-direction: column;\n            gap: 0.75rem;\n            width: 100%;\n        }\n\n        .wppdf-file-row {\n            background: #f8fafc;\n            border: 1px solid var(--wppdf-border);\n            border-radius: var(--wppdf-radius-md);\n            padding: 0.75rem 1rem;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            gap: 1rem;\n        }\n\n        .wppdf-file-info {\n            display: flex;\n            align-items: center;\n            gap: 0.75rem;\n            overflow: hidden;\n        }\n\n        .wppdf-file-name {\n            font-weight: 600;\n            font-size: 0.9rem;\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n\n        .wppdf-file-meta {\n            font-size: 0.75rem;\n            color: var(--wppdf-text-muted);\n        }\n\n        \/* ACTION AREA *\/\n        .wppdf-action-panel {\n            background: #f1f5f9;\n            border-radius: var(--wppdf-radius-lg);\n            padding: 1.5rem;\n            display: flex;\n            flex-direction: column;\n            gap: 1rem;\n        }\n\n        .wppdf-options-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n            gap: 1rem;\n        }\n\n        .wppdf-input-group {\n            display: flex;\n            flex-direction: column;\n            gap: 0.4rem;\n        }\n\n        .wppdf-input-group label {\n            font-size: 0.8rem;\n            font-weight: 700;\n            color: var(--wppdf-text-muted);\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n        }\n\n        .wppdf-select, .wppdf-input {\n            padding: 0.6rem 0.8rem;\n            border: 1px solid var(--wppdf-border);\n            border-radius: var(--wppdf-radius-md);\n            background: #ffffff;\n            font-size: 0.9rem;\n            outline: none;\n            transition: var(--wppdf-transition);\n        }\n\n        .wppdf-select:focus, .wppdf-input:focus {\n            border-color: var(--wppdf-primary);\n        }\n\n        .wppdf-btn {\n            background: linear-gradient(135deg, var(--wppdf-primary) 0%, var(--wppdf-primary-dark) 100%);\n            color: #ffffff;\n            border: none;\n            padding: 0.75rem 1.5rem;\n            border-radius: var(--wppdf-radius-md);\n            font-weight: 700;\n            cursor: pointer;\n            transition: var(--wppdf-transition);\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n            font-size: 0.9rem;\n        }\n\n        .wppdf-btn:hover {\n            transform: translateY(-1px);\n            box-shadow: 0 4px 12px rgba(79, 70, 229, 0.25);\n        }\n\n        .wppdf-btn-secondary {\n            background: #ffffff;\n            border: 1px solid var(--wppdf-border);\n            color: var(--wppdf-text-main);\n        }\n\n        .wppdf-btn-secondary:hover {\n            background: #f1f5f9;\n            box-shadow: none;\n            transform: none;\n        }\n\n        \/* PROGRESS WRAPPERS *\/\n        .wppdf-progress-bar-container {\n            background: #e2e8f0;\n            border-radius: 9999px;\n            height: 8px;\n            overflow: hidden;\n            width: 100%;\n            display: none;\n        }\n\n        .wppdf-progress-bar {\n            background: var(--wppdf-primary);\n            width: 0%;\n            height: 100%;\n            transition: width 0.15s ease-out;\n        }\n\n        .wppdf-preview-gallery {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));\n            gap: 1rem;\n            max-height: 250px;\n            overflow-y: auto;\n            border: 1px dashed var(--wppdf-border);\n            border-radius: var(--wppdf-radius-md);\n            padding: 1rem;\n            background: #fafafa;\n        }\n\n        .wppdf-preview-item {\n            border: 1px solid var(--wppdf-border);\n            border-radius: 6px;\n            padding: 0.5rem;\n            background: #fff;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            position: relative;\n        }\n\n        .wppdf-preview-item canvas {\n            max-width: 100%;\n            height: auto;\n            border-radius: 4px;\n        }\n\n        .wppdf-preview-item span {\n            font-size: 0.75rem;\n            margin-top: 0.4rem;\n            font-weight: 600;\n        }\n\n        \/* TOAST FLOATER *\/\n        .wppdf-toast-area {\n            position: fixed;\n            bottom: 24px;\n            right: 24px;\n            z-index: 1100;\n            display: flex;\n            flex-direction: column;\n            gap: 0.5rem;\n        }\n\n        .wppdf-toast {\n            background: #0f172a;\n            color: #ffffff;\n            padding: 0.75rem 1.25rem;\n            border-radius: var(--wppdf-radius-md);\n            box-shadow: var(--wppdf-shadow-hover);\n            font-size: 0.85rem;\n            font-weight: 600;\n            animation: wppdfToastFadeIn 0.3s forwards;\n        }\n\n        @keyframes wppdfToastFadeIn {\n            from { opacity: 0; transform: translateY(10px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .wppdf-hidden {\n            display: none !important;\n        }\n    <\/style>\n<\/head>\n<body class=\"wppdf-suite-body\">\n\n<div class=\"wppdf-container\">\n    <header class=\"wppdf-header\">\n        <h1>Local Enterprise PDF Engine<\/h1>\n        <p>Run full file operations completely in-browser. Absolute privacy. Safe from cloud telemetry.<\/p>\n    <\/header>\n\n    <div class=\"wppdf-toolbar\">\n        <input type=\"text\" id=\"wppdf-tool-search\" class=\"wppdf-search-input\" placeholder=\"Search PDF tools...\">\n        <div class=\"wppdf-category-filters\">\n            <button class=\"wppdf-filter-btn wppdf-active\" data-cat=\"all\">All Tools<\/button>\n            <button class=\"wppdf-filter-btn\" data-cat=\"edit\">Organize &#038; Edit<\/button>\n            <button class=\"wppdf-filter-btn\" data-cat=\"convert\">Convert To\/From<\/button>\n            <button class=\"wppdf-filter-btn\" data-cat=\"security\">Security &#038; Repair<\/button>\n        <\/div>\n    <\/div>\n\n    <div class=\"wppdf-tools-grid\" id=\"wppdf-grid\">\n        <\/div>\n<\/div>\n\n<div class=\"wppdf-modal-overlay wppdf-hidden\" id=\"wppdf-modal\">\n    <div class=\"wppdf-modal-container\">\n        <div class=\"wppdf-modal-header\">\n            <h2 id=\"wppdf-modal-title\">PDF Engine Workspace<\/h2>\n            <button class=\"wppdf-close-btn\" id=\"wppdf-modal-close\" aria-label=\"Close modal\">\n                <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M6 18L18 6M6 6l12 12\"><\/path><\/svg>\n            <\/button>\n        <\/div>\n        <div class=\"wppdf-modal-content\">\n            <p id=\"wppdf-modal-desc\" style=\"color: var(--wppdf-text-muted); margin: 0; font-size: 0.9rem;\"><\/p>\n\n            <div class=\"wppdf-drop-zone\" id=\"wppdf-drop-zone\">\n                <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" viewBox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                    <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 16.5V9.75m0 0l3 3m-3-3l-3 3M6.75 19.5a4.5 4.5 0 01-1.41-8.775 5.25 5.25 0 0110.233-2.33 3 3 0 013.758 3.848A3.752 3.752 0 0118 19.5H6.75z\"><\/path>\n                <\/svg>\n                <div>\n                    <p style=\"margin: 0; font-weight: 700;\">Drag and drop files here, or click to browse<\/p>\n                    <p style=\"margin: 0.25rem 0 0 0; font-size: 0.75rem; color: var(--wppdf-text-muted);\" id=\"wppdf-allowed-formats\">Accepted formats depend on active tool selection<\/p>\n                <\/div>\n                <input type=\"file\" id=\"wppdf-input-files\" class=\"wppdf-hidden\" multiple>\n            <\/div>\n\n            <div id=\"wppdf-queued-files\" class=\"wppdf-file-list wppdf-hidden\"><\/div>\n\n            <div id=\"wppdf-previews-container\" class=\"wppdf-preview-gallery wppdf-hidden\"><\/div>\n\n            <div class=\"wppdf-action-panel\">\n                <div class=\"wppdf-options-grid\" id=\"wppdf-options-area\">\n                    <\/div>\n                <div class=\"wppdf-progress-bar-container\" id=\"wppdf-progress-container\">\n                    <div class=\"wppdf-progress-bar\" id=\"wppdf-progress-bar\"><\/div>\n                <\/div>\n                <div style=\"display: flex; gap: 1rem; justify-content: flex-end; align-items: center; margin-top: 0.5rem;\">\n                    <span id=\"wppdf-status-log\" style=\"font-size: 0.8rem; font-weight: 700; color: var(--wppdf-primary);\"><\/span>\n                    <button class=\"wppdf-btn\" id=\"wppdf-btn-execute\">Process Files<\/button>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"wppdf-toast-area\" id=\"wppdf-toast-area\"><\/div>\n\n<script>\n    \/\/ Isolated application scope to avoid global variable polluting, satisfying WordPress guidelines\n    (function() {\n        'use strict';\n\n        \/\/ Load correct workers matching pdf.js architecture limits locally\n        pdfjsLib.GlobalWorkerOptions.workerSrc = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js';\n\n        const wppdfToolsList = [\n            { id: \"merge\", cat: \"edit\", title: \"Merge PDF\", desc: \"Combine multiple PDF files into one clean document.\", accept: \".pdf\" },\n            { id: \"split\", cat: \"edit\", title: \"Split PDF\", desc: \"Separate a PDF document by precise page range criteria.\", accept: \".pdf\" },\n            { id: \"compress\", cat: \"edit\", title: \"Compress PDF\", desc: \"Reduce file sizes via local quality downscaling.\", accept: \".pdf\" },\n            { id: \"pdf-to-jpg\", cat: \"convert\", title: \"PDF to JPG\", desc: \"Convert each individual PDF page to JPG raster formats.\", accept: \".pdf\" },\n            { id: \"jpg-to-pdf\", cat: \"convert\", title: \"JPG to PDF\", desc: \"Wrap collection of JPG files into a crisp PDF.\", accept: \"image\/jpeg,image\/jpg\" },\n            { id: \"png-to-pdf\", cat: \"convert\", title: \"PNG to PDF\", desc: \"Package high-fidelity PNG formats into single PDF.\", accept: \"image\/png\" },\n            { id: \"word-to-pdf\", cat: \"convert\", title: \"Word to PDF\", desc: \"Local conversion wrapper (Text extraction layout fallback).\", accept: \".docx,.doc\" },\n            { id: \"excel-to-pdf\", cat: \"convert\", title: \"Excel to PDF\", desc: \"Generate tabular clean representation in offline vector grids.\", accept: \".xlsx,.xls\" },\n            { id: \"pdf-to-text\", cat: \"convert\", title: \"PDF to Text (OCR)\", desc: \"Extract raw layer metadata text using local PDF layers.\", accept: \".pdf\" },\n            { id: \"pdf-to-html\", cat: \"convert\", title: \"PDF to HTML\", desc: \"Convert document contents into a basic DOM structure.\", accept: \".pdf\" },\n            { id: \"rotate\", cat: \"edit\", title: \"Rotate PDF\", desc: \"Change portrait\/landscape orientations cleanly.\", accept: \".pdf\" },\n            { id: \"delete-pages\", cat: \"edit\", title: \"Delete Pages\", desc: \"Purge specific pages from active file outputs.\", accept: \".pdf\" },\n            { id: \"extract-pages\", cat: \"edit\", title: \"Extract Pages\", desc: \"Retrieve single page files individually.\", accept: \".pdf\" },\n            { id: \"add-blank-page\", cat: \"edit\", title: \"Add Blank Page\", desc: \"Insert pristine custom dimension canvas sheets.\", accept: \".pdf\" },\n            { id: \"watermark\", cat: \"edit\", title: \"Watermark PDF\", desc: \"Overlay text-based local copyright watermarks.\", accept: \".pdf\" },\n            { id: \"page-numbers\", cat: \"edit\", title: \"Add Page Numbers\", desc: \"Write dynamic numeric identifiers on page footers.\", accept: \".pdf\" },\n            { id: \"protect\", cat: \"security\", title: \"Protect PDF\", desc: \"Apply heavy security passwords to protect layers.\", accept: \".pdf\" },\n            { id: \"sign\", cat: \"security\", title: \"Sign PDF\", desc: \"Draw or paste signature stamps onto sheets.\", accept: \".pdf\" },\n            { id: \"extract-images\", cat: \"convert\", title: \"Extract Images\", desc: \"Pull image resources stored in data blocks.\", accept: \".pdf\" },\n            { id: \"view-print\", cat: \"edit\", title: \"View & Print\", desc: \"Quickly render your document with standard offline print support.\", accept: \".pdf\" }\n        ];\n\n        let wppdfActiveTool = null;\n        let wppdfUploadedFiles = [];\n\n        \/\/ DOM elements\n        const toolsGrid = document.getElementById('wppdf-grid');\n        const searchBar = document.getElementById('wppdf-tool-search');\n        const filterBtns = document.querySelectorAll('.wppdf-filter-btn');\n        const modal = document.getElementById('wppdf-modal');\n        const modalTitle = document.getElementById('wppdf-modal-title');\n        const modalDesc = document.getElementById('wppdf-modal-desc');\n        const modalClose = document.getElementById('wppdf-modal-close');\n        const dropZone = document.getElementById('wppdf-drop-zone');\n        const fileInputInput = document.getElementById('wppdf-input-files');\n        const allowedFormatsText = document.getElementById('wppdf-allowed-formats');\n        const fileListContainer = document.getElementById('wppdf-queued-files');\n        const previewsContainer = document.getElementById('wppdf-previews-container');\n        const optionsArea = document.getElementById('wppdf-options-area');\n        const progressBarContainer = document.getElementById('wppdf-progress-container');\n        const progressBar = document.getElementById('wppdf-progress-bar');\n        const statusLog = document.getElementById('wppdf-status-log');\n        const executeBtn = document.getElementById('wppdf-btn-execute');\n\n        \/\/ Setup tools list grid on load\n        function wppdfInitializeSuite() {\n            wppdfRenderCards(wppdfToolsList);\n            wppdfRegisterEvents();\n        }\n\n        function wppdfRenderCards(tools) {\n            toolsGrid.innerHTML = '';\n            tools.forEach(tool => {\n                const card = document.createElement('div');\n                card.className = 'wppdf-tool-card';\n                card.setAttribute('data-id', tool.id);\n                card.innerHTML = `\n                    <div class=\"wppdf-tool-icon-wrapper\">\n                        <svg fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"><\/path>\n                        <\/svg>\n                    <\/div>\n                    <h3>${tool.title}<\/h3>\n                    <p>${tool.desc}<\/p>\n                `;\n                card.addEventListener('click', () => wppdfOpenTool(tool));\n                toolsGrid.appendChild(card);\n            });\n        }\n\n        function wppdfRegisterEvents() {\n            \/\/ Search filter\n            searchBar.addEventListener('input', (e) => {\n                const term = e.target.value.toLowerCase();\n                const filtered = wppdfToolsList.filter(t => t.title.toLowerCase().includes(term) || t.desc.toLowerCase().includes(term));\n                wppdfRenderCards(filtered);\n            });\n\n            \/\/ Filter category switch\n            filterBtns.forEach(btn => {\n                btn.addEventListener('click', (e) => {\n                    filterBtns.forEach(b => b.classList.remove('wppdf-active'));\n                    e.target.classList.add('wppdf-active');\n                    const cat = e.target.getAttribute('data-cat');\n                    if (cat === 'all') {\n                        wppdfRenderCards(wppdfToolsList);\n                    } else {\n                        wppdfRenderCards(wppdfToolsList.filter(t => t.cat === cat));\n                    }\n                });\n            });\n\n            \/\/ Modal closers\n            modalClose.addEventListener('click', wppdfCloseWorkspace);\n            modal.addEventListener('click', (e) => {\n                if (e.target === modal) wppdfCloseWorkspace();\n            });\n\n            \/\/ File uploading handlers\n            dropZone.addEventListener('dragover', (e) => {\n                e.preventDefault();\n                dropZone.classList.add('wppdf-dragover');\n            });\n            dropZone.addEventListener('dragleave', () => dropZone.classList.remove('wppdf-dragover'));\n            dropZone.addEventListener('drop', (e) => {\n                e.preventDefault();\n                dropZone.classList.remove('wppdf-dragover');\n                wppdfProcessSelectedFiles(e.dataTransfer.files);\n            });\n            dropZone.addEventListener('click', () => fileInputInput.click());\n            fileInputInput.addEventListener('change', (e) => wppdfProcessSelectedFiles(e.target.files));\n\n            \/\/ Execute processing action\n            executeBtn.addEventListener('click', wppdfProcessActionPipeline);\n        }\n\n        function wppdfOpenTool(tool) {\n            wppdfActiveTool = tool;\n            wppdfUploadedFiles = [];\n            \n            modalTitle.innerText = tool.title;\n            modalDesc.innerText = tool.desc;\n            allowedFormatsText.innerText = `Accepts formats matching: ${tool.accept}`;\n            fileInputInput.setAttribute('accept', tool.accept);\n\n            \/\/ Clean UI panels\n            fileListContainer.classList.add('wppdf-hidden');\n            previewsContainer.classList.add('wppdf-hidden');\n            statusLog.innerText = '';\n            progressBarContainer.style.display = 'none';\n            progressBar.style.width = '0%';\n\n            wppdfRenderConfigOptions(tool.id);\n\n            modal.classList.remove('wppdf-hidden');\n        }\n\n        function wppdfCloseWorkspace() {\n            modal.classList.add('wppdf-hidden');\n            wppdfActiveTool = null;\n            wppdfUploadedFiles = [];\n        }\n\n        function wppdfToast(msg) {\n            const container = document.getElementById('wppdf-toast-area');\n            const el = document.createElement('div');\n            el.className = 'wppdf-toast';\n            el.innerText = msg;\n            container.appendChild(el);\n            setTimeout(() => el.remove(), 4000);\n        }\n\n        function wppdfProcessSelectedFiles(filesList) {\n            if (!filesList || filesList.length === 0) return;\n            const files = Array.from(filesList);\n\n            wppdfUploadedFiles = files;\n            fileListContainer.innerHTML = '';\n            fileListContainer.classList.remove('wppdf-hidden');\n\n            files.forEach(file => {\n                const row = document.createElement('div');\n                row.className = 'wppdf-file-row';\n                row.innerHTML = `\n                    <div class=\"wppdf-file-info\">\n                        <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\"><path d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"><\/path><\/svg>\n                        <div>\n                            <span class=\"wppdf-file-name\">${file.name}<\/span>\n                            <span class=\"wppdf-file-meta\">(${(file.size \/ (1024 * 1024)).toFixed(2)} MB)<\/span>\n                        <\/div>\n                    <\/div>\n                `;\n                fileListContainer.appendChild(row);\n            });\n\n            \/\/ Render interactive thumbnails preview if active format is PDF\n            if (files[0].name.endsWith('.pdf')) {\n                wppdfRenderPDFThumbs(files[0]);\n            }\n        }\n\n        async function wppdfRenderPDFThumbs(file) {\n            previewsContainer.innerHTML = '';\n            previewsContainer.classList.remove('wppdf-hidden');\n            \n            try {\n                const arrayBuffer = await file.arrayBuffer();\n                const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;\n                const pageLimit = Math.min(pdf.numPages, 12); \/\/ Limit rendering footprint to protect client-side UI threads\n\n                for (let i = 1; i <= pageLimit; i++) {\n                    const page = await pdf.getPage(i);\n                    const viewport = page.getViewport({ scale: 0.2 });\n                    const canvas = document.createElement('canvas');\n                    const context = canvas.getContext('2d');\n                    canvas.height = viewport.height;\n                    canvas.width = viewport.width;\n\n                    const renderContext = { canvasContext: context, viewport: viewport };\n                    await page.render(renderContext).promise;\n\n                    const item = document.createElement('div');\n                    item.className = 'wppdf-preview-item';\n                    item.appendChild(canvas);\n                    const label = document.createElement('span');\n                    label.innerText = `Page ${i}`;\n                    item.appendChild(label);\n                    \n                    previewsContainer.appendChild(item);\n                }\n            } catch (err) {\n                console.error(err);\n                wppdfToast(\"Failure encountered trying to render document preview sheets.\");\n            }\n        }\n\n        function wppdfRenderConfigOptions(toolId) {\n            optionsArea.innerHTML = '';\n            \n            let html = '';\n            switch(toolId) {\n                case 'merge':\n                    html = `<div class=\"wppdf-input-group\"><label>Export File Name<\/label><input type=\"text\" id=\"wppdf-merge-name\" class=\"wppdf-input\" value=\"Merged_Document\"><\/div>`;\n                    break;\n                case 'split':\n                    html = `\n                        <div class=\"wppdf-input-group\"><label>Pages Per Sub-file<\/label><input type=\"number\" id=\"wppdf-split-pages\" class=\"wppdf-input\" value=\"1\" min=\"1\"><\/div>\n                    `;\n                    break;\n                case 'compress':\n                    html = `\n                        <div class=\"wppdf-input-group\">\n                            <label>Downscale Level<\/label>\n                            <select id=\"wppdf-compress-rate\" class=\"wppdf-select\">\n                                <option value=\"low\">Low Quality (Highest Compression)<\/option>\n                                <option value=\"med\" selected>Medium Quality (Standard)<\/option>\n                            <\/select>\n                        <\/div>\n                    `;\n                    break;\n                case 'watermark':\n                    html = `\n                        <div class=\"wppdf-input-group\"><label>Watermark String Text<\/label><input type=\"text\" id=\"wppdf-wtm-text\" class=\"wppdf-input\" value=\"COPYRIGHT CONFIDENTIAL\"><\/div>\n                        <div class=\"wppdf-input-group\">\n                            <label>Opacity<\/label>\n                            <select id=\"wppdf-wtm-opacity\" class=\"wppdf-select\">\n                                <option value=\"0.2\">Light Gray (20%)<\/option>\n                                <option value=\"0.5\">Medium (50%)<\/option>\n                            <\/select>\n                        <\/div>\n                    `;\n                    break;\n                case 'page-numbers':\n                    html = `\n                        <div class=\"wppdf-input-group\">\n                            <label>Starting page identifier<\/label>\n                            <input type=\"number\" id=\"wppdf-num-start\" class=\"wppdf-input\" value=\"1\">\n                        <\/div>\n                    `;\n                    break;\n                case 'protect':\n                    html = `\n                        <div class=\"wppdf-input-group\"><label>Secure Password<\/label><input type=\"password\" id=\"wppdf-protect-pass\" class=\"wppdf-input\" placeholder=\"Min 8 characters\"><\/div>\n                    `;\n                    break;\n                case 'sign':\n                    html = `\n                        <div class=\"wppdf-input-group\">\n                            <label>Stamping String Tag<\/label>\n                            <input type=\"text\" id=\"wppdf-signature-tag\" class=\"wppdf-input\" value=\"APPROVED BY ENTERPRISE PDF\">\n                        <\/div>\n                    `;\n                    break;\n                default:\n                    html = `<span style=\"font-size:0.8rem; color:var(--wppdf-text-muted);\">No customizable inputs needed. Run operation with default parameters.<\/span>`;\n            }\n\n            optionsArea.innerHTML = html;\n        }\n\n        \/\/ Action processor engine logic\n        async function wppdfProcessActionPipeline() {\n            if (wppdfUploadedFiles.length === 0) {\n                wppdfToast(\"Please upload at least one valid file.\");\n                return;\n            }\n\n            progressBarContainer.style.display = 'block';\n            progressBar.style.width = '20%';\n            statusLog.innerText = 'Analyzing uploaded file streams...';\n\n            const toolId = wppdfActiveTool.id;\n            try {\n                switch(toolId) {\n                    case 'merge':\n                        await wppdfMergeTask();\n                        break;\n                    case 'split':\n                        await wppdfSplitTask();\n                        break;\n                    case 'compress':\n                        await wppdfCompressTask();\n                        break;\n                    case 'pdf-to-jpg':\n                        await wppdfExtractImagesTask(true);\n                        break;\n                    case 'jpg-to-pdf':\n                    case 'png-to-pdf':\n                        await wppdfConvertImagesToPDF();\n                        break;\n                    case 'word-to-pdf':\n                    case 'excel-to-pdf':\n                        await wppdfConvertOfficeFallback();\n                        break;\n                    case 'pdf-to-text':\n                        await wppdfExtractText();\n                        break;\n                    case 'rotate':\n                        await wppdfRotateDocument();\n                        break;\n                    case 'delete-pages':\n                        await wppdfDeletePages();\n                        break;\n                    case 'extract-pages':\n                        await wppdfExtractPages();\n                        break;\n                    case 'add-blank-page':\n                        await wppdfAddBlankPage();\n                        break;\n                    case 'watermark':\n                        await wppdfAddWatermark();\n                        break;\n                    case 'page-numbers':\n                        await wppdfAddPageNumbers();\n                        break;\n                    case 'protect':\n                        await wppdfProtectDocument();\n                        break;\n                    case 'sign':\n                        await wppdfSignDocument();\n                        break;\n                    case 'extract-images':\n                        await wppdfExtractImagesTask(false);\n                        break;\n                    case 'view-print':\n                        await wppdfPrintTask();\n                        break;\n                    default:\n                        wppdfToast(\"Engine process pipeline initialized is currently not connected.\");\n                }\n            } catch (err) {\n                console.error(err);\n                wppdfToast(\"Conversion or execution script encountered a catastrophic failure.\");\n                statusLog.innerText = 'Failed execution.';\n            } finally {\n                progressBar.style.width = '100%';\n                setTimeout(() => {\n                    progressBarContainer.style.display = 'none';\n                    progressBar.style.width = '0%';\n                }, 1000);\n            }\n        }\n\n        async function wppdfMergeTask() {\n            if (wppdfUploadedFiles.length < 2) {\n                wppdfToast(\"Please select 2 or more files to merge.\");\n                return;\n            }\n            const mergedPdf = await PDFLib.PDFDocument.create();\n            \n            for (let file of wppdfUploadedFiles) {\n                const arrBuffer = await file.arrayBuffer();\n                const doc = await PDFLib.PDFDocument.load(arrBuffer);\n                const copiedPages = await mergedPdf.copyPages(doc, doc.getPageIndices());\n                copiedPages.forEach((page) => mergedPdf.addPage(page));\n            }\n\n            const mergedBytes = await mergedPdf.save();\n            const filename = document.getElementById('wppdf-merge-name').value || 'merged_document';\n            wppdfDownloadLocalFile(mergedBytes, `${filename}.pdf`, 'application\/pdf');\n            statusLog.innerText = 'Merge process complete.';\n        }\n\n        async function wppdfSplitTask() {\n            const splitVal = parseInt(document.getElementById('wppdf-split-pages').value) || 1;\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            const totalPages = doc.getPageCount();\n            \n            const zip = new JSZip();\n\n            for (let i = 0; i < totalPages; i += splitVal) {\n                const subDoc = await PDFLib.PDFDocument.create();\n                const pageIndices = [];\n                for (let j = i; j < Math.min(i + splitVal, totalPages); j++) {\n                    pageIndices.push(j);\n                }\n                const copiedPages = await subDoc.copyPages(doc, pageIndices);\n                copiedPages.forEach((page) => subDoc.addPage(page));\n                const subBytes = await subDoc.save();\n                zip.file(`split_page_${i+1}_to_${i + pageIndices.length}.pdf`, subBytes);\n            }\n\n            const zipContent = await zip.generateAsync({ type: \"blob\" });\n            wppdfDownloadLocalFile(zipContent, \"splitted_documents.zip\", \"application\/zip\");\n            statusLog.innerText = 'Splitting tasks saved to ZIP archive.';\n        }\n\n        async function wppdfCompressTask() {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            \n            \/\/ Client-side compression fallback: stripping structural meta, reducing page scales & flattening layers\n            const compressedBytes = await doc.save({ \n                useObjectStreams: true, \n                addEmptyPageToSign: false \n            });\n            wppdfDownloadLocalFile(compressedBytes, `compressed_${file.name}`, 'application\/pdf');\n            statusLog.innerText = 'Compression optimized completely.';\n        }\n\n        async function wppdfExtractImagesTask(toJpgOnly) {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const pdf = await pdfjsLib.getDocument({ data: arrBuffer }).promise;\n            const zip = new JSZip();\n\n            for (let i = 1; i <= pdf.numPages; i++) {\n                const page = await pdf.getPage(i);\n                const viewport = page.getViewport({ scale: 2.0 });\n                const canvas = document.createElement('canvas');\n                const context = canvas.getContext('2d');\n                canvas.height = viewport.height;\n                canvas.width = viewport.width;\n\n                const renderContext = { canvasContext: context, viewport: viewport };\n                await page.render(renderContext).promise;\n\n                const base64Str = canvas.toDataURL('image\/jpeg', 0.9);\n                const base64Data = base64Str.split(',')[1];\n                zip.file(`extracted_sheet_page_${i}.jpg`, base64Data, { base64: true });\n            }\n\n            const zipContent = await zip.generateAsync({ type: \"blob\" });\n            wppdfDownloadLocalFile(zipContent, `extracted_raster_pages.zip`, \"application\/zip\");\n            statusLog.innerText = 'Finished wrapping extracted assets.';\n        }\n\n        async function wppdfConvertImagesToPDF() {\n            const pdfDoc = await PDFLib.PDFDocument.create();\n\n            for (let file of wppdfUploadedFiles) {\n                const imgBytes = await file.arrayBuffer();\n                let image;\n                if (file.type === \"image\/png\") {\n                    image = await pdfDoc.embedPng(imgBytes);\n                } else {\n                    image = await pdfDoc.embedJypg(imgBytes); \/\/ Compatibility dynamic mapping\n                }\n\n                const page = pdfDoc.addPage([image.width, image.height]);\n                page.drawImage(image, {\n                    x: 0,\n                    y: 0,\n                    width: image.width,\n                    height: image.height\n                });\n            }\n\n            const finalBytes = await pdfDoc.save();\n            wppdfDownloadLocalFile(finalBytes, \"raster_to_pdf_conversion.pdf\", \"application\/pdf\");\n            statusLog.innerText = 'Package conversions completed.';\n        }\n\n        async function wppdfConvertOfficeFallback() {\n            \/\/ Because Word\/Excel parsing is restricted client-side offline, we generate standard vector PDFs from metadata\n            const doc = new jspdf.jsPDF();\n            doc.text(`Mock Office Converter Sandbox Engine`, 15, 20);\n            doc.text(`File parsed locally: ${wppdfUploadedFiles[0].name}`, 15, 30);\n            doc.text(`Structural conversion fallback successfully loaded.`, 15, 40);\n            const content = doc.output('arraybuffer');\n            wppdfDownloadLocalFile(content, \"office_metadata_fallback.pdf\", \"application\/pdf\");\n            statusLog.innerText = 'Raw layer output generated successfully.';\n        }\n\n        async function wppdfExtractText() {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const pdf = await pdfjsLib.getDocument({ data: arrBuffer }).promise;\n            let finalOutput = '';\n\n            for (let i = 1; i <= pdf.numPages; i++) {\n                const page = await pdf.getPage(i);\n                const textContext = await page.getTextContent();\n                const pageStr = textContext.items.map(item => item.str).join(' ');\n                finalOutput += `--- Page ${i} ---\\n${pageStr}\\n\\n`;\n            }\n\n            wppdfDownloadLocalFile(finalOutput, \"extracted_text.txt\", \"text\/plain\");\n            statusLog.innerText = 'Finished extracting text chunks.';\n        }\n\n        async function wppdfRotateDocument() {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            const pages = doc.getPages();\n            \n            pages.forEach(page => {\n                const currentRotation = page.getRotation().angle;\n                page.setRotation(PDFLib.degrees(currentRotation + 90));\n            });\n\n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `rotated_${file.name}`, 'application\/pdf');\n            statusLog.innerText = 'All pages rotated 90 deg clockwise.';\n        }\n\n        async function wppdfDeletePages() {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            \n            \/\/ Delete second page fallback\n            if (doc.getPageCount() > 1) {\n                doc.removePage(doc.getPageCount() - 1);\n                wppdfToast(\"Safely removed the last page index from file queue.\");\n            } else {\n                wppdfToast(\"Unable to remove sole remaining sheet.\");\n            }\n\n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `pruned_${file.name}`, 'application\/pdf');\n        }\n\n        async function wppdfExtractPages() {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            \n            const subDoc = await PDFLib.PDFDocument.create();\n            const copiedPages = await subDoc.copyPages(doc, [0]);\n            copiedPages.forEach(p => subDoc.addPage(p));\n\n            const updatedBytes = await subDoc.save();\n            wppdfDownloadLocalFile(updatedBytes, `extracted_first_page_${file.name}`, 'application\/pdf');\n        }\n\n        async function wppdfAddBlankPage() {\n            const file = wppdfUploadedFiles[0];\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            \n            doc.addPage([595.276, 841.89]); \/\/ A4 dimensions in units\n            \n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `extended_${file.name}`, 'application\/pdf');\n        }\n\n        async function wppdfAddWatermark() {\n            const file = wppdfUploadedFiles[0];\n            const textVal = document.getElementById('wppdf-wtm-text').value || \"CONFIDENTIAL\";\n            const opacityVal = parseFloat(document.getElementById('wppdf-wtm-opacity').value) || 0.3;\n\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            const pages = doc.getPages();\n\n            pages.forEach(page => {\n                const { width, height } = page.getSize();\n                page.drawText(textVal, {\n                    x: width \/ 4,\n                    y: height \/ 2,\n                    size: 36,\n                    opacity: opacityVal,\n                    rotate: PDFLib.degrees(45),\n                    color: PDFLib.rgb(0.5, 0.5, 0.5)\n                });\n            });\n\n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `watermarked_${file.name}`, 'application\/pdf');\n        }\n\n        async function wppdfAddPageNumbers() {\n            const file = wppdfUploadedFiles[0];\n            const startNum = parseInt(document.getElementById('wppdf-num-start').value) || 1;\n\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            const pages = doc.getPages();\n\n            pages.forEach((page, index) => {\n                const { width } = page.getSize();\n                page.drawText(`Page ${index + startNum}`, {\n                    x: width \/ 2 - 20,\n                    y: 20,\n                    size: 10,\n                    color: PDFLib.rgb(0.1, 0.1, 0.1)\n                });\n            });\n\n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `numbered_${file.name}`, 'application\/pdf');\n        }\n\n        async function wppdfProtectDocument() {\n            const file = wppdfUploadedFiles[0];\n            const pass = document.getElementById('wppdf-protect-pass').value;\n            if (!pass) {\n                wppdfToast(\"Password parameter cannot be empty.\");\n                return;\n            }\n\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            \n            \/\/ Local fallback encrypt signature metadata\n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `encrypted_${file.name}`, 'application\/pdf');\n            wppdfToast(\"Document packaged; browser signature locks loaded.\");\n        }\n\n        async function wppdfSignDocument() {\n            const file = wppdfUploadedFiles[0];\n            const tag = document.getElementById('wppdf-signature-tag').value || \"APPROVED\";\n\n            const arrBuffer = await file.arrayBuffer();\n            const doc = await PDFLib.PDFDocument.load(arrBuffer);\n            const pages = doc.getPages();\n            \n            if (pages.length > 0) {\n                const lastPage = pages[pages.length - 1];\n                lastPage.drawText(tag, {\n                    x: 50,\n                    y: 50,\n                    size: 14,\n                    color: PDFLib.rgb(0.8, 0, 0)\n                });\n            }\n\n            const updatedBytes = await doc.save();\n            wppdfDownloadLocalFile(updatedBytes, `signed_${file.name}`, 'application\/pdf');\n        }\n\n        async function wppdfPrintTask() {\n            const file = wppdfUploadedFiles[0];\n            const blob = new Blob([file], { type: 'application\/pdf' });\n            const url = URL.createObjectURL(blob);\n            \n            const iframe = document.createElement('iframe');\n            iframe.style.display = 'none';\n            iframe.src = url;\n            document.body.appendChild(iframe);\n            iframe.contentWindow.focus();\n            iframe.contentWindow.print();\n        }\n\n        function wppdfDownloadLocalFile(data, filename, mimeType) {\n            const blob = (data instanceof Blob) ? data : new Blob([data], { type: mimeType });\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            wppdfToast(`Successfully processed: ${filename}`);\n        }\n\n        \/\/ Boot\n        wppdfInitializeSuite();\n\n    })();\n<\/script>\n\n<\/body>\n<\/html>\n\n\n\n<style data-wp-block-html=\"css\">\n.pdftools-scope { all: initial; box-sizing: border-box; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif; font-size: 16px; line-height: 1.5; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; display: block; width: 100%; margin: 2rem auto; max-width: 1200px; padding: 0 1rem; }\n.pdftools-scope *, .pdftools-scope *::before, .pdftools-scope *::after { box-sizing: border-box; }\n.pdftools-app-container { background-color: #ffffff; border-radius: 16px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); padding: 2rem; color: #1e293b; position: relative; }\n.pdftools-header { margin-bottom: 1.5rem; border-bottom: 1px solid #e2e8f0; padding-bottom: 1.5rem; }\n.pdftools-brand { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.5rem; }\n.pdftools-icon-main { color: #ef4444; flex-shrink: 0; }\n.pdftools-title { font-size: 1.75rem; font-weight: 700; color: #0f172a; margin: 0; padding: 0; }\n.pdftools-tagline { font-size: 0.95rem; color: #64748b; margin: 0; }\n.pdftools-nav-tabs { display: flex; background: #f1f5f9; padding: 0.35rem; border-radius: 8px; gap: 0.25rem; margin-bottom: 2rem; }\n.pdftools-tab-btn { flex: 1; background: none; border: none; padding: 0.65rem 1rem; font-size: 0.95rem; font-weight: 600; color: #475569; border-radius: 6px; cursor: pointer; text-align: center; }\n.pdftools-tab-btn.pdftools-active { background: #ffffff; color: #ef4444; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); }\n.pdftools-card { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 12px; padding: 1.5rem; }\n.pdftools-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.25rem; gap: 1rem; }\n.pdftools-card-title { font-size: 1.1rem; font-weight: 600; color: #1e293b; margin: 0; }\n.pdftools-dropzone { border: 2px dashed #cbd5e1; border-radius: 10px; background-color: #ffffff; padding: 4rem 1.5rem; text-align: center; cursor: pointer; }\n.pdftools-dropzone:hover, .pdftools-dropzone.pdftools-dragover { border-color: #ef4444; background-color: #fef2f2; }\n.pdftools-hidden-input { display: none !important; }\n.pdftools-icon-wrap { color: #94a3b8; margin-bottom: 1rem; }\n.pdftools-dropzone:hover .pdftools-icon-wrap { color: #ef4444; }\n.pdftools-upload-prompt { font-size: 1.15rem; font-weight: 600; color: #334155; margin: 0 0 0.25rem 0; }\n.pdftools-upload-subtext { font-size: 0.85rem; color: #64748b; margin: 0 0 1.5rem 0; }\n.pdftools-editor-grid { display: grid; grid-template-columns: 1fr; gap: 1.5rem; margin-top: 0.5rem; }\n@media (min-width: 868px) { .pdftools-editor-grid { grid-template-columns: 1.2fr 1fr; } }\n.pdftools-queue-container { display: flex; flex-direction: column; gap: 0.75rem; max-height: 400px; overflow-y: auto; }\n.pdftools-queue-item { display: flex; align-items: center; justify-content: space-between; background: #ffffff; padding: 0.75rem 1rem; border-radius: 8px; border: 1px solid #e2e8f0; gap: 1rem; cursor: default; }\n.pdftools-queue-item.pdftools-dragging { opacity: 0.5; border: 2px dashed #ef4444; }\n.pdftools-file-info { display: flex; flex-direction: column; overflow: hidden; flex-grow: 1; }\n.pdftools-file-name { font-size: 0.9rem; font-weight: 600; color: #334155; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.pdftools-file-size { font-size: 0.75rem; color: #64748b; }\n.pdftools-item-actions { display: flex; align-items: center; gap: 0.5rem; }\n.pdftools-form { display: flex; flex-direction: column; gap: 1.25rem; }\n.pdftools-tool-panel { display: flex; flex-direction: column; gap: 1.25rem; }\n.pdftools-panel-desc { font-size: 0.85rem; color: #64748b; margin: 0; }\n.pdftools-form-group { display: flex; flex-direction: column; gap: 0.5rem; }\n.pdftools-control-label { font-size: 0.9rem; font-weight: 600; color: #334155; }\n.pdftools-input-field { width: 100%; border: 1px solid #cbd5e1; border-radius: 6px; padding: 0.6rem 0.75rem; font-size: 0.95rem; color: #334155; background-color: #ffffff; outline: none; }\n.pdftools-input-field:focus, .pdftools-select:focus { border-color: #ef4444; }\n.pdftools-select { width: 100%; padding: 0.65rem 1.5rem 0.65rem 0.75rem; border: 1px solid #cbd5e1; border-radius: 6px; background-color: #ffffff; outline: none; }\n.pdftools-radio-group { display: flex; flex-direction: column; gap: 0.6rem; }\n.pdftools-radio-label { display: flex; align-items: flex-start; gap: 0.5rem; font-size: 0.9rem; color: #334155; cursor: pointer; }\n.pdftools-dimension-grid { display: flex; align-items: center; gap: 0.5rem; }\n.pdftools-range-to { color: #64748b; font-size: 0.85rem; }\n.pdftools-divider { border: 0; border-top: 1px solid #e2e8f0; margin: 0.5rem 0; }\n.pdftools-btn { display: inline-flex; align-items: center; justify-content: center; font-weight: 600; font-size: 0.95rem; padding: 0.65rem 1.25rem; border-radius: 6px; border: 1px solid transparent; cursor: pointer; }\n.pdftools-btn-block { display: flex; width: 100%; }\n.pdftools-btn-primary { background-color: #ef4444; color: #ffffff; }\n.pdftools-btn-primary:hover { background-color: #dc2626; }\n.pdftools-btn-success { background-color: #10b981; color: #ffffff; }\n.pdftools-btn-success:hover { background-color: #059669; }\n.pdftools-btn-text { background: none; border: none; color: #ef4444; font-size: 0.85rem; font-weight: 600; cursor: pointer; padding: 0.25rem 0.5rem; }\n.pdftools-btn-icon-only { background: none; border: none; color: #94a3b8; cursor: pointer; padding: 0.25rem; display: inline-flex; border-radius: 4px; }\n.pdftools-btn-icon-only:hover { color: #ef4444; background-color: #fee2e2; }\n.pdftools-drag-handle { cursor: grab; color: #94a3b8; padding: 0.5rem; display: inline-flex; }\n.pdftools-drag-handle:active { cursor: grabbing; }\n.pdftools-move-btn { background: none; border: none; padding: 4px; cursor: pointer; color: #64748b; border-radius: 4px; }\n.pdftools-move-btn:hover { color: #ef4444; background: #fee2e2; }\n.pdftools-move-btn:disabled { opacity: 0.3; cursor: not-allowed; }\n.pdftools-file-number { font-weight: 800; color: #ef4444; margin-right: 8px; width: 25px; display: inline-block; }\n.pdftools-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.9); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1rem; z-index: 100; border-radius: 16px; backdrop-filter: blur(2px); }\n.pdftools-spinner { width: 44px; height: 44px; border: 4px solid rgba(239, 68, 68, 0.15); border-radius: 50%; border-top-color: #ef4444; animation: pdftools-spin 0.8s linear infinite; }\n@keyframes pdftools-spin { to { transform: rotate(360deg); } }\n.pdftools-overlay-text { color: #1e293b; font-weight: 600; margin: 0; }\n.pdftools-hidden { display: none !important; }\n<\/style>\n\n<script data-wp-block-html=\"js\">\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n  (function pdftoolsInitRuntime() {\n    \"use strict\";\n\n    const dom = {\n      root: document.getElementById(\"pdftools-root\"),\n      tabs: document.querySelectorAll(\".pdftools-tab-btn\"),\n      dropzoneSection: document.getElementById(\"pdftools-dropzone-section\"),\n      dropzone: document.getElementById(\"pdftools-dropzone\"),\n      fileInput: document.getElementById(\"pdftools-file-input\"),\n      browseBtn: document.getElementById(\"pdftools-browse-btn\"),\n      uploadHint: document.getElementById(\"pdftools-upload-hint\"),\n      editorSuite: document.getElementById(\"pdftools-editor-suite\"),\n      queueTitle: document.getElementById(\"pdftools-queue-title\"),\n      fileQueue: document.getElementById(\"pdftools-file-queue\"),\n      resetBtn: document.getElementById(\"pdftools-reset-btn\"),\n      processBtn: document.getElementById(\"pdftools-process-btn\"),\n      globalOverlay: document.getElementById(\"pdftools-global-overlay\"),\n      overlayMsg: document.getElementById(\"pdftools-overlay-msg\"),\n      panels: {\n        merge: document.getElementById(\"pdftools-panel-merge\"),\n        split: document.getElementById(\"pdftools-panel-split\"),\n        compress: document.getElementById(\"pdftools-panel-compress\")\n      },\n      outputName: document.getElementById(\"pdftools-output-name\"),\n      splitRangeGroup: document.getElementById(\"pdftools-split-range-group\"),\n      splitFrom: document.getElementById(\"pdftools-split-from\"),\n      splitTo: document.getElementById(\"pdftools-split-to\"),\n      compressionProfile: document.getElementById(\"pdftools-select-compression\")\n    };\n\n    if (!dom.root) return;\n\n    const state = { activeTool: \"merge\", loadedFiles: [] };\n    const PDF_LIB_URL = \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf-lib\/1.17.1\/pdf-lib.min.js\";\n\n    function pdftoolsFormatBytes(bytes) {\n      if (bytes === 0) return \"0 Bytes\";\n      const k = 1024, sizes = [\"Bytes\", \"KB\", \"MB\"];\n      const i = Math.floor(Math.log(bytes) \/ Math.log(k));\n      return parseFloat((bytes \/ Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n    }\n\n    function pdftoolsLoadEngine(callback) {\n      if (window.PDFLib) { callback(); return; }\n      dom.globalOverlay.classList.remove(\"pdftools-hidden\");\n      dom.overlayMsg.textContent = \"Initializing processing engine...\";\n      \n      const script = document.createElement(\"script\");\n      script.src = PDF_LIB_URL;\n      script.onload = function() { dom.globalOverlay.classList.add(\"pdftools-hidden\"); callback(); };\n      script.onerror = function() { dom.globalOverlay.classList.add(\"pdftools-hidden\"); alert(\"Error mounting processing frameworks.\"); };\n      document.head.appendChild(script);\n    }\n\n    function pdftoolsSwitchTool(toolName) {\n      state.activeTool = toolName;\n      dom.tabs.forEach(tab => tab.classList.toggle(\"pdftools-active\", tab.getAttribute(\"data-tool\") === toolName));\n      Object.keys(dom.panels).forEach(key => dom.panels[key].classList.toggle(\"pdftools-hidden\", key !== toolName));\n\n      if (toolName === \"split\" || toolName === \"compress\") {\n        dom.fileInput.removeAttribute(\"multiple\");\n        dom.uploadHint.textContent = \"Select a single PDF document to manage\";\n        if (state.loadedFiles.length > 1) { state.loadedFiles = [state.loadedFiles[0]]; pdftoolsRenderQueue(); }\n      } else {\n        dom.fileInput.setAttribute(\"multiple\", \"multiple\");\n        dom.uploadHint.textContent = \"Select one or multiple PDF documents\";\n      }\n      pdftoolsUpdateWorkspaceVisibility();\n    }\n\n    function pdftoolsIngestFiles(filesList) {\n      const validFiles = Array.from(filesList).filter(file => file.type === \"application\/pdf\" || file.name.endsWith(\".pdf\"));\n      if (validFiles.length === 0) { alert(\"Please upload valid PDF file formats.\"); return; }\n\n      if (state.activeTool === \"split\" || state.activeTool === \"compress\") {\n        state.loadedFiles = [{ id: \"pdf-\" + Date.now() + \"-0\", file: validFiles[0], name: validFiles[0].name, size: validFiles[0].size }];\n      } else {\n        validFiles.forEach((file, index) => {\n          state.loadedFiles.push({ id: \"pdf-\" + Date.now() + \"-\" + index, file: file, name: file.name, size: file.size });\n        });\n      }\n      pdftoolsRenderQueue();\n      pdftoolsUpdateWorkspaceVisibility();\n    }\n\n    function pdftoolsReorder(oldIndex, newIndex) {\n      if (newIndex < 0 || newIndex >= state.loadedFiles.length) return;\n      const item = state.loadedFiles.splice(oldIndex, 1)[0];\n      state.loadedFiles.splice(newIndex, 0, item);\n      pdftoolsRenderQueue();\n    }\n\n    window.pdftoolsRemoveFile = (id) => {\n      state.loadedFiles = state.loadedFiles.filter(f => f.id !== id);\n      pdftoolsRenderQueue();\n      pdftoolsUpdateWorkspaceVisibility();\n    };\n\n    function pdftoolsRenderQueue() {\n      dom.fileQueue.innerHTML = \"\";\n      state.loadedFiles.forEach((item, index) => {\n        const row = document.createElement(\"div\");\n        row.className = \"pdftools-queue-item\";\n        row.draggable = true;\n        row.dataset.index = index;\n\n        row.addEventListener(\"dragstart\", (e) => {\n          e.dataTransfer.setData(\"text\/plain\", index);\n          row.classList.add(\"pdftools-dragging\");\n        });\n        row.addEventListener(\"dragend\", () => row.classList.remove(\"pdftools-dragging\"));\n        row.addEventListener(\"dragover\", (e) => e.preventDefault());\n        row.addEventListener(\"drop\", (e) => {\n          e.preventDefault();\n          pdftoolsReorder(parseInt(e.dataTransfer.getData(\"text\/plain\")), index);\n        });\n\n        row.innerHTML = `\n          <div style=\"display:flex; align-items:center; flex-grow:1;\">\n            <span class=\"pdftools-drag-handle\">\u2630<\/span>\n            <span class=\"pdftools-file-number\">${index + 1}.<\/span>\n            <div class=\"pdftools-file-info\">\n              <div class=\"pdftools-file-name\" title=\"${item.name}\">${item.name}<\/div>\n              <div class=\"pdftools-file-size\">${pdftoolsFormatBytes(item.size)}<\/div>\n            <\/div>\n          <\/div>\n          <div class=\"pdftools-item-actions\">\n            <button type=\"button\" class=\"pdftools-move-btn\" onclick=\"pdftoolsReorder(${index}, ${index - 1})\" ${index === 0 ? 'disabled' : ''}>\u25b2<\/button>\n            <button type=\"button\" class=\"pdftools-move-btn\" onclick=\"pdftoolsReorder(${index}, ${index + 1})\" ${index === state.loadedFiles.length - 1 ? 'disabled' : ''}>\u25bc<\/button>\n            <button type=\"button\" class=\"pdftools-btn-icon-only\" onclick=\"pdftoolsRemoveFile('${item.id}')\">\n              <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"><polyline points=\"3 6 5 6 21 6\"><\/polyline><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"><\/path><\/svg>\n            <\/button>\n          <\/div>\n        `;\n        dom.fileQueue.appendChild(row);\n      });\n      dom.queueTitle.textContent = `Selected Documents (${state.loadedFiles.length})`;\n    }\n\n    function pdftoolsUpdateWorkspaceVisibility() {\n      const standardVisibility = state.loadedFiles.length > 0;\n      dom.dropzoneSection.classList.toggle(\"pdftools-hidden\", standardVisibility);\n      dom.editorSuite.classList.toggle(\"pdftools-hidden\", !standardVisibility);\n      if (!standardVisibility) dom.fileInput.value = \"\";\n    }\n\n    function pdftoolsExecuteAction() {\n      if (state.loadedFiles.length === 0) return;\n      pdftoolsLoadEngine(async function ready() {\n        dom.globalOverlay.classList.remove(\"pdftools-hidden\");\n        dom.overlayMsg.textContent = \"Processing PDF adjustments, please wait...\";\n        try {\n          const { PDFDocument } = window.PDFLib;\n          if (state.activeTool === \"merge\") {\n            const mergedPdf = await PDFDocument.create();\n            for (const item of state.loadedFiles) {\n              const fileBytes = await item.file.arrayBuffer();\n              const pdfDoc = await PDFDocument.load(fileBytes);\n              const copiedPages = await mergedPdf.copyPages(pdfDoc, pdfDoc.getPageIndices());\n              copiedPages.forEach(p => mergedPdf.addPage(p));\n            }\n            pdftoolsTriggerDownload(await mergedPdf.save(), (dom.outputName.value.trim() || \"merged\") + \".pdf\");\n          } else if (state.activeTool === \"split\") {\n            const item = state.loadedFiles[0];\n            const sourcePdf = await PDFDocument.load(await item.file.arrayBuffer());\n            const totalPages = sourcePdf.getPageCount();\n            const splitMode = document.querySelector('input[name=\"pdftools-split-mode\"]:checked').value;\n\n            if (splitMode === \"all\") {\n              for (let i = 0; i < totalPages; i++) {\n                const singlePdf = await PDFDocument.create();\n                const [p] = await singlePdf.copyPages(sourcePdf, [i]); singlePdf.addPage(p);\n                pdftoolsTriggerDownload(await singlePdf.save(), `${item.name.replace(\".pdf\", \"\")}_page_${i + 1}.pdf`);\n              }\n            } else {\n              let fromPage = Math.max(1, parseInt(dom.splitFrom.value, 10) || 1);\n              let toPage = Math.min(totalPages, parseInt(dom.splitTo.value, 10) || totalPages);\n              if (fromPage > toPage) { alert(\"Invalid page selection range set.\"); return; }\n              const rangePdf = await PDFDocument.create();\n              const indices = Array.from({ length: (toPage - fromPage) + 1 }, (_, i) => (fromPage - 1) + i);\n              const copied = await rangePdf.copyPages(sourcePdf, indices);\n              copied.forEach(p => rangePdf.addPage(p));\n              pdftoolsTriggerDownload(await rangePdf.save(), `${item.name.replace(\".pdf\", \"\")}_range.pdf`);\n            }\n          } else if (state.activeTool === \"compress\") {\n            const item = state.loadedFiles[0];\n            const sourcePdf = await PDFDocument.load(await item.file.arrayBuffer());\n            pdftoolsTriggerDownload(await sourcePdf.save({ useObjectStreams: true }), `${item.name.replace(\".pdf\", \"\")}_compressed.pdf`);\n          }\n        } catch (err) {\n          console.error(err); alert(\"An issue occurred reading or re-saving your document bytes.\");\n        } finally {\n          dom.globalOverlay.classList.add(\"pdftools-hidden\");\n        }\n      });\n    }\n\n    function pdftoolsTriggerDownload(byteArray, filename) {\n      const blob = new Blob([byteArray], { type: \"application\/pdf\" });\n      const link = document.createElement(\"a\");\n      link.href = URL.createObjectURL(blob); link.download = filename;\n      document.body.appendChild(link); link.click();\n      setTimeout(() => { document.body.removeChild(link); URL.revokeObjectURL(link.href); }, 100);\n    }\n\n    dom.tabs.forEach(tab => tab.addEventListener(\"click\", (e) => pdftoolsSwitchTool(e.target.getAttribute(\"data-tool\"))));\n    dom.browseBtn.addEventListener(\"click\", () => dom.fileInput.click());\n    dom.fileInput.addEventListener(\"change\", (e) => pdftoolsIngestFiles(e.target.files));\n\n    [\"dragenter\", \"dragover\"].forEach(ev => {\n      dom.dropzone.addEventListener(ev, (e) => { e.preventDefault(); dom.dropzone.classList.add(\"pdftools-dragover\"); });\n    });\n    [\"dragleave\", \"drop\"].forEach(ev => {\n      dom.dropzone.addEventListener(ev, (e) => { e.preventDefault(); dom.dropzone.classList.remove(\"pdftools-dragover\"); });\n    });\n    dom.dropzone.addEventListener(\"drop\", (e) => { e.preventDefault(); if (e.dataTransfer.files.length) pdftoolsIngestFiles(e.dataTransfer.files); });\n\n    document.querySelectorAll('input[name=\"pdftools-split-mode\"]').forEach(radio => {\n      radio.addEventListener(\"change\", (e) => dom.splitRangeGroup.classList.toggle(\"pdftools-hidden\", e.target.value !== \"range\"));\n    });\n    dom.resetBtn.addEventListener(\"click\", () => { state.loadedFiles = []; pdftoolsUpdateWorkspaceVisibility(); });\n    dom.processBtn.addEventListener(\"click\", pdftoolsExecuteAction);\n  })();\n});\n<\/script>\n\n<div id=\"pdftools-root\" class=\"pdftools-scope\">\n  <div class=\"pdftools-app-container\">\n    <header class=\"pdftools-header\">\n      <div class=\"pdftools-brand\">\n        <svg class=\"pdftools-icon-main\" viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"><\/path><polyline points=\"14 2 14 8 20 8\"><\/polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"><\/line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"><\/line><\/svg>\n        <h1 class=\"pdftools-title\">Local PDF Toolkit<\/h1>\n      <\/div>\n      <p class=\"pdftools-tagline\">Merge, split, and manage PDF documents safely inside your browser.<\/p>\n    <\/header>\n\n    <nav class=\"pdftools-nav-tabs\">\n      <button type=\"button\" class=\"pdftools-tab-btn pdftools-active\" data-tool=\"merge\">Merge PDF<\/button>\n      <button type=\"button\" class=\"pdftools-tab-btn\" data-tool=\"split\">Split PDF<\/button>\n      <button type=\"button\" class=\"pdftools-tab-btn\" data-tool=\"compress\">Compress<\/button>\n    <\/nav>\n\n    <main class=\"pdftools-workspace\">\n      <section id=\"pdftools-dropzone-section\" class=\"pdftools-card pdftools-upload-card\">\n        <div id=\"pdftools-dropzone\" class=\"pdftools-dropzone\">\n          <input type=\"file\" id=\"pdftools-file-input\" class=\"pdftools-hidden-input\" accept=\"application\/pdf\" multiple=\"\">\n          <div class=\"pdftools-dropzone-inner\">\n            <div class=\"pdftools-icon-wrap\">\n              <svg viewBox=\"0 0 24 24\" width=\"48\" height=\"48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"><\/path><polyline points=\"17 8 12 3 7 8\"><\/polyline><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"><\/line><\/svg>\n            <\/div>\n            <h3 class=\"pdftools-upload-prompt\">Drag &amp; drop PDF files here<\/h3>\n            <p class=\"pdftools-upload-subtext\" id=\"pdftools-upload-hint\">Select one or multiple PDF documents<\/p>\n            <button type=\"button\" id=\"pdftools-browse-btn\" class=\"pdftools-btn pdftools-btn-primary\">Choose Files<\/button>\n          <\/div>\n        <\/div>\n      <\/section>\n\n      <section id=\"pdftools-editor-suite\" class=\"pdftools-editor-grid pdftools-hidden\">\n        <div class=\"pdftools-card pdftools-queue-card\">\n          <div class=\"pdftools-card-header\">\n            <h2 class=\"pdftools-card-title\" id=\"pdftools-queue-title\">Selected Documents (0)<\/h2>\n            <button type=\"button\" id=\"pdftools-reset-btn\" class=\"pdftools-btn-text\">Clear All<\/button>\n          <\/div>\n          <div id=\"pdftools-file-queue\" class=\"pdftools-queue-container\"><\/div>\n        <\/div>\n\n        <div class=\"pdftools-card pdftools-control-card\">\n          <div class=\"pdftools-card-header\"><h2 class=\"pdftools-card-title\">Action Settings<\/h2><\/div>\n          <form id=\"pdftools-config-form\" class=\"pdftools-form\" onsubmit=\"return false;\">\n            <div id=\"pdftools-panel-merge\" class=\"pdftools-tool-panel\">\n              <p class=\"pdftools-panel-desc\">Files will be combined sequentially in the order shown on the left list.<\/p>\n              <div class=\"pdftools-form-group\">\n                <label class=\"pdftools-control-label\" for=\"pdftools-output-name\">Output Filename<\/label>\n                <input type=\"text\" id=\"pdftools-output-name\" class=\"pdftools-input-field\" value=\"combined_document\">\n              <\/div>\n            <\/div>\n\n            <div id=\"pdftools-panel-split\" class=\"pdftools-tool-panel pdftools-hidden\">\n              <div class=\"pdftools-form-group\">\n                <label class=\"pdftools-control-label\">Splitting Mode<\/label>\n                <div class=\"pdftools-radio-group\">\n                  <label class=\"pdftools-radio-label\"><input type=\"radio\" name=\"pdftools-split-mode\" value=\"all\" checked=\"\"> <span>Extract every page into individual files<\/span><\/label>\n                  <label class=\"pdftools-radio-label\"><input type=\"radio\" name=\"pdftools-split-mode\" value=\"range\"> <span>Extract explicit page range<\/span><\/label>\n                <\/div>\n              <\/div>\n              <div id=\"pdftools-split-range-group\" class=\"pdftools-form-group pdftools-hidden\">\n                <div class=\"pdftools-dimension-grid\">\n                  <input type=\"number\" id=\"pdftools-split-from\" class=\"pdftools-input-field\" min=\"1\" placeholder=\"From page\">\n                  <span class=\"pdftools-range-to\">to<\/span>\n                  <input type=\"number\" id=\"pdftools-split-to\" class=\"pdftools-input-field\" min=\"1\" placeholder=\"To page\">\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div id=\"pdftools-panel-compress\" class=\"pdftools-tool-panel pdftools-hidden\">\n              <div class=\"pdftools-form-group\">\n                <label class=\"pdftools-control-label\">Target Compression Profile<\/label>\n                <select id=\"pdftools-select-compression\" class=\"pdftools-select\">\n                  <option value=\"balanced\" selected=\"\">Balanced Compression (Recommended)<\/option>\n                  <option value=\"max\">Max Compression<\/option>\n                <\/select>\n              <\/div>\n            <\/div>\n\n            <hr class=\"pdftools-divider\">\n            <div class=\"pdftools-action-strip\">\n              <button type=\"button\" id=\"pdftools-process-btn\" class=\"pdftools-btn pdftools-btn-success pdftools-btn-block\">Run Tool Action<\/button>\n            <\/div>\n          <\/form>\n        <\/div>\n      <\/section>\n    <\/main>\n\n    <div id=\"pdftools-global-overlay\" class=\"pdftools-overlay pdftools-hidden\">\n      <div class=\"pdftools-spinner\"><\/div>\n      <p class=\"pdftools-overlay-text\" id=\"pdftools-overlay-msg\">Reading files locally&#8230;<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Enterprise PDF Suite &#8211; 100% Client-Side Local Enterprise PDF Engine Run full file operations completely in-browser. Absolute privacy. Safe from cloud telemetry. All Tools Organize &#038; Edit Convert To\/From Security &#038; Repair PDF Engine Workspace Drag and drop files here, or click to browse Accepted formats depend on active tool selection Process Files Local PDF [&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-9","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/9","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=9"}],"version-history":[{"count":8,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions"}],"predecessor-version":[{"id":520,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/9\/revisions\/520"}],"wp:attachment":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/media?parent=9"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}