PageSourceSearch

https://www.ondevicepdf.com/_next/static/chunks/8965.c0a948104187d59d.js

js ondevicepdf.com collected 2026-09-24 14:51:15 UTC 21,372 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4230,8965],{2527:(e,t,s)=>{s.d(t,{A:()=>r});function r(){return null}},24230:(e,t,s)=>{s.r(t),s.d(t,{DEFAULT_PDF_WORKER_SRC:()=>r,configurePdfJsWorker:()=>l,default:()=>o});let r="/pdf.worker.min.mjs",a=null,n=null;function i(){return a||(a=Promise.all([s.e(2213),s.e(9304)]).then(s.bind(s,12810)).then(e=>(e.GlobalWorkerOptions.workerSrc=r,n=e,e)).catch(e=>{throw a=null,e})),a}function l(e=r){return i().then(t=>(t.GlobalWorkerOptions.workerSrc=e,t))}let o={getDocument(e){let t=i().then(t=>t.getDocument(e));return{get promise(){return t.then(e=>e.promise)},destroy:()=>t.then(e=>e.destroy?.())}},Util:{transform(...e){if(!n)throw Error("pdfjs not loaded yet — call getDocument first");return n.Util.transform(...e)}}}},34354:(e,t,s)=>{s.d(t,{i:()=>r});function r(){let e=window.Capacitor;return!!(e&&"function"==typeof e.isNativePlatform&&e.isNativePlatform())}},48965:(e,t,s)=>{s.r(t),s.d(t,{default:()=>y});var r=s(95155),a=s(12115),n=s(11363),i=s(79397),l=s(90450),o=s(93489),d=s(2527),c=s(77953),m=s(92517),u=s(57423),h=s(81570),x=s(24230),p=s(79409),f=s(70297),b=s(52998),g=s(44223);function y(){let[e,t]=(0,a.useState)(null),[s,y]=(0,a.useState)(null),[w,v]=(0,a.useState)(""),[j,k]=(0,a.useState)(!1),[N,P]=(0,a.useState)(0),[D,C]=(0,a.useState)(""),[F,S]=(0,a.useState)(""),[M,A]=(0,a.useState)(`document-${new Date().toISOString().slice(0,10)}.md`),[R,E]=(0,a.useState)(!0),[T,W]=(0,a.useState)(!0),[L,O]=(0,a.useState)(!0),[B,I]=(0,a.useState)(!1),[G,U]=(0,a.useState)(!1),[$,_]=(0,a.useState)({visible:!1,message:"",type:"success"}),z=(0,a.useRef)([]),J=(0,a.useRef)({pageRows:[],runningLines:new Set});async function H([e]){if(e){t(e),k(!0),S(""),P(0),z.current=[],J.current={pageRows:[],runningLines:new Set};try{let t=await e.arrayBuffer(),s=await x.default.getDocument({data:t}).promise;y(s.numPages);let r=[],a=[];for(let e=1;e<=s.numPages;e++){P(Math.round((e-1)/s.numPages*100)),C(`Converting page ${e} of ${s.numPages}...`);let t=await s.getPage(e),n=await t.getTextContent();r.push(n.items.map(e=>({str:e.str,x:e.transform[4],y:e.transform[5],h:e.height||e.transform[3]||10,width:e.width||0}))),a.push((0,f.lR)(n,t.getViewport({scale:1})))}P(100),C("Complete!"),z.current=r,J.current={pageRows:a.map(e=>e.rows),runningLines:(0,f.G4)(a.filter(e=>e.reordered))},v((0,p.OJ)(r,{detectHeadings:R,detectLists:T,detectTables:L,plainText:G,pageBreaks:B,...J.current}))}catch(e){S(e?.message||"Failed to convert PDF to Markdown")}finally{k(!1),P(0)}}}return(0,a.useEffect)(()=>{z.current.length&&v((0,p.OJ)(z.current,{detectHeadings:R,detectLists:T,detectTables:L,plainText:G,pageBreaks:B,...J.current}))},[R,T,L,G,B]),(0,r.jsxs)("div",{className:"pb-24 max-w-4xl mx-auto",children:[(0,r.jsx)(m.A,{visible:$.visible,message:$.message,type:$.type,onClose:()=>_({...$,visible:!1})}),j&&(0,r.jsx)(u.A,{title:"Converting to Markdown",progress:N,statusText:D}),(0,r.jsx)(d.A,{title:"PDF to Markdown",description:"Convert PDF to clean Markdown in your browser. Detects headings, lists, and paragraphs. A private, on-device markitdown alternative with no uploads.",canonical:"https://www.ondevicepdf.com/tools/pdf-to-markdown"}),(0,r.jsxs)("div",{className:"mb-4 text-center",children:[(0,r.jsx)("h1",{className:"text-2xl font-semibold text-ink mb-2",children:"\uD83D\uDCD1 PDF to Markdown"}),(0,r.jsx)("p",{className:"text-muted-fg",children:g.e?"Runs entirely on your device — files never leave your phone.":"Convert a PDF into clean Markdown, entirely in your browser."})]}),(0,r.jsx)(i.A,{onFiles:H,multiple:!1}),e&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"mt-4",children:(0,r.jsx)(h.A,{fileName:e.name,pageCount:s,fileSize:e.size})}),(0,r.jsxs)("div",{className:"mt-3 flex flex-wrap gap-4 items-center",children:[(0,r.jsxs)("label",{className:"inline-flex items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:R,disabled:G,onChange:e=>E(e.target.checked)}),"Detect headings"]}),(0,r.jsxs)("label",{className:"inline-flex items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:T,disabled:G,onChange:e=>W(e.target.checked)}),"Detect lists"]}),(0,r.jsxs)("label",{className:"inline-flex items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:L,disabled:G,onChange:e=>O(e.target.checked)}),"Detect tables"]}),(0,r.jsxs)("label",{className:"inline-flex items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:B,onChange:e=>I(e.target.checked)}),"Separate pages with ---"]}),(0,r.jsxs)("label",{className:"inline-flex items-center gap-2 text-sm",children:[(0,r.jsx)("input",{type:"checkbox",checked:G,onChange:e=>U(e.target.checked)}),"Plain text mode"]})]}),(0,r.jsxs)("div",{className:"mt-3",children:[(0,r.jsx)("textarea",{className:"w-full h-72 border rounded p-3 font-mono text-sm",value:j?"Convert
1ing…":w,readOnly:!0}),w&&!j&&(0,r.jsxs)("div",{className:"text-xs text-muted-fg mt-1 flex gap-4",children:[(0,r.jsxs)("span",{children:[w.trim().split(/\s+/).filter(Boolean).length.toLocaleString()," words"]}),(0,r.jsxs)("span",{children:[w.length.toLocaleString()," characters"]})]})]}),(0,r.jsx)("div",{className:"mt-4 border rounded p-3 bg-card",children:(0,r.jsx)(c.A,{value:M,onChange:A})})]}),F&&(0,r.jsx)("div",{className:"mt-4 p-3 bg-red-50 border border-red-200 rounded text-red-800",children:F}),(0,r.jsxs)(l.A,{children:[(0,r.jsx)("button",{className:"px-3 py-1.5 rounded border border-hairline hover:bg-ink/5",disabled:!w,onClick:function(){navigator.clipboard.writeText(w||""),_({visible:!0,message:"Markdown copied to clipboard!",type:"success"})},children:"Copy"}),(0,r.jsx)("button",{className:"px-4 py-2 rounded bg-brand text-white hover:bg-brand-hover disabled:opacity-50",disabled:!w,onClick:function(){(0,b.O)(new Blob([w||""],{type:"text/markdown"}),M||"document.md").catch(e=>console.error("[PDFToMarkdown] save failed:",e)),_({visible:!0,message:"Markdown downloaded successfully!",type:"success"})},children:"Download .md"})]}),(0,r.jsx)("div",{className:"mt-6",children:(0,r.jsx)(o.A,{steps:["Drop one PDF.","The tool reads the text layer and infers headings (from font sizes) and lists.","Toggle heading/list detection, page separators, or plain-text mode to taste.","Copy the Markdown or download it as a .md file.","If your PDF is scanned, this tool may show little/no text (OCR not enabled)."]})}),!g.e&&(0,r.jsxs)("div",{className:"max-w-4xl mx-auto mt-12 space-y-8 prose prose-slate",children:[(0,r.jsxs)("section",{children:[(0,r.jsx)("h2",{className:"text-2xl font-semibold text-ink mb-4",children:"About PDF to Markdown"}),(0,r.jsxs)("p",{className:"text-body leading-relaxed",children:["Convert any text-based PDF into clean Markdown right in your browser  -  no uploads, no signup, no server. The tool reads the PDF text layer and infers structure: headings are detected from relative font sizes, bullet and numbered lists from their markers, and paragraphs from line spacing. The result is a ready-to-use",(0,r.jsx)("code",{children:".md"})," file for static site generators, wikis, and note apps like Obsidian or Notion."]}),(0,r.jsxs)("p",{className:"text-body leading-relaxed mt-3",children:[(0,r.jsx)("strong",{children:"A private markitdown alternative:"})," like Microsoft's markitdown, this produces Markdown from your documents  -  but it runs entirely on your device with no Python and no cloud. For PDFs specifically, markitdown also relies on extracting the embedded text layer, so the conversion quality is comparable while keeping your files completely private."]}),(0,r.jsxs)("p",{className:"text-body leading-relaxed mt-3",children:[(0,r.jsx)("strong",{children:"Important:"})," This converts embedded text only. Scanned (image-based) PDFs may show no results unless they've been OCR-processed first. Simple tables are reconstructed as Markdown tables; images and very complex merged-cell layouts are not."]})]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h2",{className:"text-2xl font-semibold text-ink mb-4",children:"Why Convert PDF to Markdown?"}),(0,r.jsxs)("ul",{className:"space-y-3 text-body",children:[(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{className:"text-ink",children:"\uD83D\uDCDA Documentation:"})," Move legacy PDF manuals into a docs site or wiki as editable Markdown."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{className:"text-ink",children:"\uD83E\uDDE0 Note-taking:"})," Import PDFs into Obsidian, Logseq, or Notion with headings and lists intact."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{className:"text-ink",children:"\uD83E\uDD16 LLM workflows:"})," Feed clean, structured Markdown to AI tools instead of messy raw text."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{className:"text-ink",children:"\uD83D\uDD27 Version control:"})," Track document changes in Git as plain-text Markdown diffs."]}),(0,r.jsxs)("li",{children:[(0,r.jsx)("strong",{className:"text-ink",children:"\uD83D\uDD12 Privacy first:"})," Convert confidential documents locally without uploading them anywhere."]})]})]}),(0,r.jsxs)("section",{children:[(0,r.jsx)("h3",{className:"text-xl font-semibold text-ink mb-3",children:"Frequently Asked Questions"}),(0,r.jsxs)("div",{className:"space-y-4",children:[(0,r.jsxs)("details",{className:"p-4 bg-page rounded-lg border border-hairline",children:[(0,r.jsx)("summary",{className:"font-semibold text-ink cursor-pointer",children:"Is this the same as Microsoft markitdown?"}),(0,r.jsx)("p",{className:"mt-2 text-body text-sm",children:"It serves the same goal for PDFs  -  producing Markdown  -  but runs fully client-side with no Python or server. For PDFs, markitdown also extracts the embedded text layer, so results are comparable while your files stay on your device."})]}),(0,r.jsxs)("details",{className:"p-4 bg-page rounded-lg border border-hairline",children:[(0,r.jsx)("summary",{className:"font-semibold text-ink cursor-pointer",children:"How are headings detected?"}),(0,r.jsx)("p",{className:"mt-2 text-body text-sm",children:"The tool measures the median body font size, then promotes lines with noticeably larger fonts to Markdown headings (#, ##, ###). You can turn detection off for raw text."})]}),(0,r.jsxs)("details",{className:"p-4 bg-page rounded-lg border border-hairline",children:[(0,r.jsx)("summary",{className:"font-semibold text-ink cursor-pointer",children:"Why is my scanned PDF empty?"}),(0,r.jsx)("p",{className:"mt-2 text-body text-sm",children:"Scanned PDFs are images without a text layer. Run OCR (Adobe Acrobat, Tesseract, or an OCR service) first, then convert the OCR'd PDF here."})]}),(0,r.jsxs)("details",{className:"p-4 bg-page rounded-lg border border-hairline",children:[(0,r.jsx)("summary",{className:"font-semibold text-ink cursor-pointer",children:"Does it handle tables?"}),(0,r.jsx)("p",{className:"mt-2 text-body text-sm",children:"Yes. The tool detects columnar layouts and reconstructs them as Markdown tables. It works best on simple tables with clear column spacing; very complex or merged-cell tables may need cleanup. You can toggle table detection off, and for heavy spreadsheet data the PDF to Excel tool is a better fit."})]})]})]}),(0,r.jsxs)("section",{className:"bg-brand-faint border border-brand/20 rounded-lg p-6",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold text-ink mb-3",children:"\uD83D\uDD17 Related Tools"}),(0,r.jsx)("p",{className:"text-sm text-body mb-3",children:"Enhance your PDF workflow:"}),(0,r.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,r.jsx)(n.N,{to:"/tools/extract-pdf-text",className:"px-3 py-1.5 bg-card border border-brand/30 rounded text-sm text-accent hover:bg-brand-muted",children:"\uD83D\uDCDD Extract Text"}
1),(0,r.jsx)(n.N,{to:"/tools/text-to-pdf",className:"px-3 py-1.5 bg-card border border-brand/30 rounded text-sm text-accent hover:bg-brand-muted",children:"\uD83D\uDCC4 Text to PDF"}),(0,r.jsx)(n.N,{to:"/tools/pdf-to-excel",className:"px-3 py-1.5 bg-card border border-brand/30 rounded text-sm text-accent hover:bg-brand-muted",children:"\uD83D\uDCCA PDF to Excel"})]})]})]})]})}},52998:(e,t,s)=>{s.d(t,{O:()=>a});var r=s(34354);async function a(e,t,s){var a,i;let l=(a=e,i=s,a instanceof Blob?i&&a.type!==i?new Blob([a],{type:i}):a:new Blob([a],{type:i||"application/octet-stream"}));if((0,r.i)())return void await n(l,t);let o=URL.createObjectURL(l);try{let e=document.createElement("a");e.href=o,e.download=t,document.body.appendChild(e),e.click(),e.remove()}finally{setTimeout(()=>URL.revokeObjectURL(o),1500)}}async function n(e,t){var s;let{Filesystem:r,Share:a}=window.Capacitor&&window.Capacitor.Plugins||{},n=`exports/${String(t||"download").replace(/[/\\:*?"<>|]/g,"_").replace(/[\u0000-\u001f]/g,"").replace(/^\.+/,"_").trim()||"download"}`,{uri:i}=await r.writeFile({path:n,data:await (s=e,new Promise((e,t)=>{let r=new FileReader;r.onerror=()=>t(r.error||Error("Failed to read blob")),r.onload=()=>{let t=String(r.result||"");e(t.slice(t.indexOf(",")+1))},r.readAsDataURL(s)})),directory:"CACHE",recursive:!0});try{await a.share({title:t,files:[i]})}catch(e){if(!/cancel/i.test(String(e&&e.message||e)))throw e}}},57423:(e,t,s)=>{s.d(t,{A:()=>n});var r=s(95155),a=s(12115);function n({title:e="Working on it...",progress:t,statusText:s,children:i,onCancel:l}){let o=(0,a.useRef)(null);return(0,a.useEffect)(()=>{let e=o.current,t=document.activeElement,s=e?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),r=s?.[0];function a(e){if("Tab"!==e.key||!s?.length)return;let t=Array.from(s),r=t[0],a=t[t.length-1];e.shiftKey?document.activeElement===r&&(e.preventDefault(),a.focus()):document.activeElement===a&&(e.preventDefault(),r.focus())}return r?.focus(),e?.addEventListener("keydown",a),()=>{e?.removeEventListener("keydown",a),t?.focus?.()}},[]),(0,r.jsx)("div",{className:"fixed inset-0 bg-black/50 flex items-center justify-center z-50",role:"presentation",children:(0,r.jsxs)("div",{className:"bg-card p-6 rounded-lg shadow-card w-80",role:"dialog","aria-modal":"true","aria-labelledby":"progress-title","aria-describedby":"progress-status",tabIndex:-1,ref:o,children:[(0,r.jsx)("h3",{id:"progress-title",className:"text-lg font-semibold mb-2",children:e}),(0,r.jsx)("div",{className:"w-full bg-page rounded-full h-4 mb-2",children:(0,r.jsx)("div",{className:"bg-brand h-4 rounded-full transition-all duration-300",style:{width:`${t??0}%`}})}),(0,r.jsxs)("div",{className:"flex justify-between text-sm text-muted-fg",children:[(0,r.jsx)("span",{id:"progress-status",className:"mr-2 truncate",title:s,"aria-live":"polite","aria-atomic":"true",children:s}),(0,r.jsxs)("span",{children:[t??0,"%"]})]}),i,l&&(0,r.jsx)("button",{className:"mt-4 w-full px-3 py-2 rounded border border-hairline hover:bg-ink/5",onClick:l,type:"button",children:"Cancel"})]})})}},77953:(e,t,s)=>{s.d(t,{A:()=>n});var r=s(95155),a=s(12115);function n({value:e,onChange:t,label:s="Filename"}){let i=(0,a.useId)();return(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("label",{htmlFor:i,className:"text-sm w-28 shrink-0",children:s}),(0,r.jsx)("input",{id:i,className:"border rounded px-3 py-2 w-full min-w-0",value:e,onChange:e=>t(e.target.value.replace(/[<>:"|?*\\//]/g,"").replace(/^\.+/,"").substring(0,255)),placeholder:"optional filename.pdf"})]})}},79397:(e,t,s)=>{s.d(t,{A:()=>n});var r=s(95155),a=s(12115);function n({onFiles:e,multiple:t=!0,accept:s="application/pdf",label:i}){let[l,o]=(0,a.useState)(!1),d=(0,a.useRef)(null);function c(e){if(!s)return!0;let t=s.split(",").map(e=>e.trim()).filter(Boolean);return 0===t.length||t.some(t=>"*"===t||(t.startsWith(".")?(e.name||"").toLowerCase().endsWith(t.toLowerCase()):t.endsWith("/*")?(e.type||"").startsWith(t.slice(0,-1)):e.type===t))}function m(){d.current?.click()}return(0,r.jsxs)("div",{onDragOver:function(e){e.preventDefault(),o(!0)},onDragLeave:function(e){e.preventDefault(),o(!1)},onDrop:function(t){t.preventDefault(),o(!1);let s=Array.from(t.dataTransfer.files||[]).filter(c);s.length&&e(s)},onClick:m,className:`relative flex flex-col items-center justify-center gap-4 roun
1ded-2xl border-2 border-dashed p-12 cursor-pointer transition-all duration-300 ${l?"border-brand bg-brand-muted shadow-card":"border-brand/30 bg-brand-faint hover:border-brand hover:bg-brand-muted hover:shadow-card"}`,style:{minHeight:"320px"},children:[(0,r.jsx)("input",{ref:d,type:"file",accept:s,multiple:t,hidden:!0,onClick:e=>e.stopPropagation(),onChange:t=>{let s=Array.from(t.target.files||[]);t.target.value="",s.length&&e(s)}}),(0,r.jsx)("div",{className:"animate-bounce flex h-14 w-14 items-center justify-center rounded-2xl bg-brand-muted text-accent",style:{animationDuration:"2s"},"aria-hidden":"true",children:(0,r.jsx)("svg",{className:"h-7 w-7",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:(0,r.jsx)("path",{d:"M12 19V5M5 12l7-7 7 7"})})}),(0,r.jsx)("button",{className:"bg-brand text-white px-8 py-4 rounded-lg text-lg font-semibold shadow-card hover:bg-brand-hover active:bg-brand-hover transition-all duration-200 transform hover:scale-105 active:scale-95",onClick:e=>{e.stopPropagation(),m()},children:"Select Files"}),(0,r.jsx)("p",{className:"text-muted-fg text-sm",children:function(){if(i)return i;let e=s.split(",").map(e=>e.trim()).filter(Boolean),t={"application/pdf":"PDF","image/png":"PNG","image/jpeg":"JPG","image/jpg":"JPG","image/gif":"GIF","image/webp":"WebP","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"Excel","application/vnd.ms-excel":"Excel","text/csv":"CSV","application/msword":"Word","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"Word"};if(e.includes("*"))return"or drop files here";let r=e.filter(e=>!e.endsWith("/*")).map(e=>t[e]||e).filter(Boolean);if(e.some(e=>e.endsWith("/*"))){let t=e.find(e=>e.endsWith("/*")).split("/")[0];if("image"===t)return"PNG, JPG, GIF, WebP or drop files here";if("application"===t)return"PDF, Excel, Word or drop files here"}return 0===r.length?"or drop files here":`${r.join(", ")} or drop files here`}()})]})}},81570:(e,t,s)=>{s.d(t,{A:()=>a});var r=s(95155);function a({fileName:e,pageCount:t,fileSize:s}){return e?(0,r.jsx)("div",{className:"p-3 bg-brand-faint border border-brand/20 rounded-lg",children:(0,r.jsxs)("div",{className:"flex items-start gap-2 text-sm",children:[(0,r.jsx)("span",{className:"text-accent text-lg",role:"img","aria-label":"document",children:"\uD83D\uDCC4"}),(0,r.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,r.jsx)("p",{className:"font-medium text-ink truncate",title:e,children:e}),(0,r.jsxs)("p",{className:"text-muted-fg text-xs mt-0.5",children:[null!=t&&(0,r.jsxs)("span",{className:"mr-3",children:[t," ",1===t?"page":"pages"]}),null!=s&&(0,r.jsx)("span",{children:(e=>{if(!e||0===e)return"0 B";let t=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,t)*100)/100+" "+["B","KB","MB","GB"][t]})(s)})]})]})]})}):null}},90450:(e,t,s)=>{s.d(t,{A:()=>a});var r=s(95155);function a({children:e}){return(0,r.jsx)("div",{className:"sticky-bar md:static md:p-0 md:bg-transparent",children:(0,r.jsx)("div",{className:"container flex gap-2 justify-end",children:e})})}},92517:(e,t,s)=>{s.d(t,{A:()=>n});var r=s(95155),a=s(12115);function n({message:e,visible:t,onClose:s,type:i="success"}){return((0,a.useEffect)(()=>{if(!t)return;let e=setTimeout(s,3e3);return()=>clearTimeout(e)},[t,s]),t)?(0,r.jsxs)("div",{className:`fixed bottom-4 right-4 ${"error"===i?"bg-red-500":"bg-green-500"} text-white px-4 py-3 rounded shadow-card animate-pulse z-50`,children:["success"===i?"✓":"✕"," ",e]}):null}},93489:(e,t,s)=>{s.d(t,{A:()=>n});var r=s(95155);function a(){return(0,r.jsx)("div",{className:"mt-6 p-5 bg-brand-faint border border-brand/20 rounded-2xl",children:(0,r.jsxs)("div",{className:"flex items-start gap-3",children:[(0,r.jsx)("div",{className:"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-brand-muted text-lg","aria-hidden":"true",children:"\uD83D\uDCAC"}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("h3",{className:"text-sm font-semibold text-ink",children:"We build this with you ❤️"}),(0,r.jsx)("p",{className:"mt-1 text-sm text-body",children:"Found a bug? Want a feature? Have an idea? Tell us, your messages shape every update we ship."}),(0,r.jsx)("a",{className:"btn mt-3 inline-flex items-center gap-2 text-sm",href:`mailto:[email protected]?subject=${encodeURIComponent("OnDevicePDF feedback")}`,children:"✉️ [email protected]"}),(0,r.jsx)("p",{className:"mt-2 text-xs text-muted-fg",children:"\uD83D\uDD12 Privacy is our core feature: your files stay on your device. We read every mail and reply personally."})]})]})})}function n({steps:e=[],privacy:t=!0}){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(a,{}),(0,r.jsxs)("section",{className:"mt-6",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-2",children:"How to use"}),(0,r.jsx)("ol",{className:"list-decimal ml-5 space-y-1 text-body",children:e.map((e,t)=>(0,r.jsx)("li",{children:e},t))}),t&&(0,r.jsx)("p",{className:"mt-3 text-sm text-muted-fg",children:"Privacy: most tools run in your browser. Advanced PDF Editor operations may use secure temporary backend processing."})]})]})}}}]);

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.