{"id":3096,"date":"2025-09-26T03:39:24","date_gmt":"2025-09-26T03:39:24","guid":{"rendered":"https:\/\/yamuparkoti.com\/?page_id=3096"},"modified":"2026-08-24T14:05:29","modified_gmt":"2026-08-24T14:05:29","slug":"convertidor-dual-jpeg-pdf","status":"publish","type":"page","link":"https:\/\/yamuparkoti.com\/es\/jpeg-pdf-dual-converter\/","title":{"rendered":"Convertidor JPEG a PDF"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"wp-block-bplugins-custom-html\" id='bPluginsCustomHtml-1'>\n<link rel=\"preconnect\" href=\"https:\/\/cdnjs.cloudflare.com\" crossorigin>\n<script defer src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n<script defer src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.4.120\/pdf.min.js\"><\/script>\n<script defer src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\n<script defer src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/2.0.5\/FileSaver.min.js\"><\/script>\n<style>\r\n        :root {\r\n            --primary-color: #e74c3c;\r\n            --primary-dark: #c0392b;\r\n            --secondary-color: #2c3e50;\r\n            --light-gray: #1d1d26;\r\n            --medium-gray: #e0e0e0;\r\n            --dark-gray: #95a5a6;\r\n            --text-color: #f0f0f0;\r\n            --white: #1d1d26;\r\n            --shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n            --transition: all 0.3s ease;\r\n        }\r\n\r\n        .dark-mode {\r\n            --primary-color: #e74c3c;\r\n            --primary-dark: #c0392b;\r\n            --secondary-color: #34495e;\r\n            --light-gray: #2c3e50;\r\n            --medium-gray: #34495e;\r\n            --dark-gray: #7f8c8d;\r\n            --text-color: #ecf0f1;\r\n            --white: #2c3e50;\r\n            --shadow: 0 4px 6px rgba(0, 0, 0, 0.3);\r\n        }\r\n\r\n        * {\r\n            margin: 0;\r\n            padding: 0;\r\n            box-sizing: border-box;\r\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\r\n        }\r\n\r\n        body {\r\n            background-color: var(--light-gray);\r\n            color: var(--text-color);\r\n            transition: var(--transition);\r\n            line-height: 1.6;\r\n        }\r\n\r\n        .container {\r\n            max-width: 1200px;\r\n            margin: 0 auto;\r\n            padding: 20px;\r\n        }\r\n\r\n        header {\r\n            text-align: center;\r\n            margin-bottom: 30px;\r\n        }\r\n\r\n        h1 {\r\n            font-size: 2.5rem;\r\n            margin-bottom: 10px;\r\n            color: var(--secondary-color);\r\n        }\r\n\r\n        .subtitle {\r\n            font-size: 1.2rem;\r\n            color: var(--dark-gray);\r\n        }\r\n\r\n        .mode-toggle {\r\n            display: flex;\r\n            justify-content: center;\r\n            margin-bottom: 30px;\r\n            background-color: var(--white);\r\n            border-radius: 10px;\r\n            overflow: hidden;\r\n            box-shadow: var(--shadow);\r\n            max-width: 500px;\r\n            margin-left: auto;\r\n            margin-right: auto;\r\n        }\r\n\r\n        .mode-btn {\r\n            flex: 1;\r\n            padding: 15px 20px;\r\n            border: none;\r\n            background-color: var(--white);\r\n            color: var(--text-color);\r\n            font-size: 1.1rem;\r\n            font-weight: 600;\r\n            cursor: pointer;\r\n            transition: var(--transition);\r\n        }\r\n\r\n        .mode-btn.active {\r\n            background-color: var(--primary-color);\r\n            color: white;\r\n        }\r\n\r\n        .mode-btn:not(.active):hover {\r\n            background-color: var(--medium-gray);\r\n        }\r\n\r\n        .main-content {\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            gap: 20px;\r\n            margin-bottom: 30px;\r\n        }\r\n\r\n        .upload-section {\r\n            flex: 1;\r\n            min-width: 300px;\r\n            background-color: var(--white);\r\n            border-radius: 10px;\r\n            padding: 25px;\r\n            box-shadow: var(--shadow);\r\n            display: flex;\r\n            flex-direction: column;\r\n            align-items: center;\r\n        }\r\n\r\n        .upload-area {\r\n            width: 100%;\r\n            border: 2px dashed var(--medium-gray);\r\n            border-radius: 10px;\r\n            padding: 40px 20px;\r\n            text-align: center;\r\n            margin-bottom: 20px;\r\n            transition: var(--transition);\r\n            cursor: pointer;\r\n        }\r\n\r\n        .upload-area:hover, .upload-area.dragover {\r\n            border-color: var(--primary-color);\r\n            background-color: rgba(231, 76, 60, 0.05);\r\n        }\r\n\r\n        .upload-icon {\r\n            font-size: 48px;\r\n            color: var(--dark-gray);\r\n            margin-bottom: 15px;\r\n        }\r\n\r\n        .upload-text {\r\n            margin-bottom: 20px;\r\n            color: var(--dark-gray);\r\n        }\r\n\r\n        .btn {\r\n            padding: 12px 25px;\r\n            background-color: var(--primary-color);\r\n            color: white;\r\n            border: none;\r\n            border-radius: 5px;\r\n            font-size: 1rem;\r\n            font-weight: 600;\r\n            cursor: pointer;\r\n            transition: var(--transition);\r\n            display: inline-flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n        }\r\n\r\n        .btn:hover {\r\n            background-color: var(--primary-dark);\r\n            transform: translateY(-2px);\r\n        }\r\n\r\n        .btn:active {\r\n            transform: translateY(0);\r\n        }\r\n\r\n        .cloud-services {\r\n            display: flex;\r\n            gap: 15px;\r\n            margin-top: 15px;\r\n        }\r\n\r\n        .cloud-btn {\r\n            padding: 8px 15px;\r\n            background-color: var(--light-gray);\r\n            border: none;\r\n            border-radius: 5px;\r\n            cursor: pointer;\r\n            transition: var(--transition);\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 5px;\r\n        }\r\n\r\n        .cloud-btn:hover {\r\n            background-color: var(--medium-gray);\r\n        }\r\n\r\n        .options-section {\r\n            flex: 0 0 250px;\r\n            background-color: var(--white);\r\n            border-radius: 10px;\r\n            padding: 25px;\r\n            box-shadow: var(--shadow);\r\n        }\r\n\r\n        .options-title {\r\n            font-size: 1.2rem;\r\n            margin-bottom: 20px;\r\n            color: var(--secondary-color);\r\n            border-bottom: 1px solid var(--medium-gray);\r\n            padding-bottom: 10px;\r\n        }\r\n\r\n        .option-group {\r\n            margin-bottom: 20px;\r\n        }\r\n\r\n        .option-label {\r\n            display: block;\r\n            margin-bottom: 8px;\r\n            font-weight: 600;\r\n        }\r\n\r\n        .option-select, .option-radio-group {\r\n            width: 100%;\r\n            padding: 10px;\r\n            border: 1px solid var(--medium-gray);\r\n            border-radius: 5px;\r\n            background-color: var(--white);\r\n            color: var(--text-color);\r\n        }\r\n\r\n        .option-radio-group {\r\n            display: flex;\r\n            gap: 15px;\r\n            border: none;\r\n            padding: 0;\r\n        }\r\n\r\n        .radio-option {\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 5px;\r\n        }\r\n\r\n        .preview-section {\r\n            width: 100%;\r\n            background-color: var(--white);\r\n            border-radius: 10px;\r\n            padding: 25px;\r\n            box-shadow: var(--shadow);\r\n            margin-top: 20px;\r\n        }\r\n\r\n        .preview-title {\r\n            font-size: 1.2rem;\r\n            margin-bottom: 20px;\r\n            color: var(--secondary-color);\r\n            border-bottom: 1px solid var(--medium-gray);\r\n            padding-bottom: 10px;\r\n        }\r\n\r\n        .preview-content {\r\n            min-height: 200px;\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            gap: 15px;\r\n        }\r\n\r\n        .preview-item {\r\n            position: relative;\r\n            width: 150px;\r\n            height: 200px;\r\n            border: 1px solid var(--medium-gray);\r\n            border-radius: 5px;\r\n            overflow: hidden;\r\n            display: flex;\r\n            flex-direction: column;\r\n        }\r\n\r\n        .preview-img {\r\n            flex: 1;\r\n            object-fit: cover;\r\n            width: 100%;\r\n            height: 150px;\r\n        }\r\n\r\n        .preview-info {\r\n            padding: 8px;\r\n            font-size: 0.8rem;\r\n            background-color: var(--light-gray);\r\n        }\r\n\r\n        .preview-actions {\r\n            position: absolute;\r\n            top: 5px;\r\n            right: 5px;\r\n            display: flex;\r\n            gap: 5px;\r\n        }\r\n\r\n        .preview-action-btn {\r\n            width: 25px;\r\n            height: 25px;\r\n            border-radius: 50%;\r\n            border: none;\r\n            background-color: rgba(0, 0, 0, 0.5);\r\n            color: white;\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            cursor: pointer;\r\n            font-size: 0.8rem;\r\n        }\r\n\r\n        .convert-btn-container {\r\n            text-align: center;\r\n            margin-top: 30px;\r\n        }\r\n\r\n        #convertBtn {\r\n            padding: 15px 40px;\r\n            font-size: 1.2rem;\r\n        }\r\n\r\n        .empty-preview {\r\n            width: 100%;\r\n            text-align: center;\r\n            padding: 40px 0;\r\n            color: var(--dark-gray);\r\n        }\r\n\r\n        .dark-mode-toggle {\r\n            position: fixed;\r\n            top: 20px;\r\n            right: 20px;\r\n            background-color: var(--white);\r\n            border: none;\r\n            border-radius: 50%;\r\n            width: 50px;\r\n            height: 50px;\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            box-shadow: var(--shadow);\r\n            cursor: pointer;\r\n            z-index: 100;\r\n        }\r\n\r\n        .loading {\r\n            display: none;\r\n            position: fixed;\r\n            top: 0;\r\n            left: 0;\r\n            width: 100%;\r\n            height: 100%;\r\n            background-color: rgba(0, 0, 0, 0.7);\r\n            z-index: 1000;\r\n            align-items: center;\r\n            justify-content: center;\r\n            flex-direction: column;\r\n            color: white;\r\n        }\r\n\r\n        .spinner {\r\n            width: 50px;\r\n            height: 50px;\r\n            border: 5px solid rgba(255, 255, 255, 0.3);\r\n            border-radius: 50%;\r\n            border-top-color: white;\r\n            animation: spin 1s ease-in-out infinite;\r\n            margin-bottom: 15px;\r\n        }\r\n\r\n        @keyframes spin {\r\n            to { transform: rotate(360deg); }\r\n        }\r\n\r\n        .drag-handle {\r\n            cursor: move;\r\n            padding: 5px;\r\n        }\r\n\r\n        .progress-bar {\r\n            width: 80%;\r\n            max-width: 300px;\r\n            height: 10px;\r\n            background-color: rgba(255, 255, 255, 0.3);\r\n            border-radius: 5px;\r\n            margin-top: 15px;\r\n            overflow: hidden;\r\n        }\r\n\r\n        .progress {\r\n            height: 100%;\r\n            background-color: var(--primary-color);\r\n            width: 0%;\r\n            transition: width 0.3s ease;\r\n        }\r\n\r\n        \/* Responsive adjustments *\/\r\n        @media (max-width: 768px) {\r\n            .main-content {\r\n                flex-direction: column;\r\n            }\r\n            \r\n            .options-section {\r\n                width: 100%;\r\n            }\r\n            \r\n            h1 {\r\n                font-size: 2rem;\r\n            }\r\n            \r\n            .preview-item {\r\n                width: 120px;\r\n                height: 160px;\r\n            }\r\n            \r\n            .preview-img {\r\n                height: 110px;\r\n            }\r\n        }\r\n\r\n        @media (max-width: 480px) {\r\n            .container {\r\n                padding: 10px;\r\n            }\r\n            \r\n            .upload-section, .options-section, .preview-section {\r\n                padding: 15px;\r\n            }\r\n            \r\n            .mode-btn {\r\n                padding: 12px 15px;\r\n                font-size: 1rem;\r\n            }\r\n            \r\n            .preview-item {\r\n                width: 100px;\r\n                height: 140px;\r\n            }\r\n            \r\n            .preview-img {\r\n                height: 90px;\r\n            }\r\n        }\r\n    <\/style>\n\r\n    <div class=\"loading\" id=\"loading\">\r\n        <div class=\"spinner\"><\/div>\r\n        <p id=\"loadingText\">Converting files, please wait&#8230;<\/p>\r\n        <div class=\"progress-bar\">\r\n            <div class=\"progress\" id=\"progressBar\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <button class=\"dark-mode-toggle\" id=\"darkModeToggle\">\ud83c\udf19<\/button>\r\n\r\n    <div class=\"container\">\r\n        <header>\r\n            <h1>JPEG \u2194 PDF Converter<\/h1>\r\n            <p class=\"subtitle\">Convert JPEG to PDF or PDF to JPEG in seconds.<\/p>\r\n        <\/header>\r\n\r\n        <div class=\"mode-toggle\">\r\n            <button class=\"mode-btn active\" id=\"jpgToPdfBtn\">JPG \u2192 PDF<\/button>\r\n            <button class=\"mode-btn\" id=\"pdfToJpgBtn\">PDF \u2192 JPG<\/button>\r\n        <\/div>\r\n\r\n        <div class=\"main-content\">\r\n            <div class=\"upload-section\">\r\n                <div class=\"upload-area\" id=\"uploadArea\">\r\n                    <div class=\"upload-icon\">\ud83d\udcc1<\/div>\r\n                    <p class=\"upload-text\">Drag &#038; drop your files here<\/p>\r\n                    <input type=\"file\" id=\"fileInput\" style=\"display: none;\" accept=\".jpg,.jpeg,.png,.pdf\" multiple>\r\n                    <button class=\"btn\" id=\"selectFilesBtn\">Select Files<\/button>\r\n                <\/div>\r\n\r\n                <div class=\"cloud-services\">\r\n                    <button class=\"cloud-btn\">\r\n                        <span>Google Drive<\/span>\r\n                    <\/button>\r\n                    <button class=\"cloud-btn\">\r\n                        <span>Dropbox<\/span>\r\n                    <\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <div class=\"options-section\" id=\"optionsSection\">\r\n                <h3 class=\"options-title\">PDF Options<\/h3>\r\n                \r\n                <div class=\"option-group\">\r\n                    <label class=\"option-label\">Page Orientation<\/label>\r\n                    <div class=\"option-radio-group\">\r\n                        <label class=\"radio-option\">\r\n                            <input type=\"radio\" name=\"orientation\" value=\"portrait\" checked>\r\n                            Portrait\r\n                        <\/label>\r\n                        <label class=\"radio-option\">\r\n                            <input type=\"radio\" name=\"orientation\" value=\"landscape\">\r\n                            Landscape\r\n                        <\/label>\r\n                    <\/div>\r\n                <\/div>\r\n                \r\n                <div class=\"option-group\">\r\n                    <label class=\"option-label\">Page Size<\/label>\r\n                    <select class=\"option-select\" id=\"pageSize\">\r\n                        <option value=\"a4\">A4<\/option>\r\n                        <option value=\"letter\">Letter<\/option>\r\n                        <option value=\"legal\">Legal<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n                \r\n                <div class=\"option-group\">\r\n                    <label class=\"option-label\">Margin<\/label>\r\n                    <select class=\"option-select\" id=\"margin\">\r\n                        <option value=\"0\">No Margin<\/option>\r\n                        <option value=\"10\">Small<\/option>\r\n                        <option value=\"20\" selected>Medium<\/option>\r\n                        <option value=\"30\">Large<\/option>\r\n                    <\/select>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"preview-section\">\r\n            <h3 class=\"preview-title\" id=\"previewTitle\">Selected Images<\/h3>\r\n            <div class=\"preview-content\" id=\"previewContent\">\r\n                <div class=\"empty-preview\">No files selected yet. Upload some files to see preview.<\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"convert-btn-container\">\r\n            <button class=\"btn\" id=\"convertBtn\">Convert to PDF<\/button>\r\n        <\/div>\r\n    <\/div>\n<script>\n(function () {\n    'use strict';\n\n    \/\/ NOTE FOR FUTURE EDITS: this page is filtered on render and a bare ampersand becomes a\n    \/\/ numeric HTML entity. Entities are NOT decoded inside a script element, so one literal\n    \/\/ ampersand is a fatal SyntaxError that kills every feature on the page. It is also\n    \/\/ INCONSISTENT - of the three AND operators in the previous version, two were mangled\n    \/\/ and one survived, so \"this one has always worked\" proves nothing. Never use the AND\n    \/\/ operator here. Use nested ifs, Array.every, or De Morgan with OR. OR is safe.\n\n    var MAX_FILE_MB = 25;\n    var MAX_FILES = 100;\n\n    var $ = function (id) { return document.getElementById(id); };\n\n    var state = {\n        mode: 'jpgToPdf',\n        files: [],          \/\/ { blob, url, name, size, pageNum, kind }\n        busy: false\n    };\n\n    \/* ---------------- small helpers ---------------- *\/\n\n    function el(tag, cls, text) {\n        var n = document.createElement(tag);\n        if (cls) { n.className = cls; }\n        if (text !== undefined) { n.textContent = text; }\n        return n;\n    }\n\n    function revokeAll() {\n        state.files.forEach(function (f) {\n            if (f.url) { try { URL.revokeObjectURL(f.url); } catch (e) {} }\n        });\n    }\n\n    function bytesToKB(n) { return (n \/ 1024).toFixed(1) + ' KB'; }\n\n    function showLoading(on, text) {\n        var box = $('loading');\n        var label = $('loadingText');\n        if (box) { box.style.display = on ? 'flex' : 'none'; }\n        if (label) { label.textContent = text || 'Converting files, please wait...'; }\n        if (!on) { setProgress(0); }\n        state.busy = on;\n        var btn = $('convertBtn');\n        if (btn) { btn.disabled = on; }\n    }\n\n    function setProgress(pct) {\n        var bar = $('progressBar');\n        if (bar) { bar.style.width = pct + '%'; }\n    }\n\n    function fail(msg) {\n        showLoading(false);\n        window.alert(msg);\n    }\n\n    \/\/ A CDN block or an offline visitor used to surface as a confusing generic failure.\n    function libMissing() {\n        var missing = [];\n        if (!window.jspdf) { missing.push('jsPDF'); }\n        if (!window.pdfjsLib) { missing.push('PDF.js'); }\n        if (!window.JSZip) { missing.push('JSZip'); }\n        if (!window.saveAs) { missing.push('FileSaver'); }\n        return missing;\n    }\n\n    \/* ---------------- mode ---------------- *\/\n\n    function switchMode(mode) {\n        if (state.busy) { return; }\n        state.mode = mode;\n\n        var jpgBtn = $('jpgToPdfBtn');\n        var pdfBtn = $('pdfToJpgBtn');\n        if (jpgBtn) {\n            jpgBtn.classList.toggle('active', mode === 'jpgToPdf');\n            jpgBtn.setAttribute('aria-pressed', mode === 'jpgToPdf' ? 'true' : 'false');\n        }\n        if (pdfBtn) {\n            pdfBtn.classList.toggle('active', mode === 'pdfToJpg');\n            pdfBtn.setAttribute('aria-pressed', mode === 'pdfToJpg' ? 'true' : 'false');\n        }\n\n        var input = $('fileInput');\n        if (input) {\n            input.accept = mode === 'jpgToPdf' ? 'image\/jpeg,image\/png' : 'application\/pdf';\n            input.multiple = mode === 'jpgToPdf';\n        }\n\n        var opts = $('optionsSection');\n        if (opts) { opts.style.display = mode === 'jpgToPdf' ? 'block' : 'none'; }\n\n        var title = $('previewTitle');\n        var conv = $('convertBtn');\n        if (title) { title.textContent = mode === 'jpgToPdf' ? 'Selected Images' : 'PDF Pages'; }\n        if (conv) { conv.textContent = mode === 'jpgToPdf' ? 'Convert to PDF' : 'Convert to JPG'; }\n\n        revokeAll();          \/\/ object URLs leaked on every mode switch before\n        state.files = [];\n        renderPreview();\n    }\n\n    \/* ---------------- intake ---------------- *\/\n\n    function acceptFiles(fileList) {\n        if (state.busy) { return; }\n        var files = Array.prototype.slice.call(fileList || []);\n        if (!files.length) { return; }\n\n        var rejected = [];\n        var ok = [];\n\n        files.forEach(function (f) {\n            var tooBig = f.size > MAX_FILE_MB * 1024 * 1024;\n            if (tooBig) { rejected.push(f.name + ' (over ' + MAX_FILE_MB + ' MB)'); return; }\n            if (state.mode === 'jpgToPdf') {\n                var isJpeg = f.type === 'image\/jpeg';\n                var isPng = f.type === 'image\/png';\n                if (isJpeg) { ok.push(f); return; }\n                if (isPng) { ok.push(f); return; }\n                rejected.push(f.name + ' (not a JPEG or PNG)');\n            } else {\n                if (f.type === 'application\/pdf') { ok.push(f); return; }\n                rejected.push(f.name + ' (not a PDF)');\n            }\n        });\n\n        \/\/ The old code aborted the whole batch on the first bad file. Now the good ones\n        \/\/ still go through and the report says exactly what was skipped.\n        if (rejected.length) {\n            window.alert('Skipped ' + rejected.length + ' file(s):\\n' + rejected.join('\\n'));\n        }\n        if (!ok.length) { return; }\n\n        if (state.mode === 'jpgToPdf') {\n            addImages(ok);\n        } else {\n            if (ok.length > 1) { window.alert('Only the first PDF will be used.'); }\n            loadPdf(ok[0]);\n        }\n    }\n\n    \/\/ Order matters for a JPG-to-PDF tool. The old version fired one FileReader per file and\n    \/\/ pushed on each onload, so pages landed in whatever order the reads happened to finish.\n    \/\/ Slots are reserved up front and filled by index, so page order always matches selection.\n    function addImages(files) {\n        var room = MAX_FILES - state.files.length;\n        if (room <= 0) { window.alert('Limit is ' + MAX_FILES + ' images.'); return; }\n        var take = files.slice(0, room);\n        if (files.length > room) { window.alert('Only the first ' + room + ' image(s) were added.'); }\n\n        take.forEach(function (f) {\n            state.files.push({\n                blob: f,\n                url: URL.createObjectURL(f),   \/\/ object URL, not a base64 data URL\n                name: f.name,\n                size: f.size,\n                kind: f.type === 'image\/png' ? 'PNG' : 'JPEG'\n            });\n        });\n        renderPreview();\n    }\n\n    function loadPdf(file) {\n        var missing = libMissing();\n        if (missing.indexOf('PDF.js') !== -1) { fail('PDF.js failed to load. Check your connection and reload.'); return; }\n\n        showLoading(true, 'Loading PDF file...');\n        var reader = new FileReader();\n\n        reader.onerror = function () { fail('Could not read that file.'); };\n        reader.onload = function (e) {\n            var data = new Uint8Array(e.target.result);\n            \/\/ pdf.js 3.x wants a parameter object; a bare typed array is the legacy form.\n            window.pdfjsLib.getDocument({ data: data }).promise.then(function (pdf) {\n                revokeAll();\n                state.files = [];\n                var total = pdf.numPages;\n                var done = 0;\n                var jobs = [];\n\n                for (var i = 1; i <= total; i++) {\n                    jobs.push(renderPage(pdf, i).then(function (rec) {\n                        done++;\n                        setProgress((done \/ total) * 100);\n                        return rec;\n                    }));\n                }\n\n                Promise.all(jobs).then(function (pages) {\n                    pages.sort(function (a, b) { return a.pageNum - b.pageNum; });\n                    state.files = pages;\n                    renderPreview();\n                    showLoading(false);\n                }).catch(function (err) {\n                    if (window.console) { console.error(err); }\n                    fail('Could not render this PDF.');\n                });\n            }).catch(function (err) {\n                if (window.console) { console.error('Error loading PDF:', err); }\n                fail('Error loading PDF file. It may be corrupt or password-protected.');\n            });\n        };\n        reader.readAsArrayBuffer(file);\n    }\n\n    function renderPage(pdf, num) {\n        return pdf.getPage(num).then(function (page) {\n            var viewport = page.getViewport({ scale: 2 });\n            var canvas = document.createElement('canvas');\n            canvas.width = viewport.width;\n            canvas.height = viewport.height;\n            var ctx = canvas.getContext('2d');\n            \/\/ JPEG has no alpha; without this, transparent regions render black.\n            ctx.fillStyle = '#ffffff';\n            ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n            \/\/ intent 'print' matters here. With the default 'display' intent pdf.js drives its\n            \/\/ render loop with requestAnimationFrame, which browsers suspend in a background\n            \/\/ tab - so switching tabs mid-conversion stalls it forever with the spinner up.\n            \/\/ Verified on this page: default intent never resolved while 'print' completed.\n            \/\/ We are rasterising for export, not painting to screen, so 'print' is also correct.\n            return page.render({ canvasContext: ctx, viewport: viewport, intent: 'print' }).promise.then(function () {\n                return new Promise(function (resolve) {\n                    \/\/ toBlob keeps binary out of a base64 string; the old toDataURL held every\n                    \/\/ page in memory at roughly 1.33x its real size.\n                    canvas.toBlob(function (blob) {\n                        canvas.width = 0;\n                        canvas.height = 0;\n                        resolve({\n                            blob: blob,\n                            url: URL.createObjectURL(blob),\n                            name: 'page-' + num + '.jpg',\n                            size: blob ? blob.size : 0,\n                            pageNum: num,\n                            kind: 'JPEG'\n                        });\n                    }, 'image\/jpeg', 0.92);\n                });\n            });\n        });\n    }\n\n    \/* ---------------- preview ---------------- *\/\n\n    function renderPreview() {\n        var host = $('previewContent');\n        if (!host) { return; }\n        host.innerHTML = '';\n\n        if (!state.files.length) {\n            host.appendChild(el('div', 'empty-preview',\n                'No files selected yet. Upload some files to see preview.'));\n            return;\n        }\n\n        state.files.forEach(function (f, index) {\n            var item = el('div', 'preview-item');\n            item.setAttribute('data-index', index);\n\n            var img = el('img', 'preview-img');\n            img.src = f.url;\n            img.alt = state.mode === 'jpgToPdf' ? f.name : 'Page ' + f.pageNum;\n            img.loading = 'lazy';\n            item.appendChild(img);\n\n            var info = el('div', 'preview-info');\n            \/\/ textContent, not innerHTML: a filename can contain markup.\n            if (state.mode === 'jpgToPdf') {\n                info.appendChild(el('div', null, f.name));\n                info.appendChild(el('div', null, bytesToKB(f.size)));\n            } else {\n                info.appendChild(el('div', null, 'Page ' + f.pageNum));\n                info.appendChild(el('div', null, bytesToKB(f.size)));\n            }\n            item.appendChild(info);\n\n            if (state.mode === 'jpgToPdf') {\n                item.draggable = true;\n                var actions = el('div', 'preview-actions');\n                var rm = el('button', 'preview-action-btn remove-btn', '\u00d7');\n                rm.type = 'button';\n                rm.setAttribute('aria-label', 'Remove ' + f.name);\n                actions.appendChild(rm);\n                var handle = el('button', 'preview-action-btn drag-handle', '\u2261');\n                handle.type = 'button';\n                handle.setAttribute('aria-label', 'Drag to reorder');\n                actions.appendChild(handle);\n                item.appendChild(actions);\n            }\n\n            host.appendChild(item);\n        });\n    }\n\n    function removeAt(index) {\n        var f = state.files[index];\n        if (!f) { return; }\n        if (f.url) { try { URL.revokeObjectURL(f.url); } catch (e) {} }\n        state.files.splice(index, 1);\n        renderPreview();\n    }\n\n    \/\/ Where should a dragged card land? Find the first card whose centre is past the pointer.\n    \/\/ The old helper reduced over the non-dragging items and returned an index into THAT\n    \/\/ filtered list, then treated a missing match as index undefined - which splice read as 0,\n    \/\/ so dropping at the end sent the image to the front instead.\n    function dropIndex(host, x, y) {\n        var items = Array.prototype.slice.call(host.querySelectorAll('.preview-item'));\n        for (var i = 0; i < items.length; i++) {\n            if (items[i].classList.contains('dragging')) { continue; }\n            var b = items[i].getBoundingClientRect();\n            var below = y < b.top + b.height \/ 2;\n            var leftOf = false;\n            if (y < b.bottom) { if (x < b.left + b.width \/ 2) { leftOf = true; } }\n            if (below) { return parseInt(items[i].getAttribute('data-index'), 10); }\n            if (leftOf) { return parseInt(items[i].getAttribute('data-index'), 10); }\n        }\n        return state.files.length;\n    }\n\n    function move(from, to) {\n        if (from === to) { return; }\n        if (from < 0) { return; }\n        if (from >= state.files.length) { return; }\n        var moved = state.files.splice(from, 1)[0];\n        var target = to;\n        if (from < to) { target = to - 1; }\n        if (target < 0) { target = 0; }\n        if (target > state.files.length) { target = state.files.length; }\n        state.files.splice(target, 0, moved);\n        renderPreview();\n    }\n\n    \/* ---------------- conversion ---------------- *\/\n\n    function convert() {\n        if (state.busy) { return; }\n        if (!state.files.length) { window.alert('Please upload files first.'); return; }\n        if (state.mode === 'jpgToPdf') { toPdf(); } else { toJpg(); }\n    }\n\n    function readOption(id, fallback) {\n        var node = $(id);\n        if (!node) { return fallback; }\n        var n = parseInt(node.value, 10);\n        return isNaN(n) ? fallback : n;\n    }\n\n    function toPdf() {\n        if (!window.jspdf) { fail('jsPDF failed to load. Check your connection and reload.'); return; }\n        showLoading(true, 'Converting images to PDF...');\n\n        var JsPDF = window.jspdf.jsPDF;\n        var orientNode = document.querySelector('input[name=\"orientation\"]:checked');\n        var orientation = orientNode ? orientNode.value : 'portrait';\n        var sizeNode = $('pageSize');\n        var pageSize = sizeNode ? sizeNode.value : 'a4';\n        var margin = readOption('margin', 20);\n\n        var sizes = { a4: [210, 297], letter: [216, 279], legal: [216, 356] };\n        \/\/ An unrecognised value used to leave the page dimensions undefined, and every\n        \/\/ downstream measurement became NaN, producing a blank PDF with no error.\n        var dims = sizes[pageSize] || sizes.a4;\n        var pageW = dims[0];\n        var pageH = dims[1];\n        if (orientation === 'landscape') { var t = pageW; pageW = pageH; pageH = t; }\n\n        if (margin * 2 >= Math.min(pageW, pageH)) { margin = 0; }\n\n        var doc = new JsPDF({ orientation: orientation, unit: 'mm', format: pageSize });\n\n        var i = 0;\n        function step() {\n            if (i >= state.files.length) {\n                try { doc.save('converted.pdf'); } catch (e) { fail('Could not save the PDF.'); return; }\n                showLoading(false);\n                return;\n            }\n            var rec = state.files[i];\n            setProgress(((i + 1) \/ state.files.length) * 100);\n            var label = $('loadingText');\n            if (label) { label.textContent = 'Converting image ' + (i + 1) + ' of ' + state.files.length + '...'; }\n\n            var img = new Image();\n            img.onload = function () {\n                try {\n                    if (i > 0) { doc.addPage(pageSize, orientation); }\n                    var cw = pageW - margin * 2;\n                    var ch = pageH - margin * 2;\n                    var w = cw;\n                    var h = (img.naturalHeight * cw) \/ img.naturalWidth;\n                    if (h > ch) { h = ch; w = (img.naturalWidth * ch) \/ img.naturalHeight; }\n                    \/\/ The old call hardcoded 'JPEG' even for PNG sources.\n                    doc.addImage(img, rec.kind, (pageW - w) \/ 2, (pageH - h) \/ 2, w, h);\n                } catch (err) {\n                    if (window.console) { console.error(err); }\n                    fail('Could not add \"' + rec.name + '\" to the PDF.');\n                    return;\n                }\n                i++;\n                \/\/ Yield so the progress bar can actually paint between pages.\n                setTimeout(step, 0);\n            };\n            img.onerror = function () { fail('Failed to load image: ' + rec.name); };\n            img.src = rec.url;\n        }\n        step();\n    }\n\n    function toJpg() {\n        if (!state.files.length) { window.alert('No PDF pages to convert.'); return; }\n        showLoading(true, 'Preparing JPG files...');\n\n        if (state.files.length === 1) {\n            var one = state.files[0];\n            var a = document.createElement('a');\n            a.href = one.url;\n            a.download = one.name;\n            document.body.appendChild(a);\n            a.click();\n            document.body.removeChild(a);\n            showLoading(false);\n            return;\n        }\n\n        if (!window.JSZip) { fail('JSZip failed to load. Check your connection and reload.'); return; }\n        var zip = new window.JSZip();\n        state.files.forEach(function (f) { zip.file(f.name, f.blob); });\n\n        zip.generateAsync({ type: 'blob' }, function (meta) {\n            setProgress(meta.percent);\n        }).then(function (content) {\n            if (window.saveAs) {\n                window.saveAs(content, 'converted-pages.zip');\n            } else {\n                \/\/ FileSaver is a convenience, not a requirement.\n                var url = URL.createObjectURL(content);\n                var link = document.createElement('a');\n                link.href = url;\n                link.download = 'converted-pages.zip';\n                document.body.appendChild(link);\n                link.click();\n                document.body.removeChild(link);\n                setTimeout(function () { URL.revokeObjectURL(url); }, 10000);\n            }\n            showLoading(false);\n        }).catch(function (err) {\n            if (window.console) { console.error(err); }\n            fail('Could not build the ZIP file.');\n        });\n    }\n\n    \/* ---------------- init ---------------- *\/\n\n    function init() {\n        var host = $('previewContent');\n        var upload = $('uploadArea');\n        var input = $('fileInput');\n\n        var jpgBtn = $('jpgToPdfBtn');\n        if (jpgBtn) { jpgBtn.addEventListener('click', function () { switchMode('jpgToPdf'); }); }\n        var pdfBtn = $('pdfToJpgBtn');\n        if (pdfBtn) { pdfBtn.addEventListener('click', function () { switchMode('pdfToJpg'); }); }\n\n        var pick = $('selectFilesBtn');\n        if (pick) {\n            if (input) { pick.addEventListener('click', function () { input.click(); }); }\n        }\n        if (input) {\n            input.addEventListener('change', function (e) {\n                acceptFiles(e.target.files);\n                e.target.value = '';\n            });\n        }\n\n        var conv = $('convertBtn');\n        if (conv) { conv.addEventListener('click', convert); }\n\n        var dark = $('darkModeToggle');\n        if (dark) {\n            var saved = null;\n            try { saved = localStorage.getItem('jpd-theme'); } catch (e) { saved = null; }\n            if (saved === 'dark') { document.body.classList.add('dark-mode'); }\n            dark.textContent = document.body.classList.contains('dark-mode') ? '\u2600\ufe0f' : '\ud83c\udf19';\n            dark.setAttribute('aria-label', 'Toggle dark mode');\n            dark.addEventListener('click', function () {\n                document.body.classList.toggle('dark-mode');\n                var on = document.body.classList.contains('dark-mode');\n                dark.textContent = on ? '\u2600\ufe0f' : '\ud83c\udf19';\n                try { localStorage.setItem('jpd-theme', on ? 'dark' : 'light'); } catch (e) {}\n            });\n        }\n\n        if (upload) {\n            upload.addEventListener('dragover', function (e) {\n                e.preventDefault();\n                upload.classList.add('dragover');\n            });\n            upload.addEventListener('dragleave', function () { upload.classList.remove('dragover'); });\n            upload.addEventListener('drop', function (e) {\n                e.preventDefault();\n                upload.classList.remove('dragover');\n                acceptFiles(e.dataTransfer.files);\n            });\n        }\n\n        \/\/ Delegated, and bound exactly once. The old code re-attached dragover\/drop inside\n        \/\/ renderPreview, so after N previews a single drop fired N handlers and the image\n        \/\/ was moved N times.\n        if (host) {\n            host.addEventListener('click', function (e) {\n                var btn = e.target.closest ? e.target.closest('.remove-btn') : null;\n                if (!btn) { return; }\n                var item = btn.closest('.preview-item');\n                if (!item) { return; }\n                removeAt(parseInt(item.getAttribute('data-index'), 10));\n            });\n\n            host.addEventListener('dragstart', function (e) {\n                var item = e.target.closest ? e.target.closest('.preview-item') : null;\n                if (!item) { return; }\n                if (state.mode !== 'jpgToPdf') { return; }\n                e.dataTransfer.setData('text\/plain', item.getAttribute('data-index'));\n                e.dataTransfer.effectAllowed = 'move';\n                item.classList.add('dragging');\n            });\n\n            host.addEventListener('dragend', function (e) {\n                var item = e.target.closest ? e.target.closest('.preview-item') : null;\n                if (item) { item.classList.remove('dragging'); }\n            });\n\n            host.addEventListener('dragover', function (e) { e.preventDefault(); });\n\n            host.addEventListener('drop', function (e) {\n                e.preventDefault();\n                if (state.mode !== 'jpgToPdf') { return; }\n                var from = parseInt(e.dataTransfer.getData('text\/plain'), 10);\n                if (isNaN(from)) { return; }\n                move(from, dropIndex(host, e.clientX, e.clientY));\n            });\n        }\n\n        \/\/ These never had handlers - clicking them did nothing at all. Marked plainly rather\n        \/\/ than left looking functional.\n        Array.prototype.forEach.call(document.querySelectorAll('.cloud-btn'), function (b) {\n            b.disabled = true;\n            b.style.opacity = '0.5';\n            b.style.cursor = 'not-allowed';\n            b.title = 'Not available yet - use Select Files';\n        });\n\n        if (window.pdfjsLib) {\n            window.pdfjsLib.GlobalWorkerOptions.workerSrc =\n                'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.4.120\/pdf.worker.min.js';\n        }\n\n        var missing = libMissing();\n        if (missing.length) {\n            if (window.console) { console.warn('date\/pdf tool: libraries not loaded: ' + missing.join(', ')); }\n        }\n\n        window.addEventListener('beforeunload', revokeAll);\n        switchMode('jpgToPdf');\n    }\n\n    \/\/ The old code assumed DOMContentLoaded had not fired yet. If anything defers or moves\n    \/\/ this script, that assumption silently leaves every button unwired.\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', init);\n    } else {\n        init();\n    }\n})();\n<\/script><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n\n<div class=\"wp-block-kadence-column kadence-column3096_e9ba59-24\"><div class=\"kt-inside-inner-col\"><\/div><\/div>\n\n\n\n<div class=\"wp-block-kadence-column kadence-column3096_3ad6bf-c2\"><div class=\"kt-inside-inner-col\">\n<h1 class=\"wp-block-heading\">JPEG PDF Converter: Simple Tool to Organize Your Images<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes, images are messy. Different files. Different sizes. Hard to share.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s where a <strong>JPEG PDF converter<\/strong> saves the day. It changes loose pictures into one clean document. No confusion.<br>No stress. Just order.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What is a JPEG PDF Converter?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A JPEG PDF converter is an online or offline tool. It takes your picture files and merges them into PDF format.<br>This means your images become part of a universal file type. No matter who receives it, they can open it.<br>You don\u2019t need special software or extra apps. It just works everywhere, from phones to desktops.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Think of it like placing loose photos into a book. The photos stay the same, but now they\u2019re arranged neatly.<br>Anyone can flip through them without losing a page.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why Do People Use It?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Different people use a JPEG PDF converter daily. Students use it for homework images and assignments. Job seekers use it to prepare scanned certificates.<br>Teachers rely on it to organize classroom notes. Businesses use it for contracts and reports.<br>Families use it to collect memories in one file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The beauty is in its simplicity.<br>Instead of sending ten separate photos, you send one PDF. The receiver appreciates the effort and clarity. It feels professional, organized, and polished.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">How It Works in Practice<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Using this converter is simple.<br>First, upload your JPEG files to the tool. Second, arrange them in the correct order.<br>Third, adjust margins, size, or orientation if needed. Finally, click convert and wait a few seconds.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The result?<br>One single PDF document that looks neat and organized. You can then download, share, or print it instantly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Even if you\u2019re not tech-savvy, you can do this. It\u2019s built for everyone, from beginners to advanced users.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Features of a Reliable JPEG PDF Converter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not every converter is reliable.<br>Some reduce quality or take too long. Others may not work on certain devices.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The best converters share common features. They are fast, giving results in seconds. They preserve image quality without distortion. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They work on both laptops and smartphones.<br>They ensure security with file protection. And they delete your files after conversion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Always check for these features before choosing one. That way, your experience will stay smooth and safe.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why Online Tools Are Better<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are software options.<br>But online tools make life easier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">They don\u2019t require installation. They save storage space. They work across different platforms instantly.<br>They are available anytime with just a browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For students, workers, or families, this is a blessing. No downloads. No updates.<br>Just quick access to what you need.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Is It Safe to Use?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, if you choose trusted tools.<br>Look for secure sites using HTTPS. Ensure files are auto-deleted after processing. Read user reviews for credibility.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A good JPEG PDF converter will respect your privacy.<br>It won\u2019t keep or misuse your files. It simply processes, converts, and clears data quickly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trust matters here.<br>So don\u2019t settle for random, unknown websites.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Example in Real Life<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s say you are a student.<br>You take photos of your math assignment. The teacher only accepts PDF submissions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of panicking, you open the converter.<br>You upload three JPEG images into the tool. You arrange them in order from page one to three.<br>You hit convert and wait a few seconds.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now you have one PDF file ready to send.<br>It looks neat and professional. Your teacher is happy. You save time and avoid stress.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Key Benefits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The benefits are simple yet powerful. It makes documents look professional. It reduces confusion when sending multiple files.<br>It allows for easier storage and sharing. It saves time for both sender and receiver. It works on any device without compatibility issues.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This small step of converting JPEG to PDF can boost your credibility. It shows you care about presentation and order.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Call to Action<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Now, it\u2019s your turn.<br>Stop sending messy image files. Stop worrying about format errors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udc49 Use our <strong>free JPEG PDF converter<\/strong> today.<br>Upload your files. Click once. Download instantly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s fast.<br>It\u2019s simple.<br>It\u2019s safe.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Perfect for students, professionals, and families. Turn your pictures into clean PDFs today.<br>Stay professional. Stay organized.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Final Thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the digital age, small tools make a big difference. A <strong>JPEG PDF converter<\/strong> is one of those tools.<br>It saves time, adds professionalism, and ensures clarity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You don\u2019t need advanced skills to use it. You don\u2019t need to spend money on software. You only need a few clicks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Next time someone asks for a PDF, don\u2019t stress. You\u2019ll know exactly what to do. Upload, convert, and share with confidence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udc49 Try our <strong>JPEG PDF converter<\/strong> now for Shopifying experience.<br>Organize your files the smart way.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Additional info \u2014 <a href=\"https:\/\/yamuparkoti.com\/compress-jpg-file\/\" data-type=\"link\" data-id=\"https:\/\/yamuparkoti.com\/compress-jpg-file\/\">Compress Jpg<\/a> | <a href=\"https:\/\/yamuparkoti.com\/word-count-checker\/\" data-type=\"link\" data-id=\"https:\/\/yamuparkoti.com\/word-count-checker\/\">Word Count Checker<\/a><\/p>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-kadence-column kadence-column3096_122320-86\"><div class=\"kt-inside-inner-col\"><\/div><\/div>\n\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":3454,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-3096","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages\/3096","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/comments?post=3096"}],"version-history":[{"count":3,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages\/3096\/revisions"}],"predecessor-version":[{"id":5595,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/pages\/3096\/revisions\/5595"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/media\/3454"}],"wp:attachment":[{"href":"https:\/\/yamuparkoti.com\/es\/wp-json\/wp\/v2\/media?parent=3096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}