🖨️ Free · No signup · Instant

Describe the problem.
We'll find the fix.

Tell the assistant what's happening — or print a test page to see what's wrong. Step-by-step fixes for every printer issue.

8Test Pages
10Fix Guides
4Brands
FreeAlways
🖨️
FixMyPrinter Assistant
Tell me what's wrong
AI-powered · Routes to our guides · Limited to printer troubleshooting
How it works

From broken to working in three steps

1
Print a test page
Eight test page types. Pick the one that matches your situation — or start with B&W to check basics.
2
Identify the issue
Pick what you're seeing. Each guide states the real cause — not "several factors may be involved."
3
Follow the fix
Step-by-step, organized by OS and brand. Official support links included for every major manufacturer.
Fix by device

What are you printing from?

Some fixes are OS-specific. Every troubleshooting guide has separate Windows and macOS steps.

Official support

Fix by printer brand

Direct links to official drivers, setup guides, and manual libraries for every major brand.

More than just a test page download

Most printer test sites give you a PDF and leave you to figure out the rest. FixMyPrinter gives you the diagnostic layer the other sites are missing.

8 test page types
10 fix guides
OS-specific steps
Brand support links
Real causes named
No signup needed
${builders[type]()} `); win.document.close(); win.focus(); setTimeout(()=>win.print(),500); } function tpHeader(title,sub){ return `
FixMyPrinter.org
${title}
${sub?`
${sub}
`:''}
`; } function buildBW(){ const grays=[0,15,30,45,60,75,90,100]; const grad=grays.map(g=>`
`).join(''); return tpHeader('Black & White Test Page','Tests black ink/toner output, text rendering, and grayscale range')+`
Grayscale gradient (0% → 100% black)
${grad}
WhiteBlack
Fill density blocks
${[10,25,50,75,90,100].map(p=>`
${p}%
`).join('')}
Text rendering samples
8pt — The quick brown fox jumps over the lazy dog. 0123456789
10pt — The quick brown fox jumps over the lazy dog. 0123456789
12pt — The quick brown fox jumps over the lazy dog.
14pt — The quick brown fox jumps over.
18pt — The quick brown fox.
24pt — Bold text test.
Fine line test
If all three lines above are visible and sharp, your printer is rendering fine detail correctly.
`; } function buildColor(){ const cols=[{n:'Cyan',h:'#00AEEF'},{n:'Magenta',h:'#EC008C'},{n:'Yellow',h:'#FFED00'},{n:'Black',h:'#000000'},{n:'Red',h:'#ED1C24'},{n:'Green',h:'#00A651'},{n:'Blue',h:'#0072BC'},{n:'Orange',h:'#F7941D'}]; return tpHeader('Color Test Page','Checks all color channels — cyan, magenta, yellow, and black')+`
${cols.map(c=>`
${c.n}
${c.h}
`).join('')}
Color gradient bars
${['#00AEEF','#EC008C','#FFED00','#000000'].map((h,i)=>`
${[10,20,30,40,50,60,70,80,90,100].map(p=>`
`).join('')}
${['Cyan','Magenta','Yellow','Black'][i]} — 10% to 100%
`).join('')}
Color accuracy check

If any color block above appears faded, wrong, or missing, that ink channel may need cleaning or cartridge replacement. A missing yellow often appears as blue prints — a missing magenta makes prints look green.

