diff --git a/main.js b/main.js index 19ba912..7daa1b7 100644 --- a/main.js +++ b/main.js @@ -223,7 +223,7 @@ end`},Oc=function(){for(var t=[],e=0;e{try{let a=await(0,N.requestUrl)(i);if(a.status!==200)return i;let s=new Uint8Array(a.arrayBuffer),f="";for(let d=0;d[i,await r(i)])),o=new Map(n);return t.replace(Ku,(i,a)=>{let s=o.get(a.trim());return s&&s!==a.trim()?`url('${s}')`:i})}var Ku=/url\(\s*["']?([^"')]+)["']?\s*\)/g,um=new Set(["P","LI","BLOCKQUOTE","TD","TH"]),dm=new Set(["P","DIV","SECTION","ARTICLE","ASIDE","NAV","HEADER","FOOTER","UL","OL","LI","TABLE","THEAD","TBODY","TFOOT","TR","TD","TH","PRE","BLOCKQUOTE","HR","IMG","H1","H2","H3","H4","H5","H6"]),hm=new Set(["CODE","IMG","HR","H1","H2","H3","H4","H5","H6"]),pm=2;function vm(t,e){e.empty();for(let r of t)e.appendChild(r.cloneNode(!0));return e.getBoundingClientRect().height}function mm(t,e,r){return n=>vm([...t,n],e)<=r-pm}function gm(t){let e=activeDocument.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;e.nextNode();){let r=e.currentNode,n=(r.textContent??"").replace(/^\s+/,"");if(n!==r.textContent&&(r.textContent=n),n.length>0)break}}function Uo(t,e,r=!0){let n=activeDocument.createTreeWalker(t,NodeFilter.SHOW_TEXT),o=0,i=null,a=0;for(;n.nextNode();){let u=n.currentNode,d=u.textContent?.length??0;if(o+d>=e){i=u,a=e-o;break}o+=d}if(!i)return null;let s=activeDocument.createRange();s.selectNodeContents(t),s.setEnd(i,a);let f=activeDocument.createRange();f.selectNodeContents(t),f.setStart(i,a);let l=t.cloneNode(!1);l.appendChild(s.cloneContents());let c=t.cloneNode(!1);return c.appendChild(f.cloneContents()),r&&gm(c),[l,c]}function ym(t){let e=[],r=/\s+/g,n;for(;n=r.exec(t);)n.index>0&&n.index0){let f=0,l=o.length-1,c=-1;for(;f<=l;){let u=Math.floor((f+l)/2),d=Uo(t,o[u]);if(!d){l=u-1;continue}e(d[0])?(c=u,f=u+1):l=u-1}if(c>=0)return Uo(t,o[c]);if(!r)return null}let i=1,a=n.length-1,s=0;for(;i<=a;){let f=Math.floor((i+a)/2),l=Uo(t,f);if(!l){a=f-1;continue}e(l[0])?(s=f,i=f+1):a=f-1}return s>0?Uo(t,s):null}function Fs(t,e,r){let n=t.cloneNode(!1);t.tagName==="OL"&&r!==void 0&&r>1&&(n.start=r);for(let o of e)n.appendChild(o.cloneNode(!0));return n}function xm(t,e,r){let n=Array.from(t.children).filter(a=>a.tagName==="LI");if(n.length===0)return null;let o=t.tagName==="OL"?t.start??1:1,i=0;for(let a=0;a=n.length?null:[Fs(t,n.slice(0,i),o),Fs(t,n.slice(i),o+i)]}function ws(t,e){let r=t.cloneNode(!1),n=t.querySelector("caption");n&&r.appendChild(n.cloneNode(!0));let o=t.querySelector("colgroup");o&&r.appendChild(o.cloneNode(!0)),t.tHead&&r.appendChild(t.tHead.cloneNode(!0));let i=activeDocument.createElement("tbody");for(let a of e)i.appendChild(a.cloneNode(!0));return r.appendChild(i),r}function Fm(t,e,r){let n=t.tBodies[0],o=n?Array.from(n.rows):Array.from(t.rows).filter(a=>a.parentElement?.tagName!=="THEAD");if(o.length===0)return null;let i=0;for(let a=0;a=o.length?null:[ws(t,o.slice(0,i)),ws(t,o.slice(i))]}function wm(t){let e=[],r=0;for(let n of t)r+=n.length+1,e.push(r);return e}function Sm(t,e,r){let n=t.querySelector("code"),o=(n??t).textContent?.split(` `)??[];if(o.length>1&&o[o.length-1]===""&&o.pop(),o.length<2)return null;let i=wm(o),a=l=>{if(!n){let p=h=>{let b=t.cloneNode(!1);return b.textContent=h,b};return[p(o.slice(0,l).join(` `)),p(o.slice(l).join(` -`))]}let c=Uo(n,i[l-1],!1);if(!c)return null;let u=t.cloneNode(!1);u.appendChild(c[0]);let d=t.cloneNode(!1);return d.appendChild(c[1]),[u,d]},s=null,f=0;for(let l=1;l<=o.length;l++){let c=a(l);if(!c||!e(c[0]))break;s=c,f=l}if(f<=0){if(!r)return null;s=a(1),f=1}return f>=o.length||!s?null:s}function Pm(t){if(!um.has(t.tagName))return!1;for(let e of Array.from(t.childNodes))if(e.nodeType===Node.ELEMENT_NODE&&dm.has(e.tagName))return!1;return!0}function Dm(t,e,r){return hm.has(t.tagName)?null:t.tagName==="PRE"?Sm(t,e,r):t.tagName==="TABLE"?Fm(t,e,r):t.tagName==="UL"||t.tagName==="OL"?xm(t,e,r):Pm(t)?bm(t,e,r):null}function Cm(t,e,r,n){let o=activeDocument.createElement("div");o.setCssStyles({position:"fixed",top:"0",left:"-99999px",width:`${e}px`,visibility:"hidden",pointerEvents:"none",zIndex:"-1"});let i=o.attachShadow({mode:"open"}),a=new CSSStyleSheet;a.replaceSync(n),i.adoptedStyleSheets=[a];let s=activeDocument.createElement("div");s.className="mpdf-doc";for(let c of Array.from(t.children))s.appendChild(c.cloneNode(!0));i.appendChild(s);let f=activeDocument.createElement("div");f.className="mpdf-doc",f.setCssStyles({position:"absolute",top:"0",left:"0",width:`${e}px`,visibility:"hidden"}),i.appendChild(f),activeDocument.body.appendChild(o);let l=[];try{let c=[],u=Array.from(s.children),d=0;for(;d0?u[d]=x:d++;continue}if(c.length>0){l.push(c),c=[];continue}c.push(p.cloneNode(!0)),l.push(c),c=[],d++}c.length>0&&l.push(c)}finally{activeDocument.body.removeChild(o)}return l.length>0?l:[[]]}function km(t,e){let r=t.length;return t.map((n,o)=>{let i=o+1,a=e.showHeaderOnFirstPage||o>0,s=e.showFooterOnFirstPage||o>0,f=e.showFooterOnFirstPage?e.pageNumberStart+o:e.pageNumberStart+(o-1),l=e.showFooterOnFirstPage?e.pageNumberStart+r-1:e.pageNumberStart+r-2,c=`${f} / ${l}`,u="",d="",p="",h="",b="",F="";if(s&&(e.footerText&&(e.footerTextAlignment==="center"?p=e.footerText:e.footerTextAlignment==="left"?u=e.footerText:d=e.footerText),e.showPageNumbers)){let y=w=>w?w+" \u2014 "+c:c;e.pageNumberPosition==="center"?p=y(p):e.pageNumberPosition==="left"?u=y(u):d=y(d)}a&&e.headerText&&(e.headerAlignment==="center"?b=e.headerText:e.headerAlignment==="left"?h=e.headerText:F=e.headerText);let x=e.showHeader&&a&&!!(h||b||F||e.showHeaderBorder),m=e.showFooter&&s&&!!(u||d||p||e.showFooterBorder);return{pageNodes:n,pageNum:i,totalPages:r,pageShowsHeader:a,pageShowsFooter:s,hasHeader:x,hasFooter:m,headerLeft:h,headerCenter:b,headerRight:F,footerLeft:u,footerRight:d,footerCenter:p}})}function Tm(t){let e=[];for(let r of t)for(let n of r.pageNodes){let o=/^H[1-6]$/.test(n.tagName)?[n]:[],i=Array.from(n.querySelectorAll("h1,h2,h3,h4,h5,h6"));for(let a of[...o,...i]){let s=parseInt(a.tagName[1],10),f=(a.textContent??"").trim();f&&e.push({title:f,level:s,page:r.pageNum})}}return e}async function Em(t,e){if(!e.length)return t;let r=await Ge.load(t),n=r.getPages(),o=r.context,i=e.length,a=new Array(i).fill(-1);for(let m=1;m=0;y--)if(e[y].level=0;y--)if(a[y]===a[m]){s[m]=y;break}for(let y=m+1;y=0&&(l[y]<0&&(l[y]=m),c[y]=m,u[y]++)}let d=o.nextRef(),p=e.map(()=>o.nextRef());for(let m=0;m=0?p[a[m]]:d),S.set(v.of("Dest"),w),s[m]>=0&&S.set(v.of("Prev"),p[s[m]]),f[m]>=0&&S.set(v.of("Next"),p[f[m]]),l[m]>=0&&(S.set(v.of("First"),p[l[m]]),S.set(v.of("Last"),p[c[m]]),S.set(v.of("Count"),j.of(-u[m]))),o.assign(p[m],S)}let h=-1,b=-1,F=0;for(let m=0;m`}function Xu(t,e,r,n){if(!(!e&&!r&&!n))if(e){let o=activeDocument.createElement("span");o.className="mpdf-hf-center",o.textContent=e,t.appendChild(o)}else{let o=activeDocument.createElement("span");o.textContent=r,t.appendChild(o);let i=activeDocument.createElement("span");i.className="mpdf-hf-right",i.textContent=n,t.appendChild(i)}}function Zu(t,e,r){return!t&&!e&&!r?"":t?`${Ui(t)}`:`${Ui(e)}${Ui(r)}`}var qi=class extends N.Plugin{activeModal=null;presetSnapshots={};async onload(){await this.loadSettings(),this.addCommand({id:"open-panel",name:"Open Panel",callback:()=>this.openModal()}),this.registerEvent(this.app.workspace.on("file-menu",(e,r)=>{!(r instanceof N.TFile)||r.extension!=="md"||e.addItem(n=>n.setTitle("Advanced PDF Export: Open Panel").setIcon("file-output").onClick(()=>this.openModal(r)))})),this.addSettingTab(new Ds(this.app,this))}onunload(){this.activeModal?.close()}openModal(e){this.activeModal&&this.activeModal.close(),new Ps(this.app,this,e).open()}async loadSettings(){let e=await this.loadData()??{};this.settings=Object.assign({},Vu,e),e.codeTheme===void 0&&(this.settings.codeTheme=Tn[this.settings.preset]?.codeTheme??Vu.codeTheme),this.presetSnapshots=e.presetSnapshots??{},this.validateSettings()}validateSettings(){let e=this.settings;e.preset in Tn||(console.warn(`[advanced-pdf-export] Unknown preset "${e.preset}", resetting to "default".`),e.preset="default"),e.fontSize=Math.max(1,e.fontSize),e.headerFontSize=Math.max(1,e.headerFontSize),e.footerFontSize=Math.max(1,e.footerFontSize),e.marginTop=Math.max(0,e.marginTop),e.marginBottom=Math.max(0,e.marginBottom),e.marginLeft=Math.max(0,e.marginLeft),e.marginRight=Math.max(0,e.marginRight),e.customPageWidth=Math.max(10,e.customPageWidth),e.customPageHeight=Math.max(10,e.customPageHeight),e.previewScale=Math.max(.1,Math.min(3,e.previewScale)),e.pageNumberStart=Math.max(1,e.pageNumberStart)}async saveSettings(){await this.saveData({...this.settings,presetSnapshots:this.presetSnapshots})}async saveSettingsAndRender(){await this.saveSettings(),this.activeModal?.render()}applyPreset(e,r=!1){let n=Tn[e];n&&(r?delete this.presetSnapshots[e]:this.presetSnapshots[this.settings.preset]=lm(this.settings),this.settings.preset=e,Object.assign(this.settings,n,r?{}:this.presetSnapshots[e]??{}))}};function Om(t,e){if(e)return e;let r=t.workspace.getActiveFile();if(r?.extension==="md")return r;let n=t.workspace.getMostRecentLeaf();return n?.view instanceof N.MarkdownView?n.view.file??null:null}var Ps=class t extends N.Modal{plugin;editorEl;previewEl;pageCountEl;noteTitleEl;renderBtn;exportBtn;loadingOverlayEl;renderComponent=new N.Component;initialFile;currentFile=null;renderToken=0;layoutCache=null;renderDebounceTimer=null;constructor(e,r,n){super(e),this.plugin=r,this.initialFile=n??null}async onOpen(){this.plugin.activeModal=this,this.renderComponent.load(),this.modalEl.addClass("mpdf-modal"),this.buildUI(this.contentEl);let e=Om(this.app,this.initialFile);if(e){let r;try{r=await this.app.vault.read(e)}catch(n){let o=n instanceof Error?n.message:String(n);new N.Notice(`Failed to read file "${e.basename}": ${o}`);return}if(!this.plugin.activeModal)return;this.currentFile=e,this.editorEl.value=r,this.noteTitleEl.textContent=e.basename,this.noteTitleEl.title=e.path,this.render(!0)}}onClose(){this.renderDebounceTimer!==null&&(window.clearTimeout(this.renderDebounceTimer),this.renderDebounceTimer=null),this.renderComponent.unload(),this.plugin.activeModal=null,this.currentFile=null,this.layoutCache=null}buildUI(e){let r=this.plugin.settings;this.buildTopbar(e.createEl("div",{cls:"mpdf-topbar"}),r);let n=e.createEl("div",{cls:"mpdf-main"}),o=n.createEl("div",{cls:"mpdf-editor-panel"});this.editorEl=o.createEl("textarea",{cls:"mpdf-editor"}),this.editorEl.placeholder=`Type or paste markdown here to preview and export as PDF. +`))]}let c=Uo(n,i[l-1],!1);if(!c)return null;let u=t.cloneNode(!1);u.appendChild(c[0]);let d=t.cloneNode(!1);return d.appendChild(c[1]),[u,d]},s=null,f=0;for(let l=1;l<=o.length;l++){let c=a(l);if(!c||!e(c[0]))break;s=c,f=l}if(f<=0){if(!r)return null;s=a(1),f=1}return f>=o.length||!s?null:s}function Pm(t){if(!um.has(t.tagName))return!1;for(let e of Array.from(t.childNodes))if(e.nodeType===Node.ELEMENT_NODE&&dm.has(e.tagName))return!1;return!0}function Dm(t,e,r){return hm.has(t.tagName)?null:t.tagName==="PRE"?Sm(t,e,r):t.tagName==="TABLE"?Fm(t,e,r):t.tagName==="UL"||t.tagName==="OL"?xm(t,e,r):Pm(t)?bm(t,e,r):null}function Cm(t,e,r,n){let o=activeDocument.createElement("div");o.setCssStyles({position:"fixed",top:"0",left:"-99999px",width:`${e}px`,visibility:"hidden",pointerEvents:"none",zIndex:"-1"});let i=o.attachShadow({mode:"open"}),a=new CSSStyleSheet;a.replaceSync(n),i.adoptedStyleSheets=[a];let s=activeDocument.createElement("div");s.className="mpdf-doc";for(let c of Array.from(t.children))s.appendChild(c.cloneNode(!0));i.appendChild(s);let f=activeDocument.createElement("div");f.className="mpdf-doc",f.setCssStyles({position:"absolute",top:"0",left:"0",width:`${e}px`,visibility:"hidden"}),i.appendChild(f),activeDocument.body.appendChild(o);let l=[];try{let c=[],u=Array.from(s.children),d=0;for(;d0?u[d]=x:d++;continue}if(c.length>0){l.push(c),c=[];continue}c.push(p.cloneNode(!0)),l.push(c),c=[],d++}c.length>0&&l.push(c)}finally{activeDocument.body.removeChild(o)}return l.length>0?l:[[]]}function km(t,e){let r=t.length;return t.map((n,o)=>{let i=o+1,a=e.showHeaderOnFirstPage||o>0,s=e.showFooterOnFirstPage||o>0,f=e.showFooterOnFirstPage?e.pageNumberStart+o:e.pageNumberStart+(o-1),l=e.showFooterOnFirstPage?e.pageNumberStart+r-1:e.pageNumberStart+r-2,c=`${f} / ${l}`,u="",d="",p="",h="",b="",F="";if(s&&(e.footerText&&(e.footerTextAlignment==="center"?p=e.footerText:e.footerTextAlignment==="left"?u=e.footerText:d=e.footerText),e.showPageNumbers)){let y=w=>w?w+" \u2014 "+c:c;e.pageNumberPosition==="center"?p=y(p):e.pageNumberPosition==="left"?u=y(u):d=y(d)}a&&e.headerText&&(e.headerAlignment==="center"?b=e.headerText:e.headerAlignment==="left"?h=e.headerText:F=e.headerText);let x=e.showHeader&&a&&!!(h||b||F||e.showHeaderBorder),m=e.showFooter&&s&&!!(u||d||p||e.showFooterBorder);return{pageNodes:n,pageNum:i,totalPages:r,pageShowsHeader:a,pageShowsFooter:s,hasHeader:x,hasFooter:m,headerLeft:h,headerCenter:b,headerRight:F,footerLeft:u,footerRight:d,footerCenter:p}})}function Tm(t){let e=[];for(let r of t)for(let n of r.pageNodes){let o=/^H[1-6]$/.test(n.tagName)?[n]:[],i=Array.from(n.querySelectorAll("h1,h2,h3,h4,h5,h6"));for(let a of[...o,...i]){let s=parseInt(a.tagName[1],10),f=(a.textContent??"").trim();f&&e.push({title:f,level:s,page:r.pageNum})}}return e}async function Em(t,e){if(!e.length)return t;let r=await Ge.load(t),n=r.getPages(),o=r.context,i=e.length,a=new Array(i).fill(-1);for(let m=1;m=0;y--)if(e[y].level=0;y--)if(a[y]===a[m]){s[m]=y;break}for(let y=m+1;y=0&&(l[y]<0&&(l[y]=m),c[y]=m,u[y]++)}let d=o.nextRef(),p=e.map(()=>o.nextRef());for(let m=0;m=0?p[a[m]]:d),S.set(v.of("Dest"),w),s[m]>=0&&S.set(v.of("Prev"),p[s[m]]),f[m]>=0&&S.set(v.of("Next"),p[f[m]]),l[m]>=0&&(S.set(v.of("First"),p[l[m]]),S.set(v.of("Last"),p[c[m]]),S.set(v.of("Count"),j.of(-u[m]))),o.assign(p[m],S)}let h=-1,b=-1,F=0;for(let m=0;m`}function Xu(t,e,r,n){if(!(!e&&!r&&!n))if(e){let o=activeDocument.createElement("span");o.className="mpdf-hf-center",o.textContent=e,t.appendChild(o)}else{let o=activeDocument.createElement("span");o.textContent=r,t.appendChild(o);let i=activeDocument.createElement("span");i.className="mpdf-hf-right",i.textContent=n,t.appendChild(i)}}function Zu(t,e,r){return!t&&!e&&!r?"":t?`${Ui(t)}`:`${Ui(e)}${Ui(r)}`}var qi=class extends N.Plugin{activeModal=null;presetSnapshots={};async onload(){await this.loadSettings(),this.addCommand({id:"open-panel",name:"Open Panel",callback:()=>this.openModal()}),this.registerEvent(this.app.workspace.on("file-menu",(e,r)=>{!(r instanceof N.TFile)||r.extension!=="md"||e.addItem(n=>n.setTitle("Advanced PDF Export: Open Panel").setIcon("file-output").onClick(()=>this.openModal(r)))})),this.addSettingTab(new Ds(this.app,this))}onunload(){this.activeModal?.close()}openModal(e){this.activeModal&&this.activeModal.close(),new Ps(this.app,this,e).open()}async loadSettings(){let e=await this.loadData()??{};this.settings=Object.assign({},Vu,e),e.codeTheme===void 0&&(this.settings.codeTheme=Tn[this.settings.preset]?.codeTheme??Vu.codeTheme),this.presetSnapshots=e.presetSnapshots??{},this.validateSettings()}validateSettings(){let e=this.settings;e.preset in Tn||(console.warn(`[advanced-pdf-export] Unknown preset "${e.preset}", resetting to "default".`),e.preset="default"),e.fontSize=Math.max(1,e.fontSize),e.headerFontSize=Math.max(1,e.headerFontSize),e.footerFontSize=Math.max(1,e.footerFontSize),e.marginTop=Math.max(0,e.marginTop),e.marginBottom=Math.max(0,e.marginBottom),e.marginLeft=Math.max(0,e.marginLeft),e.marginRight=Math.max(0,e.marginRight),e.customPageWidth=Math.max(10,e.customPageWidth),e.customPageHeight=Math.max(10,e.customPageHeight),e.previewScale=Math.max(.1,Math.min(3,e.previewScale)),e.pageNumberStart=Math.max(1,e.pageNumberStart)}async saveSettings(){await this.saveData({...this.settings,presetSnapshots:this.presetSnapshots})}async saveSettingsAndRender(){await this.saveSettings(),this.activeModal?.render()}applyPreset(e,r=!1){let n=Tn[e];n&&(r?delete this.presetSnapshots[e]:this.presetSnapshots[this.settings.preset]=lm(this.settings),this.settings.preset=e,Object.assign(this.settings,n,r?{}:this.presetSnapshots[e]??{}))}};function Om(t,e){if(e)return e;let r=t.workspace.getActiveFile();if(r?.extension==="md")return r;let n=t.workspace.getMostRecentLeaf();return n?.view instanceof N.MarkdownView?n.view.file??null:null}var Ps=class t extends N.Modal{plugin;editorEl;previewEl;pageCountEl;noteTitleEl;renderBtn;exportBtn;loadingOverlayEl;renderComponent=new N.Component;initialFile;currentFile=null;renderToken=0;layoutCache=null;renderDebounceTimer=null;constructor(e,r,n){super(e),this.plugin=r,this.initialFile=n??null}async onOpen(){this.plugin.activeModal=this,this.renderComponent.load(),this.modalEl.addClass("mpdf-modal"),this.buildUI(this.contentEl);let e=Om(this.app,this.initialFile);if(e){let r;try{r=await this.app.vault.read(e)}catch(n){let o=n instanceof Error?n.message:String(n);new N.Notice(`Failed to read file "${e.basename}": ${o}`);return}if(!this.plugin.activeModal)return;this.currentFile=e,this.editorEl.value=r,this.noteTitleEl.textContent=e.basename,this.noteTitleEl.title=e.path,this.render(!0)}}onClose(){this.renderDebounceTimer!==null&&(window.clearTimeout(this.renderDebounceTimer),this.renderDebounceTimer=null),this.renderComponent.unload(),this.plugin.activeModal=null,this.currentFile=null,this.layoutCache=null}buildUI(e){let r=this.plugin.settings;this.buildTopbar(e.createEl("div",{cls:"mpdf-topbar"}),r);let n=e.createEl("div",{cls:"mpdf-main"}),o=n.createEl("div",{cls:"mpdf-editor-panel"});this.editorEl=o.createEl("textarea",{cls:"mpdf-editor"}),this.editorEl.placeholder=`Type or paste markdown here to preview and export as PDF. Tip: open this panel from a note's right-click menu, command palette, or keyboard shortcut to auto-load the active note. diff --git a/main.ts b/main.ts index a8b8d6b..cf66a5a 100644 --- a/main.ts +++ b/main.ts @@ -58,7 +58,7 @@ interface ElectronBrowserWindow { printBackground: boolean; preferCSSPageSize?: boolean; margins: { marginType: string }; - }): Promise; + }): Promise; }; } @@ -77,7 +77,7 @@ interface ElectronRemote { } interface ElectronFs { - writeFile(path: string, data: Buffer, cb: (err: Error | null) => void): void; + writeFile(path: string, data: Uint8Array, cb: (err: Error | null) => void): void; } interface ElectronBridge { @@ -1608,7 +1608,7 @@ function extractOutlineEntries(layouts: PageLayout[]): OutlineEntry[] { * collapsed by default (negative /Count per PDF spec). PageMode is set to * UseOutlines so readers open the bookmarks panel on load. */ -async function injectPDFOutline(pdfBuffer: Buffer, entries: OutlineEntry[]): Promise { +async function injectPDFOutline(pdfBuffer: Uint8Array, entries: OutlineEntry[]): Promise { if (!entries.length) return pdfBuffer; const pdfDoc = await PDFDocument.load(pdfBuffer); @@ -1709,7 +1709,7 @@ async function injectPDFOutline(pdfBuffer: Buffer, entries: OutlineEntry[]): Pro pdfDoc.catalog.set(PDFName.of("Outlines"), outlineRef); pdfDoc.catalog.set(PDFName.of("PageMode"), PDFName.of("UseOutlines")); - return Buffer.from(await pdfDoc.save()); + return await pdfDoc.save(); } // ─── Header / footer / frame rendering helpers ─────────────────────────────── @@ -2651,7 +2651,7 @@ ${pageHTMLParts.join("\n")} margins: { marginType: "none" }, }); }) - .then(async (data: Buffer) => { + .then(async (data: Uint8Array) => { // printToPDF produces a flat PDF with no outline; inject one via pdf-lib. if (s.includeOutline) { try {