[{"data":1,"prerenderedAt":659},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-performance-engineering":139,"-use-cases-performance-engineering-surround":655},[4,55,89],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":54},"API","i-lucide-braces","\u002Fapi","api",[10,14,18,22,26,30,34,38,42,46,50],{"title":11,"path":12,"stem":13},"Html2Pdf Component","\u002Fapi\u002Fcomponent","api\u002F01.component",{"title":15,"path":16,"stem":17},"Core Props","\u002Fapi\u002Fprops","api\u002F02.props",{"title":19,"path":20,"stem":21},"Headers","\u002Fapi\u002Fheaders","api\u002F03.headers",{"title":23,"path":24,"stem":25},"Footers","\u002Fapi\u002Ffooters","api\u002F04.footers",{"title":27,"path":28,"stem":29},"Security","\u002Fapi\u002Fsecurity","api\u002F05.security",{"title":31,"path":32,"stem":33},"Watermarks","\u002Fapi\u002Fwatermarks","api\u002F06.watermarks",{"title":35,"path":36,"stem":37},"Metadata & Compression","\u002Fapi\u002Fmetadata-compression","api\u002F07.metadata-compression",{"title":39,"path":40,"stem":41},"Programmatic API","\u002Fapi\u002Fprogrammatic-api","api\u002F08.programmatic-api",{"title":43,"path":44,"stem":45},"Loader, Progress, Events & Slots","\u002Fapi\u002Fevents-slots","api\u002F09.events-slots",{"title":47,"path":48,"stem":49},"TypeScript","\u002Fapi\u002Ftypescript","api\u002F10.typescript",{"title":51,"path":52,"stem":53},"Full README Reference","\u002Fapi\u002Ffull-reference","api\u002F11.full-reference",false,{"title":56,"icon":57,"path":58,"stem":59,"children":60,"page":54},"Get Started","i-lucide-book-open","\u002Fget-started","get-started",[61,65,69,73,77,81,85],{"title":62,"path":63,"stem":64},"Introduction","\u002Fget-started\u002Fintroduction","get-started\u002F01.introduction",{"title":66,"path":67,"stem":68},"Installation","\u002Fget-started\u002Finstallation","get-started\u002F02.installation",{"title":70,"path":71,"stem":72},"Quick Start","\u002Fget-started\u002Fquick-start","get-started\u002F03.quick-start",{"title":74,"path":75,"stem":76},"Rendering Modes","\u002Fget-started\u002Frendering-modes","get-started\u002F04.rendering-modes",{"title":78,"path":79,"stem":80},"Component Registration","\u002Fget-started\u002Fregistration","get-started\u002F05.registration",{"title":82,"path":83,"stem":84},"Preview & Download","\u002Fget-started\u002Fpreview-download","get-started\u002F06.preview-download",{"title":86,"path":87,"stem":88},"Pagination","\u002Fget-started\u002Fpagination","get-started\u002F07.pagination",{"title":90,"icon":91,"path":92,"stem":93,"children":94,"page":54},"Use Cases","i-lucide-flask-conical","\u002Fuse-cases","use-cases",[95,99,103,107,111,115,119,123,127,131,135],{"title":96,"path":97,"stem":98},"Playground","\u002Fuse-cases\u002Fplayground","use-cases\u002F01.playground",{"title":100,"path":101,"stem":102},"Selectable Text","\u002Fuse-cases\u002Fselectable-text","use-cases\u002F02.selectable-text",{"title":104,"path":105,"stem":106},"Clickable PDF Links","\u002Fuse-cases\u002Fclickable-links","use-cases\u002F03.clickable-links",{"title":108,"path":109,"stem":110},"Images & CORS","\u002Fuse-cases\u002Fimages-cors","use-cases\u002F04.images-cors",{"title":112,"path":113,"stem":114},"Production Guide","\u002Fuse-cases\u002Fproduction-guide","use-cases\u002F05.production-guide",{"title":116,"path":117,"stem":118},"Troubleshooting","\u002Fuse-cases\u002Ftroubleshooting","use-cases\u002F06.troubleshooting",{"title":120,"path":121,"stem":122},"Testing & Browser Support","\u002Fuse-cases\u002Ftesting-browser-support","use-cases\u002F07.testing-browser-support",{"title":124,"path":125,"stem":126},"Performance Engineering","\u002Fuse-cases\u002Fperformance-engineering","use-cases\u002F08.performance-engineering",{"title":128,"path":129,"stem":130},"Full Performance Engineering Report","\u002Fuse-cases\u002Fperformance-report","use-cases\u002F09.performance-report",{"title":132,"path":133,"stem":134},"Community & Feedback","\u002Fuse-cases\u002Fcommunity","use-cases\u002F10.community",{"title":136,"path":137,"stem":138},"Acknowledgements","\u002Fuse-cases\u002Facknowledgements","use-cases\u002F11.acknowledgements",{"id":140,"title":124,"body":141,"description":151,"extension":648,"links":649,"meta":650,"navigation":651,"path":125,"seo":652,"stem":126,"__hash__":654},"docs\u002Fuse-cases\u002F08.performance-engineering.md",{"type":142,"value":143,"toc":638},"minimark",[144,148,152,157,203,207,362,366,457,465,469,598,601,605,612,622,625,629,632],[145,146,124],"h1",{"id":147},"performance-engineering",[149,150,151],"p",{},"The large-document milestone was not only a benchmark exercise. It changed the runtime architecture and added repeatable correctness, cleanup and memory diagnostics.",[153,154,156],"h2",{"id":155},"executive-outcome","Executive outcome",[158,159,160,164,167,170,173,176,194,197,200],"ul",{},[161,162,163],"li",{},"paginated Canvas documents can render page by page instead of one giant document-height canvas",[161,165,166],{},"50-page and 100-page Canvas exports are verified as real, non-empty PDFs on the incremental path",[161,168,169],{},"static HTML footer content is rasterized once and reused across pages",[161,171,172],{},"selectable-text mode caches repeated image sources within one generation",[161,174,175],{},"long work can be cancelled and then safely regenerated",[161,177,178,179,183,184,183,187,190,191],{},"progress can expose ",[180,181,182],"code",{},"stage",", ",[180,185,186],{},"progress",[180,188,189],{},"currentPage"," and ",[180,192,193],{},"totalPages",[161,195,196],{},"temporary DOM, Canvas backing stores and encoded image references are released earlier",[161,198,199],{},"browser yielding was added between expensive chunks",[161,201,202],{},"encrypted raster memory retention was isolated and reproduced directly in jsPDF",[153,204,206],{"id":205},"phase-map","Phase map",[208,209,210,226],"table",{},[211,212,213],"thead",{},[214,215,216,220,223],"tr",{},[217,218,219],"th",{},"Phase",[217,221,222],{},"Focus",[217,224,225],{},"Result",[227,228,229,241,252,263,274,285,296,307,318,329,340,351],"tbody",{},[214,230,231,235,238],{},[232,233,234],"td",{},"Phase 1",[232,236,237],{},"Benchmark\u002Fstress foundation",[232,239,240],{},"Actual page count, Blob size, Canvas geometry, timing, memory and progress telemetry.",[214,242,243,246,249],{},[232,244,245],{},"Phase 2.1",[232,247,248],{},"Static HTML footer bottleneck",[232,250,251],{},"Render once + reuse; major time, output-size and heap reductions in the fixture.",[214,253,254,257,260],{},[232,255,256],{},"Phase 2.2",[232,258,259],{},"Clean memory isolation",[232,261,262],{},"Fresh-context methodology separated temporary peaks from retained heap.",[214,264,265,268,271],{},[232,266,267],{},"Phase 2.3A",[232,269,270],{},"Security isolation",[232,272,273],{},"Basic user-password encryption identified as the trigger for high raster retention.",[214,275,276,279,282],{},[232,277,278],{},"Phase 2.3B",[232,280,281],{},"Large-PDF correctness",[232,283,284],{},"Page count alone was proven insufficient; Blob size and Canvas telemetry were added.",[214,286,287,290,293],{},[232,288,289],{},"Phase 2.4",[232,291,292],{},"Scaling and cliff diagnostics",[232,294,295],{},"Raster payload + jsPDF encryption pattern isolated; legacy long-canvas failure instrumented.",[214,297,298,301,304],{},[232,299,300],{},"Phase 3.1",[232,302,303],{},"Incremental Canvas",[232,305,306],{},"Page-bounded captures replaced the giant capture for paginated Canvas documents.",[214,308,309,312,315],{},[232,310,311],{},"Phase 3.2",[232,313,314],{},"Security re-test",[232,316,317],{},"Giant-canvas issue addressed; encrypted-raster retention remained dependency-level.",[214,319,320,323,326],{},[232,321,322],{},"Phase 3.2.1",[232,324,325],{},"Raw jsPDF reproduction",[232,327,328],{},"Strongest retention pattern reproduced without Vue component lifecycle.",[214,330,331,334,337],{},[232,332,333],{},"Phase 3.3",[232,335,336],{},"Cancellation + progress",[232,338,339],{},"Cooperative cancellation, recovery and current-page progress added.",[214,341,342,345,348],{},[232,343,344],{},"Phase 3.4",[232,346,347],{},"Repeated assets + cleanup",[232,349,350],{},"Per-generation image cache and shorter DOM\u002FCanvas lifetimes.",[214,352,353,356,359],{},[232,354,355],{},"Phase 3.5",[232,357,358],{},"Routing regression hardening",[232,360,361],{},"Correct incremental Canvas branch restored and protected by 50\u002F100-page E2E tests.",[153,363,365],{"id":364},"headline-measured-results","Headline measured results",[208,367,368,385],{},[211,369,370],{},[214,371,372,375,379,382],{},[217,373,374],{},"Metric",[217,376,378],{"align":377},"right","Before",[217,380,381],{"align":377},"After",[217,383,384],{"align":377},"Improvement",[227,386,387,401,415,429,443],{},[214,388,389,392,395,398],{},[232,390,391],{},"HTML footer, no logo",[232,393,394],{"align":377},"7.82 s",[232,396,397],{"align":377},"1.43 s",[232,399,400],{"align":377},"~81.7% less time \u002F 5.47× faster",[214,402,403,406,409,412],{},[232,404,405],{},"HTML footer + logo",[232,407,408],{"align":377},"11.81 s",[232,410,411],{"align":377},"1.29 s",[232,413,414],{"align":377},"~89.1% less time \u002F 9.16× faster",[214,416,417,420,423,426],{},[232,418,419],{},"Footer-heavy PDF",[232,421,422],{"align":377},"~46.7 MB",[232,424,425],{"align":377},"~1.0 MB",[232,427,428],{"align":377},"~97.9% smaller",[214,430,431,434,437,440],{},[232,432,433],{},"No-logo peak heap",[232,435,436],{"align":377},"102.6 MB",[232,438,439],{"align":377},"26.5 MB",[232,441,442],{"align":377},"~74.2% lower",[214,444,445,448,451,454],{},[232,446,447],{},"Giant Canvas capture geometry",[232,449,450],{"align":377},"~99.96M px",[232,452,453],{"align":377},"~1.74M px\u002Fpage",[232,455,456],{"align":377},"~98.26% lower peak capture area",[149,458,459,460,464],{},"These percentages describe specific benchmark fixtures or capture geometry; they are ",[461,462,463],"strong",{},"not"," universal whole-package speed or memory guarantees.",[153,466,468],{"id":467},"current-incremental-canvas-correctness","Current incremental Canvas correctness",[208,470,471,490],{},[211,472,473],{},[214,474,475,478,481,484,487],{},[217,476,477],{"align":377},"Requested pages",[217,479,480],{"align":377},"Actual pages",[217,482,483],{"align":377},"Time",[217,485,486],{"align":377},"PDF size",[217,488,489],{},"Largest encoded Canvas",[227,491,492,508,523,538,553,568,583],{},[214,493,494,497,499,502,505],{},[232,495,496],{"align":377},"10",[232,498,496],{"align":377},[232,500,501],{"align":377},"1.53 s",[232,503,504],{"align":377},"1.5 MB",[232,506,507],{},"1191 × 1461",[214,509,510,513,515,518,521],{},[232,511,512],{"align":377},"25",[232,514,512],{"align":377},[232,516,517],{"align":377},"4.33 s",[232,519,520],{"align":377},"3.9 MB",[232,522,507],{},[214,524,525,528,530,533,536],{},[232,526,527],{"align":377},"40",[232,529,527],{"align":377},[232,531,532],{"align":377},"7.54 s",[232,534,535],{"align":377},"6.2 MB",[232,537,507],{},[214,539,540,543,545,548,551],{},[232,541,542],{"align":377},"50",[232,544,542],{"align":377},[232,546,547],{"align":377},"9.68 s",[232,549,550],{"align":377},"7.8 MB",[232,552,507],{},[214,554,555,558,560,563,566],{},[232,556,557],{"align":377},"60",[232,559,557],{"align":377},[232,561,562],{"align":377},"12.56 s",[232,564,565],{"align":377},"9.3 MB",[232,567,507],{},[214,569,570,573,575,578,581],{},[232,571,572],{"align":377},"75",[232,574,572],{"align":377},[232,576,577],{"align":377},"16.87 s",[232,579,580],{"align":377},"11.7 MB",[232,582,507],{},[214,584,585,588,590,593,596],{},[232,586,587],{"align":377},"100",[232,589,587],{"align":377},[232,591,592],{"align":377},"25.25 s",[232,594,595],{"align":377},"15.8 MB",[232,597,507],{},[149,599,600],{},"The maximum encoded Canvas remained page-sized as the requested page count increased.",[153,602,604],{"id":603},"encrypted-raster-pdfs","Encrypted raster PDFs",[149,606,607,608,611],{},"The strongest high-retention behavior was reproduced with raw jsPDF, so the project documents it as ",[461,609,610],{},"memory retention"," rather than mislabeling it as a permanent Vue memory leak.",[149,613,614,615],{},"Upstream issue: ",[616,617,621],"a",{"href":618,"rel":619},"https:\u002F\u002Fgithub.com\u002Fparallax\u002FjsPDF\u002Fissues\u002F4017",[620],"nofollow","jsPDF #4017 - encrypted raster PDF memory retention",[149,623,624],{},"For large text-heavy secured documents whose CSS is supported by the vector renderer, selectable-text mode can be much lighter than raster Canvas mode. This is workload-dependent, not a universal renderer benchmark.",[153,626,628],{"id":627},"verification-mindset","Verification mindset",[149,630,631],{},"Large exports are checked with more than “the Promise resolved”: actual page count, Blob size, Canvas dimensions, cancellation\u002Frecovery and cleanup signals are part of the regression strategy.",[149,633,634,637],{},[616,635,636],{"href":129},"Read the complete phase-by-phase engineering report",".",{"title":639,"searchDepth":640,"depth":640,"links":641},"",2,[642,643,644,645,646,647],{"id":155,"depth":640,"text":156},{"id":205,"depth":640,"text":206},{"id":364,"depth":640,"text":365},{"id":467,"depth":640,"text":468},{"id":603,"depth":640,"text":604},{"id":627,"depth":640,"text":628},"md",null,{},true,{"description":653,"title":124},"Phase-by-phase large-document performance, memory, cancellation and regression engineering for vue-pdf-export.","-wqs7r8pAoGm6uqLMkHqpsybQnsDsfzkSelTXBJ43dw",[656,658],{"title":120,"path":121,"stem":122,"description":657,"children":-1},"The package targets modern browsers supported by Vue and the underlying PDF\u002Fbrowser APIs.",{"title":128,"path":129,"stem":130,"description":639,"children":-1},1788876780323]