{"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-06-12T13:55:27","modified_gmt":"2026-06-12T13:55:27","slug":"jpeg-pdf-dual-converter","status":"publish","type":"page","link":"https:\/\/yamuparkoti.com\/pt\/jpeg-pdf-dual-converter\/","title":{"rendered":"Conversor de JPEG 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<!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>JPEG \u2194 PDF Converter<\/title>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n    <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.4.120\/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\/FileSaver.js\/2.0.5\/FileSaver.min.js\"><\/script>\n    <style>\n        :root {\n            --primary-color: #e74c3c;\n            --primary-dark: #c0392b;\n            --secondary-color: #2c3e50;\n            --light-gray: #1d1d26;\n            --medium-gray: #e0e0e0;\n            --dark-gray: #95a5a6;\n            --text-color: #f0f0f0;\n            --white: #1d1d26;\n            --shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n            --transition: all 0.3s ease;\n        }\n\n        .dark-mode {\n            --primary-color: #e74c3c;\n            --primary-dark: #c0392b;\n            --secondary-color: #34495e;\n            --light-gray: #2c3e50;\n            --medium-gray: #34495e;\n            --dark-gray: #7f8c8d;\n            --text-color: #ecf0f1;\n            --white: #2c3e50;\n            --shadow: 0 4px 6px rgba(0, 0, 0, 0.3);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n        }\n\n        body {\n            background-color: var(--light-gray);\n            color: var(--text-color);\n            transition: var(--transition);\n            line-height: 1.6;\n        }\n\n        .container {\n            max-width: 1200px;\n            margin: 0 auto;\n            padding: 20px;\n        }\n\n        header {\n            text-align: center;\n            margin-bottom: 30px;\n        }\n\n        h1 {\n            font-size: 2.5rem;\n            margin-bottom: 10px;\n            color: var(--secondary-color);\n        }\n\n        .subtitle {\n            font-size: 1.2rem;\n            color: var(--dark-gray);\n        }\n\n        .mode-toggle {\n            display: flex;\n            justify-content: center;\n            margin-bottom: 30px;\n            background-color: var(--white);\n            border-radius: 10px;\n            overflow: hidden;\n            box-shadow: var(--shadow);\n            max-width: 500px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .mode-btn {\n            flex: 1;\n            padding: 15px 20px;\n            border: none;\n            background-color: var(--white);\n            color: var(--text-color);\n            font-size: 1.1rem;\n            font-weight: 600;\n            cursor: pointer;\n            transition: var(--transition);\n        }\n\n        .mode-btn.active {\n            background-color: var(--primary-color);\n            color: white;\n        }\n\n        .mode-btn:not(.active):hover {\n            background-color: var(--medium-gray);\n        }\n\n        .main-content {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 20px;\n            margin-bottom: 30px;\n        }\n\n        .upload-section {\n            flex: 1;\n            min-width: 300px;\n            background-color: var(--white);\n            border-radius: 10px;\n            padding: 25px;\n            box-shadow: var(--shadow);\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n        }\n\n        .upload-area {\n            width: 100%;\n            border: 2px dashed var(--medium-gray);\n            border-radius: 10px;\n            padding: 40px 20px;\n            text-align: center;\n            margin-bottom: 20px;\n            transition: var(--transition);\n            cursor: pointer;\n        }\n\n        .upload-area:hover, .upload-area.dragover {\n            border-color: var(--primary-color);\n            background-color: rgba(231, 76, 60, 0.05);\n        }\n\n        .upload-icon {\n            font-size: 48px;\n            color: var(--dark-gray);\n            margin-bottom: 15px;\n        }\n\n        .upload-text {\n            margin-bottom: 20px;\n            color: var(--dark-gray);\n        }\n\n        .btn {\n            padding: 12px 25px;\n            background-color: var(--primary-color);\n            color: white;\n            border: none;\n            border-radius: 5px;\n            font-size: 1rem;\n            font-weight: 600;\n            cursor: pointer;\n            transition: var(--transition);\n            display: inline-flex;\n            align-items: center;\n            justify-content: center;\n        }\n\n        .btn:hover {\n            background-color: var(--primary-dark);\n            transform: translateY(-2px);\n        }\n\n        .btn:active {\n            transform: translateY(0);\n        }\n\n        .cloud-services {\n            display: flex;\n            gap: 15px;\n            margin-top: 15px;\n        }\n\n        .cloud-btn {\n            padding: 8px 15px;\n            background-color: var(--light-gray);\n            border: none;\n            border-radius: 5px;\n            cursor: pointer;\n            transition: var(--transition);\n            display: flex;\n            align-items: center;\n            gap: 5px;\n        }\n\n        .cloud-btn:hover {\n            background-color: var(--medium-gray);\n        }\n\n        .options-section {\n            flex: 0 0 250px;\n            background-color: var(--white);\n            border-radius: 10px;\n            padding: 25px;\n            box-shadow: var(--shadow);\n        }\n\n        .options-title {\n            font-size: 1.2rem;\n            margin-bottom: 20px;\n            color: var(--secondary-color);\n            border-bottom: 1px solid var(--medium-gray);\n            padding-bottom: 10px;\n        }\n\n        .option-group {\n            margin-bottom: 20px;\n        }\n\n        .option-label {\n            display: block;\n            margin-bottom: 8px;\n            font-weight: 600;\n        }\n\n        .option-select, .option-radio-group {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid var(--medium-gray);\n            border-radius: 5px;\n            background-color: var(--white);\n            color: var(--text-color);\n        }\n\n        .option-radio-group {\n            display: flex;\n            gap: 15px;\n            border: none;\n            padding: 0;\n        }\n\n        .radio-option {\n            display: flex;\n            align-items: center;\n            gap: 5px;\n        }\n\n        .preview-section {\n            width: 100%;\n            background-color: var(--white);\n            border-radius: 10px;\n            padding: 25px;\n            box-shadow: var(--shadow);\n            margin-top: 20px;\n        }\n\n        .preview-title {\n            font-size: 1.2rem;\n            margin-bottom: 20px;\n            color: var(--secondary-color);\n            border-bottom: 1px solid var(--medium-gray);\n            padding-bottom: 10px;\n        }\n\n        .preview-content {\n            min-height: 200px;\n            display: flex;\n            flex-wrap: wrap;\n            gap: 15px;\n        }\n\n        .preview-item {\n            position: relative;\n            width: 150px;\n            height: 200px;\n            border: 1px solid var(--medium-gray);\n            border-radius: 5px;\n            overflow: hidden;\n            display: flex;\n            flex-direction: column;\n        }\n\n        .preview-img {\n            flex: 1;\n            object-fit: cover;\n            width: 100%;\n            height: 150px;\n        }\n\n        .preview-info {\n            padding: 8px;\n            font-size: 0.8rem;\n            background-color: var(--light-gray);\n        }\n\n        .preview-actions {\n            position: absolute;\n            top: 5px;\n            right: 5px;\n            display: flex;\n            gap: 5px;\n        }\n\n        .preview-action-btn {\n            width: 25px;\n            height: 25px;\n            border-radius: 50%;\n            border: none;\n            background-color: rgba(0, 0, 0, 0.5);\n            color: white;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            cursor: pointer;\n            font-size: 0.8rem;\n        }\n\n        .convert-btn-container {\n            text-align: center;\n            margin-top: 30px;\n        }\n\n        #convertBtn {\n            padding: 15px 40px;\n            font-size: 1.2rem;\n        }\n\n        .empty-preview {\n            width: 100%;\n            text-align: center;\n            padding: 40px 0;\n            color: var(--dark-gray);\n        }\n\n        .dark-mode-toggle {\n            position: fixed;\n            top: 20px;\n            right: 20px;\n            background-color: var(--white);\n            border: none;\n            border-radius: 50%;\n            width: 50px;\n            height: 50px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            box-shadow: var(--shadow);\n            cursor: pointer;\n            z-index: 100;\n        }\n\n        .loading {\n            display: none;\n            position: fixed;\n            top: 0;\n            left: 0;\n            width: 100%;\n            height: 100%;\n            background-color: rgba(0, 0, 0, 0.7);\n            z-index: 1000;\n            align-items: center;\n            justify-content: center;\n            flex-direction: column;\n            color: white;\n        }\n\n        .spinner {\n            width: 50px;\n            height: 50px;\n            border: 5px solid rgba(255, 255, 255, 0.3);\n            border-radius: 50%;\n            border-top-color: white;\n            animation: spin 1s ease-in-out infinite;\n            margin-bottom: 15px;\n        }\n\n        @keyframes spin {\n            to { transform: rotate(360deg); }\n        }\n\n        .drag-handle {\n            cursor: move;\n            padding: 5px;\n        }\n\n        .progress-bar {\n            width: 80%;\n            max-width: 300px;\n            height: 10px;\n            background-color: rgba(255, 255, 255, 0.3);\n            border-radius: 5px;\n            margin-top: 15px;\n            overflow: hidden;\n        }\n\n        .progress {\n            height: 100%;\n            background-color: var(--primary-color);\n            width: 0%;\n            transition: width 0.3s ease;\n        }\n\n        \/* Responsive adjustments *\/\n        @media (max-width: 768px) {\n            .main-content {\n                flex-direction: column;\n            }\n            \n            .options-section {\n                width: 100%;\n            }\n            \n            h1 {\n                font-size: 2rem;\n            }\n            \n            .preview-item {\n                width: 120px;\n                height: 160px;\n            }\n            \n            .preview-img {\n                height: 110px;\n            }\n        }\n\n        @media (max-width: 480px) {\n            .container {\n                padding: 10px;\n            }\n            \n            .upload-section, .options-section, .preview-section {\n                padding: 15px;\n            }\n            \n            .mode-btn {\n                padding: 12px 15px;\n                font-size: 1rem;\n            }\n            \n            .preview-item {\n                width: 100px;\n                height: 140px;\n            }\n            \n            .preview-img {\n                height: 90px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"loading\" id=\"loading\">\n        <div class=\"spinner\"><\/div>\n        <p id=\"loadingText\">Converting files, please wait&#8230;<\/p>\n        <div class=\"progress-bar\">\n            <div class=\"progress\" id=\"progressBar\"><\/div>\n        <\/div>\n    <\/div>\n\n    <button class=\"dark-mode-toggle\" id=\"darkModeToggle\">\ud83c\udf19<\/button>\n\n    <div class=\"container\">\n        <header>\n            <h1>JPEG \u2194 PDF Converter<\/h1>\n            <p class=\"subtitle\">Convert JPEG to PDF or PDF to JPEG in seconds.<\/p>\n        <\/header>\n\n        <div class=\"mode-toggle\">\n            <button class=\"mode-btn active\" id=\"jpgToPdfBtn\">JPG \u2192 PDF<\/button>\n            <button class=\"mode-btn\" id=\"pdfToJpgBtn\">PDF \u2192 JPG<\/button>\n        <\/div>\n\n        <div class=\"main-content\">\n            <div class=\"upload-section\">\n                <div class=\"upload-area\" id=\"uploadArea\">\n                    <div class=\"upload-icon\">\ud83d\udcc1<\/div>\n                    <p class=\"upload-text\">Drag &#038; drop your files here<\/p>\n                    <input type=\"file\" id=\"fileInput\" style=\"display: none;\" accept=\".jpg,.jpeg,.png,.pdf\" multiple>\n                    <button class=\"btn\" id=\"selectFilesBtn\">Select Files<\/button>\n                <\/div>\n\n                <div class=\"cloud-services\">\n                    <button class=\"cloud-btn\">\n                        <span>Google Drive<\/span>\n                    <\/button>\n                    <button class=\"cloud-btn\">\n                        <span>Dropbox<\/span>\n                    <\/button>\n                <\/div>\n            <\/div>\n\n            <div class=\"options-section\" id=\"optionsSection\">\n                <h3 class=\"options-title\">PDF Options<\/h3>\n                \n                <div class=\"option-group\">\n                    <label class=\"option-label\">Page Orientation<\/label>\n                    <div class=\"option-radio-group\">\n                        <label class=\"radio-option\">\n                            <input type=\"radio\" name=\"orientation\" value=\"portrait\" checked>\n                            Portrait\n                        <\/label>\n                        <label class=\"radio-option\">\n                            <input type=\"radio\" name=\"orientation\" value=\"landscape\">\n                            Landscape\n                        <\/label>\n                    <\/div>\n                <\/div>\n                \n                <div class=\"option-group\">\n                    <label class=\"option-label\">Page Size<\/label>\n                    <select class=\"option-select\" id=\"pageSize\">\n                        <option value=\"a4\">A4<\/option>\n                        <option value=\"letter\">Letter<\/option>\n                        <option value=\"legal\">Legal<\/option>\n                    <\/select>\n                <\/div>\n                \n                <div class=\"option-group\">\n                    <label class=\"option-label\">Margin<\/label>\n                    <select class=\"option-select\" id=\"margin\">\n                        <option value=\"0\">No Margin<\/option>\n                        <option value=\"10\">Small<\/option>\n                        <option value=\"20\" selected>Medium<\/option>\n                        <option value=\"30\">Large<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"preview-section\">\n            <h3 class=\"preview-title\" id=\"previewTitle\">Selected Images<\/h3>\n            <div class=\"preview-content\" id=\"previewContent\">\n                <div class=\"empty-preview\">No files selected yet. Upload some files to see preview.<\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"convert-btn-container\">\n            <button class=\"btn\" id=\"convertBtn\">Convert to PDF<\/button>\n        <\/div>\n    <\/div>\n\n    <script>\n        \/\/ Global variables\n        let currentMode = 'jpgToPdf';\n        let uploadedFiles = [];\n        let pdfDoc = null;\n\n        \/\/ DOM elements\n        const jpgToPdfBtn = document.getElementById('jpgToPdfBtn');\n        const pdfToJpgBtn = document.getElementById('pdfToJpgBtn');\n        const selectFilesBtn = document.getElementById('selectFilesBtn');\n        const fileInput = document.getElementById('fileInput');\n        const uploadArea = document.getElementById('uploadArea');\n        const optionsSection = document.getElementById('optionsSection');\n        const previewTitle = document.getElementById('previewTitle');\n        const previewContent = document.getElementById('previewContent');\n        const convertBtn = document.getElementById('convertBtn');\n        const darkModeToggle = document.getElementById('darkModeToggle');\n        const loading = document.getElementById('loading');\n        const loadingText = document.getElementById('loadingText');\n        const progressBar = document.getElementById('progressBar');\n\n        \/\/ Initialize the app\n        document.addEventListener('DOMContentLoaded', function() {\n            \/\/ Set up event listeners\n            jpgToPdfBtn.addEventListener('click', () => switchMode('jpgToPdf'));\n            pdfToJpgBtn.addEventListener('click', () => switchMode('pdfToJpg'));\n            selectFilesBtn.addEventListener('click', () => fileInput.click());\n            fileInput.addEventListener('change', handleFileSelect);\n            convertBtn.addEventListener('click', handleConversion);\n            darkModeToggle.addEventListener('click', toggleDarkMode);\n\n            \/\/ Drag and drop functionality\n            uploadArea.addEventListener('dragover', (e) => {\n                e.preventDefault();\n                uploadArea.classList.add('dragover');\n            });\n\n            uploadArea.addEventListener('dragleave', () => {\n                uploadArea.classList.remove('dragover');\n            });\n\n            uploadArea.addEventListener('drop', (e) => {\n                e.preventDefault();\n                uploadArea.classList.remove('dragover');\n                handleDroppedFiles(e.dataTransfer.files);\n            });\n\n            \/\/ Initialize PDF.js worker\n            pdfjsLib.GlobalWorkerOptions.workerSrc = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.4.120\/pdf.worker.min.js';\n        });\n\n        \/\/ Switch between conversion modes\n        function switchMode(mode) {\n            currentMode = mode;\n            \n            \/\/ Update active button\n            jpgToPdfBtn.classList.toggle('active', mode === 'jpgToPdf');\n            pdfToJpgBtn.classList.toggle('active', mode === 'pdfToJpg');\n            \n            \/\/ Update file input accept attribute\n            fileInput.accept = mode === 'jpgToPdf' ? '.jpg,.jpeg,.png' : '.pdf';\n            fileInput.multiple = mode === 'jpgToPdf';\n            \n            \/\/ Show\/hide options section\n            optionsSection.style.display = mode === 'jpgToPdf' ? 'block' : 'none';\n            \n            \/\/ Update preview title and convert button text\n            if (mode === 'jpgToPdf') {\n                previewTitle.textContent = 'Selected Images';\n                convertBtn.textContent = 'Convert to PDF';\n            } else {\n                previewTitle.textContent = 'PDF Pages';\n                convertBtn.textContent = 'Convert to JPG';\n            }\n            \n            \/\/ Clear previous files\n            uploadedFiles = [];\n            updatePreview();\n        }\n\n        \/\/ Handle file selection via input\n        function handleFileSelect(e) {\n            handleDroppedFiles(e.target.files);\n            fileInput.value = ''; \/\/ Reset input to allow selecting same file again\n        }\n\n        \/\/ Handle dropped files\n        function handleDroppedFiles(files) {\n            if (files.length === 0) return;\n            \n            \/\/ Validate file types based on current mode\n            for (let i = 0; i < files.length; i++) {\n                const file = files[i];\n                \n                if (currentMode === 'jpgToPdf') {\n                    if (!file.type.match('image\/jpeg') &#038;&#038; !file.type.match('image\/png')) {\n                        alert('Please upload only JPEG or PNG images in JPG to PDF mode.');\n                        return;\n                    }\n                } else {\n                    if (!file.type.match('application\/pdf')) {\n                        alert('Please upload only PDF files in PDF to JPG mode.');\n                        return;\n                    }\n                    \n                    \/\/ In PDF to JPG mode, only one PDF file is allowed\n                    if (files.length > 1) {\n                        alert('Please upload only one PDF file at a time.');\n                        return;\n                    }\n                }\n            }\n            \n            \/\/ Process the files\n            if (currentMode === 'jpgToPdf') {\n                processImageFiles(files);\n            } else {\n                processPdfFile(files[0]);\n            }\n        }\n\n        \/\/ Process uploaded image files\n        function processImageFiles(files) {\n            Array.from(files).forEach(file => {\n                const reader = new FileReader();\n                \n                reader.onload = function(e) {\n                    uploadedFiles.push({\n                        file: file,\n                        dataUrl: e.target.result,\n                        id: Date.now() + Math.random()\n                    });\n                    \n                    updatePreview();\n                };\n                \n                reader.readAsDataURL(file);\n            });\n        }\n\n        \/\/ Process uploaded PDF file\n        function processPdfFile(file) {\n            showLoading(true, 'Loading PDF file...');\n            \n            const reader = new FileReader();\n            \n            reader.onload = function(e) {\n                const typedArray = new Uint8Array(e.target.result);\n                \n                \/\/ Use PDF.js to parse the PDF\n                pdfjsLib.getDocument(typedArray).promise.then(pdf => {\n                    pdfDoc = pdf;\n                    uploadedFiles = [];\n                    \n                    \/\/ Extract each page as an image\n                    const numPages = pdf.numPages;\n                    const pagePromises = [];\n                    \n                    for (let i = 1; i <= numPages; i++) {\n                        pagePromises.push(\n                            pdf.getPage(i).then(page => {\n                                const viewport = page.getViewport({ scale: 1.5 });\n                                \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 = {\n                                    canvasContext: context,\n                                    viewport: viewport\n                                };\n                                \n                                return page.render(renderContext).promise.then(() => {\n                                    return {\n                                        pageNum: i,\n                                        dataUrl: canvas.toDataURL('image\/jpeg'),\n                                        fileName: `page-${i}.jpg`\n                                    };\n                                });\n                            })\n                        );\n                    }\n                    \n                    Promise.all(pagePromises).then(pages => {\n                        uploadedFiles = pages;\n                        updatePreview();\n                        showLoading(false);\n                    });\n                }).catch(error => {\n                    console.error('Error loading PDF:', error);\n                    alert('Error loading PDF file. Please try another file.');\n                    showLoading(false);\n                });\n            };\n            \n            reader.readAsArrayBuffer(file);\n        }\n\n        \/\/ Update the preview section\n        function updatePreview() {\n            previewContent.innerHTML = '';\n            \n            if (uploadedFiles.length === 0) {\n                previewContent.innerHTML = '<div class=\"empty-preview\">No files selected yet. Upload some files to see preview.<\/div>';\n                return;\n            }\n            \n            if (currentMode === 'jpgToPdf') {\n                \/\/ For JPG to PDF mode, show image thumbnails\n                uploadedFiles.forEach((file, index) => {\n                    const previewItem = document.createElement('div');\n                    previewItem.className = 'preview-item';\n                    previewItem.setAttribute('data-id', file.id);\n                    previewItem.draggable = true;\n                    \n                    previewItem.innerHTML = `\n                        <img decoding=\"async\" src=\"${file.dataUrl}\" alt=\"Preview\" class=\"preview-img\">\n                        <div class=\"preview-info\">\n                            <div>${file.file.name}<\/div>\n                            <div>${(file.file.size \/ 1024).toFixed(2)} KB<\/div>\n                        <\/div>\n                        <div class=\"preview-actions\">\n                            <button class=\"preview-action-btn remove-btn\">\u00d7<\/button>\n                            <button class=\"preview-action-btn drag-handle\">\u2261<\/button>\n                        <\/div>\n                    `;\n                    \n                    previewContent.appendChild(previewItem);\n                    \n                    \/\/ Add event listeners for the buttons\n                    const removeBtn = previewItem.querySelector('.remove-btn');\n                    removeBtn.addEventListener('click', () => removeFile(file.id));\n                    \n                    \/\/ Drag and drop for reordering\n                    previewItem.addEventListener('dragstart', (e) => {\n                        e.dataTransfer.setData('text\/plain', index);\n                        previewItem.classList.add('dragging');\n                    });\n                    \n                    previewItem.addEventListener('dragend', () => {\n                        previewItem.classList.remove('dragging');\n                    });\n                });\n                \n                \/\/ Make the preview area a drop zone for reordering\n                previewContent.addEventListener('dragover', (e) => {\n                    e.preventDefault();\n                });\n                \n                previewContent.addEventListener('drop', (e) => {\n                    e.preventDefault();\n                    const fromIndex = parseInt(e.dataTransfer.getData('text\/plain'));\n                    const toIndex = getDragAfterElement(previewContent, e.clientY);\n                    \n                    if (toIndex !== null && fromIndex !== toIndex) {\n                        const movedItem = uploadedFiles.splice(fromIndex, 1)[0];\n                        uploadedFiles.splice(toIndex, 0, movedItem);\n                        updatePreview();\n                    }\n                });\n            } else {\n                \/\/ For PDF to JPG mode, show page previews\n                uploadedFiles.forEach((page, index) => {\n                    const previewItem = document.createElement('div');\n                    previewItem.className = 'preview-item';\n                    \n                    previewItem.innerHTML = `\n                        <img decoding=\"async\" src=\"${page.dataUrl}\" alt=\"Page ${page.pageNum}\" class=\"preview-img\">\n                        <div class=\"preview-info\">\n                            <div>Page ${page.pageNum}<\/div>\n                        <\/div>\n                    `;\n                    \n                    previewContent.appendChild(previewItem);\n                });\n            }\n        }\n\n        \/\/ Helper function for drag and drop reordering\n        function getDragAfterElement(container, y) {\n            const draggableElements = [...container.querySelectorAll('.preview-item:not(.dragging)')];\n            \n            return draggableElements.reduce((closest, child, index) => {\n                const box = child.getBoundingClientRect();\n                const offset = y - box.top - box.height \/ 2;\n                \n                if (offset < 0 &#038;&#038; offset > closest.offset) {\n                    return { offset: offset, element: child, index: index };\n                } else {\n                    return closest;\n                }\n            }, { offset: Number.NEGATIVE_INFINITY }).index;\n        }\n\n        \/\/ Remove a file from the preview\n        function removeFile(id) {\n            uploadedFiles = uploadedFiles.filter(file => file.id !== id);\n            updatePreview();\n        }\n\n        \/\/ Handle the conversion process\n        function handleConversion() {\n            if (uploadedFiles.length === 0) {\n                alert('Please upload files first.');\n                return;\n            }\n            \n            if (currentMode === 'jpgToPdf') {\n                convertJpgToPdf();\n            } else {\n                convertPdfToJpg();\n            }\n        }\n\n        \/\/ Convert JPG images to PDF - FIXED VERSION\n        async function convertJpgToPdf() {\n            showLoading(true, 'Converting images to PDF...');\n            \n            try {\n                const { jsPDF } = window.jspdf;\n                const orientation = document.querySelector('input[name=\"orientation\"]:checked').value;\n                const pageSize = document.getElementById('pageSize').value;\n                const margin = parseInt(document.getElementById('margin').value);\n                \n                \/\/ Set page size and orientation\n                let pageWidth, pageHeight;\n                switch(pageSize) {\n                    case 'a4':\n                        pageWidth = 210;\n                        pageHeight = 297;\n                        break;\n                    case 'letter':\n                        pageWidth = 216;\n                        pageHeight = 279;\n                        break;\n                    case 'legal':\n                        pageWidth = 216;\n                        pageHeight = 356;\n                        break;\n                }\n                \n                if (orientation === 'landscape') {\n                    [pageWidth, pageHeight] = [pageHeight, pageWidth];\n                }\n                \n                \/\/ Create PDF document\n                const doc = new jsPDF({\n                    orientation: orientation,\n                    unit: 'mm',\n                    format: pageSize\n                });\n                \n                \/\/ Process images one by one with progress tracking\n                for (let i = 0; i < uploadedFiles.length; i++) {\n                    const file = uploadedFiles[i];\n                    \n                    \/\/ Update progress\n                    const progress = ((i + 1) \/ uploadedFiles.length) * 100;\n                    updateProgress(progress);\n                    loadingText.textContent = `Converting image ${i + 1} of ${uploadedFiles.length}...`;\n                    \n                    \/\/ Create a promise to handle image loading\n                    await new Promise((resolve, reject) => {\n                        const img = new Image();\n                        img.onload = function() {\n                            try {\n                                \/\/ Add new page if not the first image\n                                if (i > 0) {\n                                    doc.addPage();\n                                }\n                                \n                                const imgWidth = img.width;\n                                const imgHeight = img.height;\n                                \n                                \/\/ Calculate dimensions to fit the page with margins\n                                const contentWidth = pageWidth - (margin * 2);\n                                const contentHeight = pageHeight - (margin * 2);\n                                \n                                let width = contentWidth;\n                                let height = (imgHeight * contentWidth) \/ imgWidth;\n                                \n                                if (height > contentHeight) {\n                                    height = contentHeight;\n                                    width = (imgWidth * contentHeight) \/ imgHeight;\n                                }\n                                \n                                const x = (pageWidth - width) \/ 2;\n                                const y = (pageHeight - height) \/ 2;\n                                \n                                \/\/ Add image to PDF\n                                doc.addImage(img, 'JPEG', x, y, width, height);\n                                resolve();\n                            } catch (error) {\n                                reject(error);\n                            }\n                        };\n                        \n                        img.onerror = function() {\n                            reject(new Error(`Failed to load image: ${file.file.name}`));\n                        };\n                        \n                        img.src = file.dataUrl;\n                    });\n                }\n                \n                \/\/ Save the PDF\n                doc.save('converted.pdf');\n                showLoading(false);\n            } catch (error) {\n                console.error('Error converting images to PDF:', error);\n                alert('Error converting images to PDF. Please try again.');\n                showLoading(false);\n            }\n        }\n\n        \/\/ Convert PDF to JPG images\n        function convertPdfToJpg() {\n            if (uploadedFiles.length === 0) {\n                alert('No PDF pages to convert.');\n                return;\n            }\n            \n            showLoading(true, 'Preparing JPG files...');\n            \n            \/\/ Use setTimeout to allow the UI to update before the heavy processing\n            setTimeout(() => {\n                if (uploadedFiles.length === 1) {\n                    \/\/ Single page - download directly\n                    const link = document.createElement('a');\n                    link.href = uploadedFiles[0].dataUrl;\n                    link.download = uploadedFiles[0].fileName;\n                    link.click();\n                    showLoading(false);\n                } else {\n                    \/\/ Multiple pages - create a ZIP file\n                    const zip = new JSZip();\n                    \n                    uploadedFiles.forEach((page, index) => {\n                        \/\/ Convert data URL to blob\n                        const blob = dataURLToBlob(page.dataUrl);\n                        zip.file(page.fileName, blob);\n                    });\n                    \n                    zip.generateAsync({ type: 'blob' }).then(content => {\n                        saveAs(content, 'converted-pages.zip');\n                        showLoading(false);\n                    });\n                }\n            }, 100);\n        }\n\n        \/\/ Helper function to convert data URL to blob\n        function dataURLToBlob(dataURL) {\n            const parts = dataURL.split(';base64,');\n            const contentType = parts[0].split(':')[1];\n            const raw = window.atob(parts[1]);\n            const rawLength = raw.length;\n            const uInt8Array = new Uint8Array(rawLength);\n            \n            for (let i = 0; i < rawLength; ++i) {\n                uInt8Array[i] = raw.charCodeAt(i);\n            }\n            \n            return new Blob([uInt8Array], { type: contentType });\n        }\n\n        \/\/ Toggle dark mode\n        function toggleDarkMode() {\n            document.body.classList.toggle('dark-mode');\n            darkModeToggle.textContent = document.body.classList.contains('dark-mode') ? '\u2600\ufe0f' : '\ud83c\udf19';\n        }\n\n        \/\/ Show\/hide loading indicator\n        function showLoading(show, text = 'Converting files, please wait...') {\n            loading.style.display = show ? 'flex' : 'none';\n            loadingText.textContent = text;\n            if (!show) {\n                updateProgress(0);\n            }\n        }\n\n        \/\/ Update progress bar\n        function updateProgress(percent) {\n            progressBar.style.width = percent + '%';\n        }\n    <\/script>\n<\/body>\n<\/html><\/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 <a href=\"https:\/\/shopify.pxf.io\/AWzz5D\" data-type=\"link\" data-id=\"https:\/\/shopify.pxf.io\/AWzz5D\" target=\"_blank\" rel=\"noopener\">Shopifying<\/a> 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\/pt\/wp-json\/wp\/v2\/pages\/3096","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/comments?post=3096"}],"version-history":[{"count":0,"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/pages\/3096\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/media\/3454"}],"wp:attachment":[{"href":"https:\/\/yamuparkoti.com\/pt\/wp-json\/wp\/v2\/media?parent=3096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}