`; } function buildCMYK(){ return tpHeader('CMYK Test Page','Professional four-color channel verification')+`
${[{l:'C',n:'Cyan',h:'#00AEEF',dark:false},{l:'M',n:'Magenta',h:'#EC008C',dark:false},{l:'Y',n:'Yellow',h:'#FFED00',dark:true},{l:'K',n:'Black',h:'#000000',dark:false}].map(c=>`
${c.l}
${c.n}
`).join('')}
Density steps — 25%, 50%, 75%, 100%
${[25,50,75,100].map(p=>`
${p}%
`).join('')}
Mixed colors (overprint check)
${[{n:'C+M = Blue',h:'#0073FF'},{n:'M+Y = Red',h:'#FF0066'},{n:'C+Y = Green',h:'#00C060'},{n:'C+M+Y = Black',h:'#1A1A1A'},{n:'C+M+Y+K',h:'#000000'}].map(c=>`
${c.n}
`).join('')}
`; } function buildAlign(){ return tpHeader('Alignment Test Page','Check printhead alignment, margins, and page registration')+`
OUTER BORDER — should be evenly spaced from all edges
Inner dashed border — should be centered within the outer border
◄ LEFT▲ CENTER ▲RIGHT ►
All horizontal lines above should be perfectly parallel and level
Left column — text baseline test:
${[1,2,3,4,5].map(n=>`
Line ${n} — The quick fox
`).join('')}
Right column — alignment test:
${[1,2,3,4,5].map(n=>`
Line ${n} — quick fox
`).join('')}
What to check: Are the outer and inner borders evenly spaced from the page edges? Are horizontal lines straight and parallel? Is the text in each column properly aligned? If borders are lopsided or text is skewed, run an alignment or calibration cycle from your printer's control panel.
`; } function buildInk(){ return tpHeader('Ink Saver Test Page','Minimal ink usage — tests printer function without wasting ink')+`
Minimal black ink test
Basic text: The quick brown fox. 0123456789 — BoldItalic
Minimal color test (thin bars only)
${[{h:'#00AEEF',n:'C'},{h:'#EC008C',n:'M'},{h:'#FFED00',n:'Y'},{h:'#000',n:'K'}].map(c=>`
${c.n}
`).join('')}
Purpose: This minimal test page uses the least possible ink while still confirming the printer is receiving and processing jobs correctly. Use this for frequent maintenance checks. If this page prints correctly, your printer's basic function is working.
`; } function buildGhost(){ return tpHeader('Ghost Detector — Page 1 of 2','Print both pages — Page 1 has content, Page 2 tests for ghosting')+`
Page 1: Reference content
${[{n:'C',h:'#00AEEF'},{n:'M',h:'#EC008C'},{n:'Y',h:'#FFED00'},{n:'K',h:'#000'}].map(c=>`
${c.n}
`).join('')}
GHOST DETECTOR — PAGE ONE
FixMyPrinter.org — After printing this page, immediately print Page 2 below.
Page 2: Ghost test (should be blank except for borders)
This area should be completely white
If you see faint color blocks or text appearing here, your printer has a ghosting problem
How to read: Print page 1, then print this page 2 without changing any settings. If faint copies of page 1's colors appear on page 2, your printer has a ghosting or drum issue. This is common in laser printers with worn drum units.
`; } function buildText(){ const lorem='The quick brown fox jumps over the lazy dog. Pack my box with five dozen liquor jugs. How vexingly quick daft zebras jump. The five boxing wizards jump quickly. Sphinx of black quartz, judge my vow.'; return tpHeader('Text Test Page','Full page of text — tests ink flow, character rendering, and consistency')+`
${[8,9,10,11,12,14].map(sz=>`

${sz}pt: ${lorem}

`).join('')}

Bold: ${lorem.substring(0,100)}

Italic: ${lorem.substring(0,100)}

Characters:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 !@#$%^&*()_+-=[]{}|;':,./<>?

