PageSourceSearch

https://kerneltools.dev/assets/PdfEditChecker-Cghsy35w.js

js kerneltools.dev collected 2026-10-02 01:53:40 UTC 9,024 bytes, 1 lines download raw bytes

1import{r as d,u as R,j as e,L as $}from"./index-j7I9Tmll.js";import{f as A,i as L,M as O}from"./pdfEditor-C_FHqbws.js";const U={strong:{title:"Strong signs of editing",text:"This file contains clear traces of being changed after it was first created. Look at the findings below, and ask the issuer for a fresh copy if it matters."},some:{title:"Some signs of editing",text:"Nothing proves the content was changed, but the file was handled in ways worth a closer look."},none:{title:"No editing traces found",text:"The file has a single save and nothing unusual in its metadata. That is a good sign, but not proof: a document re-created from scratch leaves no traces."}},I={strong:"Strong",moderate:"Worth checking",info:"Info"},x=n=>{const r=new Date(n);return n?Number.isNaN(r.getTime())?n:r.toLocaleString("en-IN",{dateStyle:"medium",timeStyle:"short"}):"—"};function M(n){const r=n.changes;if(!n.readable)return"Couldn’t be read on its own.";if(!r)return"The first saved version.";const c=[];r.pagesAdded&&c.push(`${r.pagesAdded} page(s) added`),r.pagesRemoved&&c.push(`${r.pagesRemoved} page(s) removed`);for(const i of r.pages){const h=[];i.contentChanged&&h.push("text/graphics changed"),i.fontsAdded.length&&h.push(`font${i.fontsAdded.length>1?"s":""} added: ${i.fontsAdded.join(", ")}`),i.imagesAdded&&h.push(`${i.imagesAdded} image(s) added`),i.annotationsAdded.length&&h.push(`added ${i.annotationsAdded.join(", ")}`),c.push(`Page ${i.page}: ${h.join("; ")}`)}return c.length?c.join(" · "):"No visible page changes (often a signature, form fields or metadata)."}function z(){var C,P,D,S;const[n,r]=d.useState(null),[c,i]=d.useState(!1),[h,p]=d.useState("Choose a PDF to check."),[j,f]=d.useState(""),[t,w]=d.useState(null),[u,k]=d.useState(""),[v,m]=d.useState(null),y=d.useRef(null),g=d.useRef(null);R({title:"Was This PDF Edited? Free PDF Tampering Checker | Kernel Tools",description:"Check if a PDF was edited after it was created. Finds hidden earlier versions, changes after signing, editing software and font traces, entirely in your browser with no upload.",keywords:["check if pdf is edited","pdf tampering checker","how to tell if a pdf has been altered","pdf metadata checker","fake bank statement pdf check"],structuredData:{"@context":"https://schema.org","@type":"SoftwareApplication",name:"PDF Edit Checker",applicationCategory:"UtilitiesApplication",operatingSystem:"Web",url:"https://kerneltools.dev/pdf-edit-checker",offers:{"@type":"Offer",price:"0",priceCurrency:"INR"}}}),d.useEffect(()=>()=>{var s;return(s=g.current)==null?void 0:s.terminate()},[]);function T(s){const a=s==null?void 0:s[0];if(!a||!L(a))return f("Choose one PDF file.");if(a.size>O)return f("Choose a PDF up to 100 MB.");r(a),w(null),f(""),k(""),m(null),b(a,"")}function b(s,a){var F;(F=g.current)==null||F.terminate(),i(!0),f(""),p("Checking the file…");const l=new Worker(new URL("/assets/forensics.worker-C1o1QN7l.js",import.meta.url),{type:"module"});g.current=l,l.onmessage=({data:o})=>{if(o.type==="progress")return p(`Checking the file… ${Math.round(o.value*100)}%`);i(!1),l.terminate(),o.type==="needs-password"?(m({wrong:o.wrongPassword}),p("This PDF is password-protected.")):o.type==="result"?(m(null),w(o.result),p("Check complete.")):(f(o.message),p(""))},s.arrayBuffer().then(o=>l.postMessage({type:"analyze",bytes:new Uint8Array(o),password:a},[o]))}function E(s){const a=URL.createObjectURL(n.slice(0,s.endOffset,"application/pdf")),l=document.createElement("a");l.href=a,l.download=`${n.name.replace(/\.pdf$/i,"")}-version-${s.index}.pdf`,l.click(),setTimeout(()=>URL.revokeObjectURL(a),1e4)}const N=t&&U[t.verdict];return e.jsxs("div",{className:"pdf-tools-page",children:[e.jsx($,{className:"pdf-tools-back",to:"/pdf-tools",children:"← All PDF tools"}),e.jsxs("header",{className:"pdf-tools-heading",children:[e.jsx("span",{className:"pdf-tools-eyebrow",children:"PROCESSED IN YOUR BROWSER · NO UPLOADS"}),e.jsx("h1",{children:"Was this PDF edited?"}),e.jsx("p",{children:"Check a salary slip, bank statement, certificate or any PDF for traces of editing: hidden earlier versions, changes after signing, editing software and odd fonts."})]}),e.jsxs("section",{className:"pdf-tool-workspace",children:[e.jsxs("div",{className:"pdf-tool-drop",children:[e.jsx("span",{className:"pdf-tool-symbol",children:"⌕"}),e.jsx("h2",{children:"Choose a PDF"}),e.jsx("p",{children:"The file is checked on your device and never uploaded."}),e.jsx("input",{ref:y,hidden:!0,type:"file",accept:"application/pdf,.pdf",onChange:s=>{T(s.target.files),s.target.value=""}}),e.jsx("button",{className:"btn btn-primary",disabled:c,onClick:()=>y.current.click(),children:"Choose PDF"}),e.jsx("small",{children:"One PDF · up to 100 MB"})]}),n&&e.jsxs("div",{className:"pdf-tool-list-heading",children:[e.jsx("h2",{children:n.name}),e.jsx("span",{children:A(n.size)})]}),v&&e.jsxs("form",{className:"pdf-check-password",onSubmit:s=>{s.preventDefault(),b(n,u)},children:[e.jsx("label",{htmlFor:"pdf-check-password",children:v.wrong?"That password didn’t work. Try again:":"Enter the PDF’s password to check it (it stays on your device):"}),e.jsxs("div",{children:[e.jsx("input",{id:"pdf-check-password",type:"password",autoComplete:"off",value:u,onChange:s=>k(s.target.value)}),e.jsx("button",{className:"btn btn-primary",type:"submit",disabled:c||!u,children:"Unlock and check"})]})]}),e.jsx("p",{role:"status","aria-live":"polite",children:h}),j&&e.jsx("p",{className:"pdf-tool-error",role:"alert",children:j}),t&&e.jsxs("div",{className:"pdf-check-result",children:[e.jsxs("div",{className:`pdf-check-verdict pdf-check-verdict--${t.verdict}`,children:[e.jsx("h2",{children:N.title}),e.jsx("p",{children:N.text}),e.jsxs("small",{children:[t.pageCount," page",t.pageCount===1?"":"s"," · saved ",t.revisionCount," time",t.revisionCount===1?"":"s",t.signatures.length?` · ${t.signatures.length} digital signature${t.signatures.length>
11?"s":""}`:""]})]}),t.findings.length>0&&e.jsx("ul",{className:"pdf-check-findings",children:t.findings.map(s=>e.jsxs("li",{className:`is-${s.severity}`,children:[e.jsx("span",{className:"pdf-check-badge",children:I[s.severity]}),e.jsx("h3",{children:s.title}),e.jsx("p",{children:s.detail}),s.innocent&&e.jsxs("p",{className:"pdf-check-innocent",children:["Could also be innocent: ",s.innocent]})]},s.id))}),t.revisionCount>1&&e.jsxs("section",{className:"pdf-check-section",children:[e.jsx("h3",{children:"Saved versions inside this file"}),e.jsx("p",{children:"Each time an editor saves this way, the earlier version stays inside the file. You can download and open an earlier one to compare it with what you received."}),e.jsx("ol",{className:"pdf-check-revisions",children:t.revisions.map((s,a)=>e.jsxs("li",{children:[e.jsxs("div",{children:[e.jsxs("strong",{children:["Version ",s.index,a===0?" (first save)":"",a===t.revisions.length-1?" (what you see now)":""]}),s.producer&&e.jsxs("span",{children:[" · saved by ",s.producer]}),e.jsx("p",{children:M(s)})]}),a<t.revisions.length-1&&e.jsxs("button",{className:"btn btn-ghost",type:"button",onClick:()=>E(s),children:["Download version ",s.index]})]},s.index))}),t.revisionsTruncated&&e.jsxs("p",{className:"pdf-check-innocent",children:["This file has ",t.revisionCount," saves; the first ",t.revisions.length-1," and the last were compared."]})]}),e.jsxs("section",{className:"pdf-check-section",children:[e.jsx("h3",{children:"File details"}),e.jsx("dl",{className:"pdf-check-meta",children:[["Title",t.metadata.title],["Author",t.metadata.author],["Created with",t.metadata.creator],["Produced by",t.metadata.producer],["Created",x(t.metadata.created)],["Last modified",x(t.metadata.modified)],["XMP creator tool",(C=t.metadata.xmp)==null?void 0:C.creatorTool],["XMP modified",((P=t.metadata.xmp)==null?void 0:P.modifyDate)&&x(t.metadata.xmp.modifyDate)]].filter(([,s])=>s).map(([s,a])=>e.jsxs("div",{children:[e.jsx("dt",{children:s}),e.jsx("dd",{children:a})]},s))}),((S=(D=t.metadata.xmp)==null?void 0:D.history)==null?void 0:S.length)>0&&e.jsxs("p",{className:"pdf-check-innocent",children:["Edit history: ",t.metadata.xmp.history.map(s=>`${s.action} by ${s.software}`).join(" → ")]})]})]})]}),e.jsxs("section",{className:"pdf-tool-info",children:[e.jsx("h2",{children:"What this can and can’t tell you"}),e.jsx("p",{children:"It reads the traces editing tools leave inside a PDF: earlier versions kept by incremental saves, changes made after a digital signature, the software that last saved the file, dates that don’t add up, and fonts added later. When it shows an earlier version, that is the file’s own content before the change."}),e.jsx("p",{children:"It can’t prove a document is genuine. Someone who re-creates or prints a document to a new PDF leaves none of these traces, and innocent actions like signing, filling in a form or compressing a file can show up as findings. For anything important, ask the issuer for a fresh copy or verify it with them directly."})]})]})}export{z as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.