<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>Convert JPG to PDF Online Free - JPG Converter | jedok.com</title> <meta name="description" content="Convert JPG to PDF online in seconds with jedok - free, secure JPG converter. Upload a .jpg file and save as TO without installing any software."> <link rel="canonical" href="https://jedok.com/converter/jpg-to-pdf" /> <meta property="og:title" content="Convert JPG to PDF Online Free - JPG Converter - jedok.com"> <meta property="og:description" content="Convert JPG to PDF online in seconds with jedok - free, secure JPG converter. Upload a .jpg file and save as TO without installing any software."> <meta property="og:url" content="https://jedok.com/converter/jpg-to-pdf"> <meta property="og:type" content="website"> <meta property="og:image" content="https://jedok.com/jedok-og-image.jpg" /> <meta property="og:image:width" content="1200" /> <meta property="og:image:height" content="630" /> <meta property="og:image:type" content="image/jpeg" /> <meta name="twitter:card" content="summary_large_image"> <script type="application/ld+json"> { "@context":"https://schema.org", "@type":"SoftwareApplication", "name":"Convert JPG to PDF Online Free - JPG Converter - jedok.com", "applicationCategory":"UtilitiesApplication", "operatingSystem":"Web", "description":"Convert JPG to PDF online in seconds with jedok - free, secure JPG converter. Upload a .jpg file and save as TO without installing any software.", "offers": {"@type":"Offer","price":"0","priceCurrency":"USD"}, "url":"https://jedok.com/converter/jpg-to-pdf" } </script> <script type="application/ld+json"> { "@context":"https://schema.org", "@type":"WebSite", "name":"JeDok", "url":"https://jedok.com/converter/jpg-to-pdf", "potentialAction":{"@type":"SearchAction","target":"https://jedok.com/formats/{format}","query-input":"required name=format"} } </script> <!-- ✅ Performance: Preconnect to CDNs --> <link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin> <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin> <link rel="preconnect" href="https://code.jquery.com" crossorigin> <link rel="preconnect" href="https://www.googletagmanager.com" crossorigin> <!-- ✅ CSS --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" defer crossorigin> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" defer crossorigin> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" defer crossorigin> <!-- ✅ Favicons --> <link rel="icon" type="image/png" sizes="32x32" href="/favicon.png"> <link rel="icon" type="image/png" sizes="64x64" href="/favicon.png"> <link rel="apple-touch-icon" href="/favicon.png"> <!-- ✅ Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-K6FQF5LSG9" type="5af166b0d89d5b77817c3979-text/javascript"></script> <script type="5af166b0d89d5b77817c3979-text/javascript"> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-K6FQF5LSG9', { anonymize_ip: true }); </script> <!-- ✅ App Config --> <script type="5af166b0d89d5b77817c3979-text/javascript"> window.APP_CONFIG = Object.freeze({ apiBaseUrl: "https://api.jedok.com/api", appBaseUrl: "https://jedok.com" }); </script> <!-- Your site styles --> <script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="5af166b0d89d5b77817c3979-|49"></script><link rel="preload" href="/css/site.css?v=85IF2Oi2NMeLED_gSW3dFrZjKfMm5lOm5QjDu-HU9c4" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript b-2u57mvn44z><link rel="stylesheet" href="/css/site.css?v=85IF2Oi2NMeLED_gSW3dFrZjKfMm5lOm5QjDu-HU9c4"></noscript> <!-- Tiny critical inline CSS --> <style> /* Base + top bar */ body { font-family: "Open Sans",Arial,sans-serif; font-size: .875rem; color: #333; margin-bottom: 5px } .top-bar { background: #333; color: #fff; font-size: 14px; padding: 5px 0 } .navbar-brand { font-weight: 700; font-size: 24px } </style> <!-- jQuery: must load before inline scripts --> <script src="https://code.jquery.com/jquery-3.6.4.min.js" crossorigin type="5af166b0d89d5b77817c3979-text/javascript"></script> <link rel="preconnect" href="https://pagead2.googlesyndication.com" crossorigin> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0313867933438659" crossorigin="anonymous" type="5af166b0d89d5b77817c3979-text/javascript"></script> </head> <body> <!-- Top Bar --> <div b-2u57mvn44z class="top-bar text-center"> <span b-2u57mvn44z> <a b-2u57mvn44z rel="nofollow" href="https://fileproinfo.com/free-online-viewer" class="text-white" target="_blank" title="Free online file viewer">Online File Viewer</a> | <a b-2u57mvn44z class="text-white" href="/contact">[Contact for this Slot]</a> </span> </div> <!-- Navbar --> <nav b-2u57mvn44z class="navbar navbar-expand-lg navbar-light bg-light shadow-sm"> <div b-2u57mvn44z class="container"> <a b-2u57mvn44z class="navbar-brand text-danger" href="/"><img b-2u57mvn44z src="/jedok-logo.png" width="130" alt="jedok" /></a> <button b-2u57mvn44z class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span b-2u57mvn44z class="navbar-toggler-icon"></span> </button> <div b-2u57mvn44z class="collapse navbar-collapse" id="navbarNav"> <ul b-2u57mvn44z class="navbar-nav ms-auto align-items-lg-center"> <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/">Home</a></li> <!-- Mega menu --> <li b-2u57mvn44z class="nav-item dropdown megamenu position-static"> <a b-2u57mvn44z class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false"> Convert </a> <!-- Full-width on desktop, stacked on mobile --> <div b-2u57mvn44z class="dropdown-menu w-100 mt-0 border-0 shadow"> <div b-2u57mvn44z class="container py-3"> <div b-2u57mvn44z class="row gy-4"> <!-- Col 1 (11 items) --> <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3"> <ul b-2u57mvn44z class="list-unstyled mb-0"> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/3d-file-converter"><i b-2u57mvn44z class="bi bi-box"></i><span b-2u57mvn44z>3D Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/archive-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-zip"></i><span b-2u57mvn44z>Archive Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/audio-file-converter"><i b-2u57mvn44z class="bi bi-music-note"></i><span b-2u57mvn44z>Audio Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/backup-file-converter"><i b-2u57mvn44z class="bi bi-cloud-arrow-up"></i><span b-2u57mvn44z>Backups Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/cad-file-converter"><i b-2u57mvn44z class="bi bi-dice-3"></i><span b-2u57mvn44z>CAD Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/camera-raw-file-converter"><i b-2u57mvn44z class="bi bi-camera"></i><span b-2u57mvn44z>Camera Raw File Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/common-file-converter"><i b-2u57mvn44z class="bi bi-collection"></i><span b-2u57mvn44z>Common Files Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/compression-file-converter"><i b-2u57mvn44z class="bi bi-arrows-collapse"></i><span b-2u57mvn44z>Compression Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/data-file-converter"><i b-2u57mvn44z class="bi bi-file-binary"></i><span b-2u57mvn44z>Data File Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/database-file-converter"><i b-2u57mvn44z class="bi bi-database"></i><span b-2u57mvn44z>Database Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/developer-file-converter"><i b-2u57mvn44z class="bi bi-code-slash"></i><span b-2u57mvn44z>Developer Files Converter</span></a></li> </ul> </div> <!-- Col 2 (11 items) --> <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3"> <ul b-2u57mvn44z class="list-unstyled mb-0"> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/diagram-file-converter"><i b-2u57mvn44z class="bi bi-diagram-3"></i><span b-2u57mvn44z>Diagram Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/disk-image-file-converter"><i b-2u57mvn44z class="bi bi-device-hdd"></i><span b-2u57mvn44z>Disk Image Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/document-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-text"></i><span b-2u57mvn44z>Document Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/ebook-file-converter"><i b-2u57mvn44z class="bi bi-book"></i><span b-2u57mvn44z>eBook Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/email-file-converter"><i b-2u57mvn44z class="bi bi-envelope"></i><span b-2u57mvn44z>Email Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/excel-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-excel"></i><span b-2u57mvn44z>Excel Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/executable-file-converter"><i b-2u57mvn44z class="bi bi-terminal"></i><span b-2u57mvn44z>Executable File Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/font-file-converter"><i b-2u57mvn44z class="bi bi-type"></i><span b-2u57mvn44z>Font Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/game-file-converter"><i b-2u57mvn44z class="bi bi-controller"></i><span b-2u57mvn44z>Game Files Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/gis-file-converter"><i b-2u57mvn44z class="bi bi-geo-alt"></i><span b-2u57mvn44z>GIS Converter</span></a></li> </ul> </div> <!-- Col 3 (11 items) --> <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3"> <ul b-2u57mvn44z class="list-unstyled mb-0"> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/image-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-image"></i><span b-2u57mvn44z>Image Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/misc-file-converter"><i b-2u57mvn44z class="bi bi-three-dots"></i><span b-2u57mvn44z>Misc Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/note-file-converter"><i b-2u57mvn44z class="bi bi-journal-text"></i><span b-2u57mvn44z>One Note Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/outlook-file-converter"><i b-2u57mvn44z class="bi bi-envelope-open"></i><span b-2u57mvn44z>Outlook Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/page-description-language-file-converter"><i b-2u57mvn44z class="bi bi-code-slash"></i><span b-2u57mvn44z>Page Description Language</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/page-layout-file-converter"><i b-2u57mvn44z class="bi bi-layout-text-window"></i><span b-2u57mvn44z>Page Layout Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/pdf-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-pdf"></i><span b-2u57mvn44z>PDF Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/plugin-file-converter"><i b-2u57mvn44z class="bi bi-plug"></i><span b-2u57mvn44z>Plugin Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/presentation-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-ppt"></i><span b-2u57mvn44z>Presentation Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/project-file-converter"><i b-2u57mvn44z class="bi bi-kanban"></i><span b-2u57mvn44z>Project Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/project-management-file-converter"><i b-2u57mvn44z class="bi bi-kanban-fill"></i><span b-2u57mvn44z>Project Management Converter</span></a></li> </ul> </div> <!-- Col 4 (10 items) --> <div b-2u57mvn44z class="col-12 col-md-6 col-lg-3 d-none d-lg-block"> <ul b-2u57mvn44z class="list-unstyled mb-0"> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/publisher-file-converter"><i b-2u57mvn44z class="bi bi-journal-richtext"></i><span b-2u57mvn44z>Publisher Files Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/raster-image-file-converter"><i b-2u57mvn44z class="bi bi-image"></i><span b-2u57mvn44z>Raster Image Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/settings-file-converter"><i b-2u57mvn44z class="bi bi-gear"></i><span b-2u57mvn44z>Settings File Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/spreadsheet-file-converter"><i b-2u57mvn44z class="bi bi-table"></i><span b-2u57mvn44z>Spreadsheet Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/system-file-converter"><i b-2u57mvn44z class="bi bi-cpu"></i><span b-2u57mvn44z>System Files Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/text-file-converter"><i b-2u57mvn44z class="bi bi-text-paragraph"></i><span b-2u57mvn44z>Text File Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/vector-image-file-converter"><i b-2u57mvn44z class="bi bi-bezier"></i><span b-2u57mvn44z>Vector Image Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/video-file-converter"><i b-2u57mvn44z class="bi bi-camera-video"></i><span b-2u57mvn44z>Video Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/web-file-converter"><i b-2u57mvn44z class="bi bi-globe"></i><span b-2u57mvn44z>Web Files Converter</span></a></li> <li b-2u57mvn44z><a b-2u57mvn44z class="dropdown-item d-flex align-items-center gap-2" href="/converters/word-processing-file-converter"><i b-2u57mvn44z class="bi bi-file-earmark-richtext"></i><span b-2u57mvn44z>Word Processing Converter</span></a></li> </ul> </div> </div> </div> </div> </li> <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/formats">Formats</a></li> <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/blog/">Blog</a></li> <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="https://docpose.cloud/api-docs" target="_blank">API</a></li> <li b-2u57mvn44z class="nav-item"><a b-2u57mvn44z class="nav-link" href="/help">Help</a></li> <li b-2u57mvn44z class="nav-item"> <a b-2u57mvn44z class="nav-link" href="/download"> My Files <span b-2u57mvn44z class="ui-badge text-red"><strong b-2u57mvn44z id="jobsCountLabel">0</strong></span> </a> </li> <li b-2u57mvn44z class="nav-item auth-buttons ms-lg-3 mt-3 mt-lg-0"> <a b-2u57mvn44z href="/login" class="btn btn-outline-secondary me-2">Login</a> <a b-2u57mvn44z href="/signup" class="btn btn-primary">Sign Up</a> </li> </ul> </div> </div> </nav> <div b-2u57mvn44z class="container"> <main b-2u57mvn44z role="main" class="pb-3"> <!-- fallback if a view doesn’t use the layout or ViewBag is empty --> <!-- Include SignalR Library --><script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/7.0.5/signalr.min.js" type="5af166b0d89d5b77817c3979-text/javascript"></script> <!-- Drop effect overlay --><div id="dropOverlay" class="drag-over"> <div class="drop-content"> <svg width="80" height="80" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="12" y1="5" x2="12" y2="19"></line> <line x1="5" y1="12" x2="19" y2="12"></line> </svg> <p>Drop files here</p> </div></div><div class="container mt-5"> <h1 class="text-center text-red"> JPG to PDF Converter </h1> <h2 class="text-center">Welcome to the most advanced free online jpg to pdf converter </h2> <p class="text-center">Convert JPG to PDF online in seconds with jedok - free, secure JPG converter. Upload a .jpg file and save as TO without installing any software.</p> <form id="convertForm"> <!-- Drag-and-Drop Zone --> <div id="dropZone"> <button type="button" class="file-upload-btn" onclick="if (!window.__cfRLUnblockHandlers) return false; document.getElementById('fileInput').click()" data-cf-modified-5af166b0d89d5b77817c3979-="">Select Files</button> <input type="file" id="fileInput" multiple /> <div class="file-source-caption"><span class="security-icon" data-placement="left" title="All your data is always protected and under your control. Learn more about technical and organizational security measures we take on the Security page."></span><span>Drop max 5 files here. 25 MB maximum file size or <a style="color:white;" href="/signup">Sign Up</a> (free).</span></div> </div> <div class="text-center mt-2"><span class="text-green">All your data is always protected and under your control. Learn more about technical and organizational security measures we take on the <a href="/security">Security</a> page.</span> </div> <div class="text-center mt-2">Powered by <a href="https://docpose.cloud" target="_blank">Docpose.Cloud</a> API's, 200+ <a href="/formats">formats</a> supported.</div> <!-- fallback if a view doesn’t use the layout or ViewBag is empty --> <div class="adb d-md-block"> <!-- jedoktop responsive --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-0313867933438659" data-ad-slot="1439225974" data-ad-format="auto" data-full-width-responsive="true"></ins> <script type="5af166b0d89d5b77817c3979-text/javascript"> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <!-- File list --> <div id="file-list-container" class="mt-3 container"> <ul id="file-list" class="list-group"></ul> </div> <!-- Convert button --> <div class="mt-3 container text-center d-none" id="butonsDiv"> <div class="file-source-caption" id="myFilesMessage">Files will be stored for 24 hours. Go to <a class="text-red" href="/download/">My Files</a> to delete them manually.</div> <button id="convertButton" type="submit" style="padding: 12px 24px!important; font-size: 25px!important;" class="btn btn-success w-50 mt-3">Convert</button> <!-- Clear All button (Initially Hidden) --> <button id="clearAllButton" type="button" style="padding: 12px 24px!important; font-size: 25px!important;" class="btn btn-info w-50 mt-3 d-none" onclick="if (!window.__cfRLUnblockHandlers) return false; resetForm()" data-cf-modified-5af166b0d89d5b77817c3979-="">Clear All</button> </div> </form> <!-- Status message --> <p id="message" class="text-center mt-3"></p> </div> <section class="container my-5"> <div class="row"> <div class="col-lg-6"> <div class="card text-bg-light"> <div class="card-body"> <h2><span class="badge bg-warning text-dark fs-6">JPG</span> </h2> <h3 id="format-title1" class="mt-3"></h3> <p id="format-desc1" class="info-content centered-box"></p> <div style="text-align:right"><a href="/converter/jpg">Convert to JPG</a></div> </div> </div> </div> <div class="col-lg-6"> <div class="card text-bg-light"> <div class="card-body"> <h2><span class="badge bg-warning text-dark fs-6">PDF</span> </h2> <h3 id="format-title2" class="mt-3"></h3> <p id="format-desc2" class="info-content centered-box"></p> <div style="text-align:right"><a href="/converter/pdf">PDF Converter</a></div> </div> </div> </div> </div> </section> <section class="container text-center my-5"> <div class="steps text-center mt-5"> <h2>How to convert JPG to TO to PDF</h2> <div class="row"> <div class="col-lg-4"> <div class="card text-bg-light"> <div class="step-label badge bg-info text-dark fs-6">STEP 1</div> <div class="card-body"> <h3>Upload jpg-file(s)</h3> <p>Select files from Computer, or by dragging it on the page.</p> </div> </div> </div> <div class="col-lg-4"> <div class="card text-bg-light"> <div class="step-label badge bg-warning text-dark fs-6">STEP 2</div> <div class="card-body"> <h3>Choose "to pdf"</h3> <p>Choose pdf or any other format you need as a result (many formats supported)</p> </div> </div> </div> <div class="col-lg-4"> <div class="card text-bg-light"> <div class="step-label badge bg-success text-dark fs-6">STEP 3</div> <div class="card-body"> <h3>Download your pdf</h3> <p>Let the file convert and you can download your pdf file right afterwards</p> </div> </div> </div> </div> </div> </section> <section class="my-4" aria-labelledby="top15-conversions"> <h2 id="top15-conversions" class="h5 mb-3 text-center">Supported Conversions</h2> <div class="row g-4"> <div class="col-md-6"> <div class="table-responsive"> <table class="table table-striped"> <thead class="table-light"> <tr> <th style="width: 3rem;">#</th> <th>Convert from JPG</th> <th class="text-end">Rating</th> </tr> </thead> <tbody id="top15-from"></tbody> </table> </div> </div> <div class="col-md-6"> <div class="table-responsive"> <table class="table table-striped"> <thead class="table-light"> <tr> <th style="width: 3rem;">#</th> <th>Convert to JPG</th> <th class="text-end">Rating</th> </tr> </thead> <tbody id="top15-to"></tbody> </table> </div> </div> </div> <div class="mt-3 container text-center"> <a class="btn btn-info mt-3" href="/formats/jpg">View All JPG Supported Conversions</a> </div> </section> <style> .table thead th { white-space: nowrap; } .table td a { text-decoration: none; font-weight: 600; } </style> <script defer type="5af166b0d89d5b77817c3979-text/javascript"> (function () { // Fetch format meta (description/shortdescription) fetch("/supported-formats/jpg") .then(r => r.json()) .then(items => { // Try multiple casings of property names const meta = items.find(x => (x.formatCode ?? x.FormatCode ?? x.formatcode ?? "").toLowerCase() === "jpg"); if(meta){ document.getElementById("format-title1").innerText = (meta.description ?? meta.Description ?? "") || ""; document.getElementById("format-desc1").innerText = (meta.shortDescription ?? meta.ShortDescription ?? "") || ""; } }).catch(()=>{}); // Fetch format meta (description/shortdescription) fetch("/supported-formats/pdf") .then(r => r.json()) .then(items => { // Try multiple casings of property names const meta = items.find(x => (x.formatCode ?? x.FormatCode ?? x.formatcode ?? "").toLowerCase() === "pdf"); if(meta){ document.getElementById("format-title2").innerText = (meta.description ?? meta.Description ?? "") || ""; document.getElementById("format-desc2").innerText = (meta.shortDescription ?? meta.ShortDescription ?? "") || ""; } }).catch(()=>{}); // source format = the first part of "pdf-docx" const src = "jpg".toLowerCase().replace(/^\./,''); if (!src) return; const norm = s => (s||"").toString().trim().replace(/^\./,'').toLowerCase(); const up = s => norm(s).toUpperCase(); // Stable sort helper (keeps API order when no votes/ratings) const rank = (arr, pickVotes, pickRating) => { return [...arr].sort((a,b) => { const va = Number(pickVotes(a) || 0), vb = Number(pickVotes(b) || 0); if (vb !== va) return vb - va; const ra = Number(pickRating(a) || 0), rb = Number(pickRating(b) || 0); if (rb !== ra) return rb - ra; return 0; // keep original order if equal }).slice(0, 15); }; fetch(`/supported-conversions/${src}`) .then(r => r.json()) .then(data => { const from = data.convertFrom || data.ConvertFrom || []; const to = data.convertTo || data.ConvertTo || []; // rank by votes -> rating const topFrom = rank( from, r => r.ratingCount ?? r.RatingCount, r => r.ratingValue ?? r.RatingValue ); const topTo = rank( to, r => r.ratingCount ?? r.RatingCount, r => r.ratingValue ?? r.RatingValue ); // Render rows const renderRows = (rows, elId, linkBuilder) => { const tbody = document.getElementById(elId); tbody.innerHTML = ""; rows.forEach((row, idx) => { const f = norm(row.fromFormat ?? row.FromFormat); const t = norm(row.toFormat ?? row.ToFormat); const rating = row.ratingValue ?? row.RatingValue; const votes = row.ratingCount ?? row.RatingCount; const aHref = linkBuilder(f, t); const aText = `${up(f)} to ${up(t)}`; const tr = document.createElement("tr"); tr.innerHTML = ` <td>${idx + 1}</td> <td><a href="/converter/${aHref}" title="${aText}">${aText}</a></td> <td class="text-end">${rating ? rating : ""} ${votes ? `(${votes} votes)` : ""}</td> `; tbody.appendChild(tr); }); }; // For "Convert from SRC": rows already shaped as SRC -> X renderRows(topFrom, "top15-from", (f,t) => `${f}-to-${t}`); // For "Convert to SRC": rows shaped as X -> SRC renderRows(topTo, "top15-to", (f,t) => `${f}-to-${t}`); // Emit JSON-LD (two ItemLists) const ld = [ { "@context":"https://schema.org", "@type":"ItemList", "name": `Convert from ${src.toUpperCase()} (Top 15)`, "itemListElement": topFrom.map((r,i)=>({ "@type":"ListItem", "position": i+1, "url": `https://jedok.com/${norm(r.fromFormat ?? r.FromFormat)}-${norm(r.toFormat ?? r.ToFormat)}`, "name": `${up(r.fromFormat ?? r.FromFormat)} to ${up(r.toFormat ?? r.ToFormat)}` })) }, { "@context":"https://schema.org", "@type":"ItemList", "name": `Convert to ${src.toUpperCase()} (Top 15)`, "itemListElement": topTo.map((r,i)=>({ "@type":"ListItem", "position": i+1, "url": `https://jedok.com/${norm(r.fromFormat ?? r.FromFormat)}-${norm(r.toFormat ?? r.ToFormat)}`, "name": `${up(r.fromFormat ?? r.FromFormat)} to ${up(r.toFormat ?? r.ToFormat)}` })) } ]; const s = document.createElement("script"); s.type = "application/ld+json"; s.text = JSON.stringify(ld); document.head.appendChild(s); }) .catch(console.error); })(); </script> <script defer type="5af166b0d89d5b77817c3979-text/javascript"> const maxFilesAllowed = 3; const maxFileSizeMB = 25; let selectedFiles = []; const convertButton = document.getElementById("convertButton"); function showWarningMessage(message) { const el = document.getElementById('message'); if (!el) { console.warn('#message not found'); return; } el.innerHTML = message; el.classList.remove('d-none'); // unhide if it was hidden el.classList.add('alert', 'alert-danger'); // style as Bootstrap alert } // Function to reset warning message function resetWarningMessage() { const msgElement = document.getElementById("message"); msgElement.textContent = ""; msgElement.classList.remove("text-danger"); } // File input change event document.getElementById("fileInput").addEventListener("change", (e) => { let newFiles = Array.from(e.target.files).filter(file => file.size <= maxFileSizeMB * 1024 * 1024); if (selectedFiles.length + newFiles.length > maxFilesAllowed) { showWarningMessage(`You can only upload a maximum of ${maxFilesAllowed} files.`); return; } document.getElementById("butonsDiv").classList.remove("d-none"); //resetWarningMessage(); selectedFiles = selectedFiles.concat(newFiles); updateFileList(); }); // Drag-and-drop event listeners let dropOverlay = $("#dropOverlay"); // Show overlay when dragging $(document).on("dragenter dragover", function (e) { e.preventDefault(); e.stopPropagation(); dropOverlay.show(); }); // Hide overlay when leaving $(document).on("dragleave", function (e) { if (e.relatedTarget === null) { dropOverlay.hide(); } }); // Handle file drop $(document).on("drop", function (e) { e.preventDefault(); dropOverlay.hide(); let newFiles = Array.from(e.originalEvent.dataTransfer.files).filter(file => file.size <= maxFileSizeMB * 1024 * 1024); if (selectedFiles.length + newFiles.length > maxFilesAllowed) { showWarningMessage(`You can only upload a maximum of ${maxFilesAllowed} files.`); return; } document.getElementById("butonsDiv").classList.remove("d-none"); // Hide Convert button //resetWarningMessage(); selectedFiles = selectedFiles.concat(newFiles); updateFileList(); }); document.getElementById("convertForm").addEventListener("submit", async function (e) { e.preventDefault(); if(document.getElementById("message").innerHTML.includes("file conversion limit")) { alert(document.getElementById("message").textContent); return; } if (selectedFiles.length === 0) return; var now = new Date(); var batchId = now.getHours() * 100 + now.getMinutes(); // Combine hour and minute //console.log("batchId: " + batchId); convertButton.textContent = "Converting..."; convertButton.disabled = true; selectedFiles.forEach(async (file, index) => { const badgeStatus = document.getElementById(`badgeStatus-${index}`); const progressBar = document.getElementById(`progressBar-${index}`); if(badgeStatus.textContent === "Ready"){ const outputFormat = document.getElementById(`outputFormat-${index}`).value; if (!outputFormat) { document.getElementById("message").textContent = `Please select an output format for ${file.name}`; document.getElementById("message").classList.add("text-danger"); return; } const formData = new FormData(); formData.append("file", file); formData.append("outputFormat", outputFormat); formData.append("batchId", batchId); const fileItem = document.querySelector(`#file-list li:nth-child(${index + 1})`); badgeStatus.textContent = "Uploading"; progressBar.style.width = "10%"; try { const data = await postFormDataWithProgress("/Conversion/ConvertFile", formData, (pct) => { progressBar.style.width = pct + "%"; }); // try { // const response = await fetch("/Conversion/ConvertFile", { // method: "POST", // body: formData, // }); // progressBar.style.width = "40%"; // badgeStatus.textContent = "Converting"; // if (!response.ok) throw new Error(`Failed to convert file: ${file.name}`); // const data = await response.json(); // const jobId = data.jobId; // fileItem.setAttribute("data-job-id", jobId); // } // catch (error) { // //console.error(error); // } // Upload finished; backend accepted the job progressBar.style.width = "40%"; badgeStatus.textContent = "Converting"; // Expect JSON like { jobId: 12345 } const jobId = data.jobId ?? data.JobId ?? data.id; if (!jobId) throw new Error("No jobId returned."); fileItem.setAttribute("data-job-id", jobId); //convertButton.textContent = "Convert"; convertButton.disabled = true; } catch (err) { progressBar.style.width = "100%"; progressBar.classList.add("bg-danger"); badgeStatus.classList.add("text-error"); //retryButton.classList.remove("d-none"); // Show retry button badgeStatus.textContent = "Upload failed"; convertButton.disabled = false; console.error(err); } } }); }); // 1) POST with real-time UPLOAD progress (10% → 40%) function postFormDataWithProgress(url, formData, onProgress) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("POST", url); // Upload progress xhr.upload.onprogress = (e) => { if (!e.lengthComputable) return; const uploaded = e.loaded / e.total; // 0..1 const pct = Math.min(40, Math.max(10, 10 + Math.round(uploaded * 30))); // map to 10..40 onProgress?.(pct); }; xhr.onload = () => { if (xhr.status >= 200 && xhr.status < 300) { try { resolve(JSON.parse(xhr.responseText)); } catch { resolve(xhr.responseText); } } else { reject(new Error(`HTTP ${xhr.status}: ${xhr.statusText}`)); } }; xhr.onerror = () => reject(new Error("Network error")); xhr.send(formData); }); } function checkAllJobsFinished() { const allJobs = document.querySelectorAll("#file-list .file-item"); let allProcessed = true; allJobs.forEach(job => { const statusMessage = job.querySelector(".ui-badge").textContent; if (!statusMessage.includes("Completed") && !statusMessage.includes("Failed")) { allProcessed = false; } }); if (allProcessed) { document.getElementById("convertButton").classList.add("d-none"); // Hide Convert button document.getElementById("clearAllButton").classList.remove("d-none"); // Show Clear All button fetchConversionsCount(); } } // Function to update file list function updateFileList() { const fileList = document.getElementById("file-list"); fileList.innerHTML = ""; selectedFiles.forEach((file, index) => { const fileItem = document.createElement("li"); fileItem.className = "file-item list-group-item d-flex flex-column flex-md-row align-items-center"; fileItem.innerHTML = ` <div class="d-flex align-items-center w-100 mb-2 mb-md-0"> <img src="/file-icon.png" alt="icon" class="file-icon me-2"> <span class="file-name-inner" title="${file.name}">${truncateFileName(file.name)}</span> <small class="text-muted ms-2 file-size">${formatFileSize(file.size)}</small> </div> <div class="output-format-container w-50 w-md-25 px-2"> <select class="form-control output-format w-100" id="outputFormat-${index}"> <option value="">Loading formats...</option> </select> </div> <div class="w-100 w-md-50 px-2 text-center"> <div class="progress w-70 my-2"> <div class="progress-bar progress-bar-striped progress-bar-animated" id="progressBar-${index}" role="progressbar" style="width: 0%;" aria-valuemin="0" aria-valuemax="100"></div> </div> <div class="ui-badge text-green" id="badgeStatus-${index}">Ready</div> </div> <div class="d-flex flex-wrap justify-content-center gap-2 mt-2 mt-md-0"> <button type="button" class="btn btn-outline-danger btn-sm btn-remove" onclick="removeFile(${index})"><i class="bi bi-x-lg"></i> </button> <a class="btn btn-primary btn-sm file-download d-none" href="#" target="_blank">Download</a> <button type="button" class="btn btn-warning btn-sm retry-job d-none" onclick="retryJob(${index})">Retry</button> </div> `; fileList.appendChild(fileItem); fetchConversionFormats(file, index); }); convertButton.disabled = selectedFiles.length === 0 || selectedFiles.length > maxFilesAllowed; } function resetForm() { location.reload(); // Reload the page to reset the form } // Remove file function function removeFile(index) { selectedFiles.splice(index, 1); updateFileList(); } // Retry Job Functionality async function retryJob(index) { const fileItem = document.querySelector(`#file-list li:nth-child(${index + 1})`); const jobId = fileItem.getAttribute("data-job-id"); const progressBar = fileItem.querySelector(".progress-bar"); const message = fileItem.querySelector(".ui-badge"); const retryButton = fileItem.querySelector(".retry-job"); if (!jobId) { //console.error("No job ID found for retry."); return; } retryButton.disabled = true; message.textContent = "Retrying conversion..."; try { const response = await fetch(window.APP_CONFIG?.apiBaseUrl + `/admin/jobs/${jobId}/retry`, { method: "POST" }); if (!response.ok) throw new Error("Failed to retry the job."); message.textContent = "Retry initiated..."; progressBar.style.width = "50%"; retryButton.classList.add("d-none"); } catch (error) { //console.error(error); message.textContent = "Retry failed."; retryButton.disabled = false; } } // SignalR Connection const connection = new signalR.HubConnectionBuilder() .withUrl((window.APP_CONFIG?.apiBaseUrl + "/").replace("/api/","") + "/jobHub") .build(); connection.start().then().catch(err => console.error("Error connecting to SignalR:", err)); connection.on("JobStatusUpdate", (jobId, status, outputFilePath) => { //console.log(`Received OUTSIDE update for Job ${jobId}: Status = ${status}, OutputFilePath = ${outputFilePath}`); // Select the correct file item based on jobId const fileItem = document.querySelector(`#file-list li[data-job-id='${jobId}']`); if (!fileItem) { //console.error(`No file item found for Job ${jobId}`); return; } const progressBar = fileItem.querySelector(".progress-bar"); const message = fileItem.querySelector(".ui-badge"); const downloadButton = fileItem.querySelector(".file-download"); const retryButton = fileItem.querySelector(".retry-job"); const outputFormatSelect = fileItem.querySelector(".output-format"); outputFormatSelect.classList.add("disabled"); message.textContent = status; if (status === "Completed") { progressBar.style.width = "100%"; downloadButton.href = (window.APP_CONFIG?.apiBaseUrl + "/").replace("/api/","") + "" + outputFilePath; downloadButton.classList.remove("d-none"); const removeButton = fileItem.querySelector(".btn-remove"); removeButton.classList.add("d-none"); } else if (status === "Failed") { progressBar.style.width = "100%"; progressBar.classList.add("bg-danger"); message.classList.add("text-error"); retryButton.classList.remove("d-none"); // Show retry button } else { progressBar.style.width = "60%"; } checkAllJobsFinished(); }); function truncateFileName(name) { if (name.length <= 24) return name; const extensionIndex = name.lastIndexOf("."); const extension = extensionIndex !== -1 ? name.substring(extensionIndex) : ""; const nameWithoutExtension = extensionIndex !== -1 ? name.substring(0, extensionIndex) : name; const firstPart = nameWithoutExtension.substring(0, 12); const lastPart = nameWithoutExtension.substring(nameWithoutExtension.length - 8); return `${firstPart}...${lastPart}${extension}`; } function formatFileSize(size) { if (size < 1024) return size + " B"; else if (size < 1024 * 1024) return (size / 1024).toFixed(2) + " KB"; else if (size < 1024 * 1024 * 1024) return (size / (1024 * 1024)).toFixed(2) + " MB"; else return (size / (1024 * 1024 * 1024)).toFixed(2) + " GB"; } async function fetchConversionFormats(file, index) { const fileExt = file.name.toLowerCase(); const outputFormatSelect = document.getElementById(`outputFormat-${index}`); // Clear the dropdown outputFormatSelect.innerHTML = '<option value="">Output format</option>'; const apiUrl = window.APP_CONFIG?.apiBaseUrl + `/conversion/formats/${encodeURIComponent(fileExt)}`; try { // Call the API to get possible conversions const response = await fetch(apiUrl); if (!response.ok) { outputFormatSelect.innerHTML = '<option value="">Failed to fetch formats</option>'; throw new Error(`Failed to fetch conversion formats. Status: ${response.status}`); } const data = await response.json(); if (data.possibleConversions.length === 0) { outputFormatSelect.innerHTML = '<option value="">No more supported</option>'; // console.log("data.possibleConversions.length: "+data.possibleConversions.length); // var option = document.createElement("option"); // option.value = "TXT"; // option.textContent = "txt".toUpperCase(); // Display in uppercase // outputFormatSelect.appendChild(option); // option = document.createElement("option"); // option.value = "PDF"; // option.textContent = "pdf".toUpperCase(); // Display in uppercase // outputFormatSelect.appendChild(option); } // Sort the possible conversions alphabetically data.possibleConversions.sort((a, b) => a.localeCompare(b)); // Populate the dropdown with sorted conversions data.possibleConversions.forEach(format => { const options = document.createElement("option"); options.value = format; options.textContent = format.toUpperCase(); // Display in uppercase outputFormatSelect.appendChild(options); }); } catch (error) { //console.error("Error fetching formats:", error); outputFormatSelect.innerHTML = '<option value="">Error loading formats</option>'; } } </script> </main> </div> <footer b-2u57mvn44z class="bg-dark text-light py-4"> <div b-2u57mvn44z class="container"> <div b-2u57mvn44z class="row"> <!-- Left Column --> <div b-2u57mvn44z class="col-md-3"> <h6 b-2u57mvn44z class="fw-bold">About</h6> <ul b-2u57mvn44z class="list-unstyled"> <li b-2u57mvn44z><a b-2u57mvn44z href="/about" class="text-light text-decoration-none">About</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/blog" class="text-light text-decoration-none">Blog</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/security" class="text-light text-decoration-none">Security</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/formats" class="text-light text-decoration-none">Formats</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/help" class="text-light text-decoration-none">Help</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/help" class="text-light text-decoration-none">Contact</a></li> </ul> </div> <!-- Middle Column --> <div b-2u57mvn44z class="col-md-3"> <h6 b-2u57mvn44z class="fw-bold">Converters</h6> <ul b-2u57mvn44z class="list-unstyled"> <li b-2u57mvn44z><a b-2u57mvn44z href="/video-file-converter" class="text-light text-decoration-none">Video Converter</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/audio-file-converter" class="text-light text-decoration-none">Audio Converter</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/document-file-converter" class="text-light text-decoration-none">Document Converter</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/image-file-converter" class="text-light text-decoration-none">Image Converter</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/youtube-file-converter" class="text-light text-decoration-none">YouTube Converter</a></li> </ul> </div> <!-- Right Column --> <div b-2u57mvn44z class="col-md-3"> <h6 b-2u57mvn44z class="fw-bold">Increase Daily Limits</h6> <ul b-2u57mvn44z class="list-unstyled"> <li b-2u57mvn44z><a b-2u57mvn44z href="/signup" class="text-light text-decoration-none">Go Ad Free</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/signup" class="text-light text-decoration-none">Free Register</a></li> <li b-2u57mvn44z><a b-2u57mvn44z href="/login" class="text-light text-decoration-none">Login</a></li> </ul> </div> <!-- Right Column --> <div b-2u57mvn44z class="col-md-3"> <h6 b-2u57mvn44z class="fw-bold">Developers API</h6> <ul b-2u57mvn44z class="list-unstyled"> <li b-2u57mvn44z><a b-2u57mvn44z href="https://docpose.cloud/api-docs" target="_blank" class="text-light text-decoration-none">API Docs</a></li> </ul> </div> </div> <hr b-2u57mvn44z class="bg-secondary"> <div b-2u57mvn44z class="row text-center"> <div b-2u57mvn44z class="col-md-12"> <p b-2u57mvn44z class="mb-0">© 2025 JeDok.com Ltd. All rights reserved. | <a b-2u57mvn44z href="/terms" class="text-light text-decoration-none">Terms of Use</a> | <a b-2u57mvn44z href="/privacy" class="text-light text-decoration-none">Privacy Policy</a></p> </div> </div> </div> </footer> <!-- Rest can be deferred --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" defer crossorigin type="5af166b0d89d5b77817c3979-text/javascript"></script> <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11" defer type="5af166b0d89d5b77817c3979-text/javascript"></script> <script defer type="5af166b0d89d5b77817c3979-text/javascript"> async function fetchConversionsCount() { const jobsCountLabel = document.getElementById("jobsCountLabel"); jobsCountLabel.innerHTML = ""; $.ajax({ url: "/Conversion/GetJobsCount", type: "GET", dataType: "json", success: function (jobsCount) { jobsCountLabel.innerHTML = jobsCount; if (jobsCount >= 5) { showWarningMessage('You’ve reached today’s file conversion limit (5). To increase your limit, please <a href="/signup" class="alert-link">sign up</a>, or try again tomorrow.'); } }, error: function (xhr) { //console.error("Error fetching jobs count:", xhr); jobsCountLabel.innerHTML = "0"; } }); } fetchConversionsCount(); </script> <script type="5af166b0d89d5b77817c3979-text/javascript"> function animateContinuousCounter(id, startValue, incrementPerSecond = 60, minDelay = 1000, maxDelay = 4000) { const el = document.getElementById(id); let currentValue = startValue; let lastUpdate = performance.now(); let nextIncrementTime = lastUpdate + getRandomDelay(); function format(n) { return n.toLocaleString(undefined, { maximumFractionDigits: 2 }); } function getRandomDelay() { return Math.random() * (maxDelay - minDelay) + minDelay; // ms } function update(currentTime) { if (currentTime >= nextIncrementTime) { // Time to increment currentValue += incrementPerSecond * 2; // Double tick effect el.textContent = format(currentValue); // Schedule next increment nextIncrementTime = currentTime + getRandomDelay(); } requestAnimationFrame(update); } requestAnimationFrame(update); } </script> <script src="https://protagcdn.com/d/jedok.com.js" async type="5af166b0d89d5b77817c3979-text/javascript"></script> <!-- Why Register Popup --> <div b-2u57mvn44z class="modal fade" id="whyRegisterModal" tabindex="-1" aria-labelledby="whyRegisterLabel" aria-hidden="true"> <div b-2u57mvn44z class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable"> <div b-2u57mvn44z class="modal-content rounded-3 shadow"> <div b-2u57mvn44z class="modal-header border-0"> <h2 b-2u57mvn44z class="h4 modal-title mx-auto" id="whyRegisterLabel">Why Register on Jedok?</h2> <button b-2u57mvn44z type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div b-2u57mvn44z class="modal-body"> <div b-2u57mvn44z class="row g-4"> <div b-2u57mvn44z class="col-12 col-md-6"> <h3 b-2u57mvn44z class="h5 text-center mb-3">Free</h3> <ul b-2u57mvn44z class="list-unstyled fs-6"> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Free Conversions</strong> – Enjoy <strong b-2u57mvn44z>15 per day</strong>.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Bigger Files</strong> – Upload up to <strong b-2u57mvn44z>250 MB</strong>.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Parallel Conversions</strong> – Run up to <strong b-2u57mvn44z>10</strong> at once.</li> <li b-2u57mvn44z>✅ Conversion priority <strong b-2u57mvn44z>High</strong></li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>File Management</strong> – Files kept for <strong b-2u57mvn44z>24 hours</strong> (auto-delete) or delete anytime.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>All Formats Supported</strong> – 200+ formats (docs, images, audio, video, archives, and more).</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Email Verification</strong> – A valid email is required; we’ll send a quick verification link.</li> </ul> <div b-2u57mvn44z class="text-center"> <a b-2u57mvn44z class="btn btn-primary btn-sm" href="/signup">Register Now</a> </div> </div> <div b-2u57mvn44z class="col-12 col-md-6"> <h3 b-2u57mvn44z class="h5 text-center mb-3"> Subscribed<br b-2u57mvn44z /><small b-2u57mvn44z>(USD $3.99 / month)</small> </h3> <ul b-2u57mvn44z class="list-unstyled fs-6"> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Free Conversions</strong> – Enjoy <strong b-2u57mvn44z>60 per day</strong>.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Bigger Files</strong> – Upload up to <strong b-2u57mvn44z>500 MB</strong>.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Parallel Conversions</strong> – Run up to <strong b-2u57mvn44z>25</strong> at once.</li> <li b-2u57mvn44z>✅ Conversion priority <strong b-2u57mvn44z>Highest</strong></li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>Ad-Free</strong> – 100% ad-free experience.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>File Management</strong> – Files kept for <strong b-2u57mvn44z>24 hours</strong> (auto-delete) or delete anytime.</li> <li b-2u57mvn44z>✅ <strong b-2u57mvn44z>All Formats Supported</strong> – 200+ formats.</li> </ul> <div b-2u57mvn44z class="text-center"> <a b-2u57mvn44z class="btn btn-primary btn-sm" href="/contact">Contact Us for Subscription</a> </div> </div> </div> <p b-2u57mvn44z class="text-center mt-4 mb-0"> <strong b-2u57mvn44z>Sign up now</strong> to unlock these features and enjoy a faster, more powerful conversion experience! </p> </div> </div> </div> </div> <script type="5af166b0d89d5b77817c3979-text/javascript"> document.addEventListener("DOMContentLoaded", function () { const modalEl = document.getElementById('whyRegisterModal'); const modal = new bootstrap.Modal(modalEl); const key = "whyRegisterShownCount"; // Check how many times shown in this session let shownCount = parseInt(sessionStorage.getItem(key) || "0"); if (shownCount < 2) { setTimeout(() => { modal.show(); shownCount++; sessionStorage.setItem(key, shownCount); }, 15000); // 15 seconds } }); </script><script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="5af166b0d89d5b77817c3979-|49" defer></script><script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"b675e68b422a4d21b07fefa11bd3a716","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script></body></html>