`; } function buildBlank(){ return tpHeader('Blank Page','Sends a blank page to confirm the printer receives and processes a print job')+`
This page is intentionally blank
If this page printed correctly (paper moved through the printer), the printer is mechanically working. If the page is completely blank on your screen but your printer didn't print anything at all, there may be a connection or queue issue — not an ink issue.
`; } /* ══════════════════════════════════════════════════════════════ CHATBOT — Claude API powered ══════════════════════════════════════════════════════════════ */ let chatHistory = []; let chatBusy = false; const GUIDE_MAP = { blank: {label:'blank pages guide', fixId:'blank'}, offline: {label:'offline printer guide', fixId:'offline'}, testpage: {label:'test page paradox guide', fixId:'testpage'}, phonelaptop: {label:'phone vs laptop guide', fixId:'phonelaptop'}, queue: {label:'stuck queue guide', fixId:'queue'}, color: {label:'color troubleshooting guide', fixId:'color'}, network: {label:'network printer guide', fixId:'network'}, driver: {label:'driver troubleshooting guide', fixId:'driver'}, garbled: {label:'garbled text guide', fixId:'garbled'}, notprinting: {label:'general troubleshooting guide', fixId:'notprinting'}, }; const BRAND_LINKS = { hp: { drivers: "https://support.hp.com/us-en/drivers", support: "https://support.hp.com/us-en/printer" }, canon: { drivers: "https://www.usa.canon.com/support/software-and-drivers", support: "https://www.usa.canon.com/support" }, epson: { drivers: "https://epson.com/Support/Printers/sh/s1", support: "https://epson.com/Support/Printers/sh/s1" }, brother: { drivers: "https://support.brother.com/g/b/countrytop.aspx?c=us&lang=en", support: "https://support.brother.com/g/b/countrytop.aspx?c=us&lang=en" }, }; function initChat(){ chatHistory = []; addBotMessage("Hi! What's going on with your printer?", buildIssueChips()); } function buildIssueChips(){ const chips=[ {label:"📃 Blank pages",key:"blank"}, {label:"📴 Shows offline",key:"offline"}, {label:"✅ Test ok, docs fail",key:"testpage"}, {label:"📱 Phone prints, not laptop",key:"phonelaptop"}, {label:"🗂️ Job stuck in queue",key:"queue"}, {label:"🎨 Color problem",key:"color"}, {label:"📶 Not on network",key:"network"}, {label:"⚙️ Driver issues",key:"driver"}, {label:"📊 Garbled / symbols",key:"garbled"}, {label:"🔧 Setting up printer",key:"setup"}, ]; return '
'+chips.map(function(c){ return '
'+c.label+'
'; }).join('')+'
'; } function selectIssueChip(key,el){ var label=el.textContent.trim(); addUserMessage(label); var issueNames={blank:'My printer prints blank pages',offline:'My printer shows as offline',testpage:'Test page works but documents don\'t print',phonelaptop:'Printer works on my phone but not my laptop',queue:'Print job stuck in queue and won\'t delete',color:'Colors are wrong or one color is missing',network:'Printer not found on network',driver:'Driver installed but not printing',garbled:'Printer prints garbled text or symbols',setup:'I need help setting up a new printer'}; sendToAPI(issueNames[key]||label); } async function sendMessage(){ var input=document.getElementById('chatInput'); var text=input.value.trim(); if(!text||chatBusy)return; input.value=''; autoResize(input); addUserMessage(text); await sendToAPI(text); } async function sendToAPI(userText){ chatBusy=true; document.getElementById('chatSend').disabled=true; chatHistory.push({role:'user',content:userText}); var msgs=chatHistory.slice(-10); showTyping(); try{ var resp=await fetch('/.netlify/functions/chat',{ method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({ messages:msgs }) }); hideTyping(); if(!resp.ok){ console.error('API error:',resp.status); addBotMessage("I'm having trouble connecting right now. In the meantime, you can browse our fix guides below — they cover the most common printer problems step by step.", buildIssueChips()); chatBusy=false; document.getElementById('chatSend').disabled=false; return; } var data=await resp.json(); var reply=data.content.map(function(b){return b.type==='text'?b.text:''}).join(''); chatHistory.push({role:'assistant',content:reply}); // Detect if response mentions a guide and add a clickable link button var guideButton=''; for(var key in GUIDE_MAP){ var info=GUIDE_MAP[key]; if(reply.toLowerCase().indexOf(info.label.toLowerCase())!==-1){ if(info.fixId && FIX_PAGES[info.fixId]){ guideButton='
'; break; } } } // Detect brand mentions and add support links var brandLinks=''; var replyLower=reply.toLowerCase(); var detectedBrands=[]; if(replyLower.indexOf('support.hp.com')!==-1||replyLower.indexOf('hp smart')!==-1) detectedBrands.push('hp'); if(replyLower.indexOf('canon.com')!==-1||replyLower.indexOf('canon print')!==-1) detectedBrands.push('canon'); if(replyLower.indexOf('epson.com')!==-1||replyLower.indexOf('epson smart')!==-1) detectedBrands.push('epson'); if(replyLower.indexOf('brother.com')!==-1||replyLower.indexOf('brother iprint')!==-1) detectedBrands.push('brother'); if(detectedBrands.length>0){ brandLinks='
'; detectedBrands.forEach(function(b){ var bl=BRAND_LINKS[b]; if(bl) brandLinks+='↗ '+b.toUpperCase()+' support '; }); brandLinks+='
'; } addBotMessage(escapeHtml(reply).replace(/\n/g,'
') + guideButton + brandLinks); }catch(e){ hideTyping(); console.error('Fetch error:',e); addBotMessage("Something went wrong connecting to the assistant. Here are the most common issues — pick one to see the guide:", buildIssueChips()); } chatBusy=false; document.getElementById('chatSend').disabled=false; } /* ══ CHAT DOM HELPERS ══ */ var typingEl=null; function addBotMessage(text,extra){ var msgs=document.getElementById('chatMessages'); var el=document.createElement('div'); el.className='msg bot'; el.innerHTML='
'+text+(extra||'')+'
'+getTime()+'
'; msgs.appendChild(el); scrollBottom(); } function addUserMessage(text){ var msgs=document.getElementById('chatMessages'); var el=document.createElement('div'); el.className='msg user'; el.innerHTML='
'+escapeHtml(text)+'
'+getTime()+'
'; msgs.appendChild(el); scrollBottom(); } function showTyping(){ var msgs=document.getElementById('chatMessages'); typingEl=document.createElement('div'); typingEl.className='msg bot'; typingEl.innerHTML='
'; msgs.appendChild(typingEl); scrollBottom(); } function hideTyping(){if(typingEl){typingEl.remove();typingEl=null}} function scrollBottom(){var m=document.getElementById('chatMessages');setTimeout(function(){m.scrollTop=m.scrollHeight},50)} function getTime(){return new Date().toLocaleTimeString([],{hour:'2-digit',minute:'2-digit'})} function escapeHtml(t){var d=document.createElement('div');d.appendChild(document.createTextNode(t));return d.innerHTML} function autoResize(el){el.style.height='auto';el.style.height=Math.min(el.scrollHeight,100)+'px'} function handleKey(e){if(e.key==='Enter'&&!e.shiftKey){e.preventDefault();sendMessage()}} function restartChat(){ document.getElementById('chatMessages').innerHTML=''; chatHistory=[]; chatBusy=false; document.getElementById('chatSend').disabled=false; initChat(); } /* ══ INLINE PANEL HELPERS ══ */ function minimiseChat(){ document.getElementById('chatPanel').style.display='none'; document.getElementById('chatReopenFab').classList.add('visible'); } function reopenChat(){ document.getElementById('chatPanel').style.display='flex'; document.getElementById('chatReopenFab').classList.remove('visible'); setTimeout(function(){document.getElementById('chatInput').focus()},100); } function toggleChat(){ if(!chatHistory.length) initChat(); } function openChat(){ if(!chatHistory.length) initChat(); } /* navTo: smart nav that works from homepage AND fix sub-pages */ function navTo(sel){ var pv=document.getElementById('page-view'); var hp=document.getElementById('homepage'); if(pv && pv.classList.contains('on')){ hp.classList.remove('off'); pv.classList.remove('on'); setTimeout(function(){ var el=document.querySelector(sel); if(el) el.scrollIntoView({behavior:'smooth',block:'start'}); },50); } else { var el=document.querySelector(sel); if(el) el.scrollIntoView({behavior:'smooth',block:'start'}); } } /* Auto-start chat on load */ document.addEventListener('DOMContentLoaded',function(){ initChat(); });