🧰

Image to PDF

Image to PDF

Upload one or more images and combine them into a single printable PDF workflow locally in your browser.

Download PDF File
Tip: each image is turned into its own page with light margins for easier printing.
'; const blob=new Blob([html],{type:'text/html'}); const href=URL.createObjectURL(blob); dl.href=href; dl.download='images.html'; dl.textContent='Download Printable File'; out.textContent='For best compatibility, open the file and print it as PDF with Ctrl/Cmd+P.'; }; // v5.1 sticky header shadow + theme meta color (function(){ const h=document.querySelector('header'); const onScroll=()=>{ if(window.scrollY>8){h.classList.add('scrolled')} else {h.classList.remove('scrolled')} }; onScroll(); window.addEventListener('scroll', onScroll, {passive:true}); // dynamic theme-color for mobile browsers const meta = document.querySelector('meta[name="theme-color"]') || (function(){const m=document.createElement('meta'); m.setAttribute('name','theme-color'); document.head.appendChild(m); return m;})(); function applyThemeColor(){ const dark = (document.documentElement.getAttribute('data-theme')==='dark'); meta.setAttribute('content', dark? '#0b1220': '#f7f9ff'); } applyThemeColor(); const obs=new MutationObserver(applyThemeColor); obs.observe(document.documentElement,{attributes:true,attributeFilter:['data-theme']}); })(); // v5.1.1 theme + header shadow (function(){ const root=document.documentElement; const saved=localStorage.getItem('theme'); if(saved){root.setAttribute('data-theme', saved);} const btn=document.getElementById('themeBtnV5'); if(btn){ btn.onclick=()=>{const cur=root.getAttribute('data-theme')||'light'; const next=cur==='light'?'dark':'light'; root.setAttribute('data-theme', next); localStorage.setItem('theme', next);} } const h=document.querySelector('header'); const onScroll=()=>{ if(window.scrollY>8){h.classList.add('scrolled')} else {h.classList.remove('scrolled')} }; onScroll(); window.addEventListener('scroll', onScroll, {passive:true}); const meta = document.querySelector('meta[name="theme-color"]') || (function(){const m=document.createElement('meta'); m.setAttribute('name','theme-color'); document.head.appendChild(m); return m;})(); function applyThemeColor(){ const dark = (document.documentElement.getAttribute('data-theme')==='dark'); meta.setAttribute('content', dark? '#0b1220': '#f7f9ff'); } applyThemeColor(); new MutationObserver(applyThemeColor).observe(document.documentElement,{attributes:true,attributeFilter:['data-theme']}); })();