[{"data":1,"prerenderedAt":933},["ShallowReactive",2],{"navigation_docs":3,"-api-security":139,"-api-security-surround":929},[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":27,"body":141,"description":922,"extension":923,"links":924,"meta":925,"navigation":352,"path":28,"seo":926,"stem":29,"__hash__":928},"docs\u002Fapi\u002F05.security.md",{"type":142,"value":143,"toc":909},"minimark",[144,148,156,161,302,466,499,502,507,555,605,611,615,618,621,663,668,672,744,747,755,760,770,780,784,789,793,796,819,822,828,832,862,866,891,895,898,905],[145,146,27],"h1",{"id":147},"security",[149,150,151,152,155],"p",{},"Create password-protected PDFs with the ",[153,154,147],"code",{}," prop.",[157,158,160],"h2",{"id":159},"security-options","Security options",[162,163,164,183],"table",{},[165,166,167],"thead",{},[168,169,170,174,177,180],"tr",{},[171,172,173],"th",{},"Option",[171,175,176],{},"Type",[171,178,179],{},"Default",[171,181,182],{},"Description",[184,185,186,205,225,243,263,284],"tbody",{},[168,187,188,194,199,202],{},[189,190,191],"td",{},[153,192,193],{},"enabled",[189,195,196],{},[153,197,198],{},"boolean",[189,200,201],{},"compatibility-resolved",[189,203,204],{},"Explicitly enable\u002Fdisable the direct security layer.",[168,206,207,212,217,222],{},[189,208,209],{},[153,210,211],{},"userPassword",[189,213,214],{},[153,215,216],{},"string",[189,218,219],{},[153,220,221],{},"''",[189,223,224],{},"Password required to open the PDF.",[168,226,227,232,236,240],{},[189,228,229],{},[153,230,231],{},"ownerPassword",[189,233,234],{},[153,235,216],{},[189,237,238],{},[153,239,221],{},[189,241,242],{},"Owner-level password used by the PDF encryption layer.",[168,244,245,250,255,260],{},[189,246,247],{},[153,248,249],{},"passwordParts",[189,251,252],{},[153,253,254],{},"Array\u003Cstring | number>",[189,256,257],{},[153,258,259],{},"[]",[189,261,262],{},"Parts combined into one final open password.",[168,264,265,270,274,278],{},[189,266,267],{},[153,268,269],{},"passwordSeparator",[189,271,272],{},[153,273,216],{},[189,275,276],{},[153,277,221],{},[189,279,280,281,283],{},"Separator used when joining ",[153,282,249],{},".",[168,285,286,291,296,299],{},[189,287,288],{},[153,289,290],{},"permissions",[189,292,293],{},[153,294,295],{},"PdfPermission[]",[189,297,298],{},"viewer-dependent",[189,300,301],{},"Requested PDF permission flags.",[303,304,309],"pre",{"className":305,"code":306,"language":307,"meta":308,"style":308},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { PdfSecurityOptions } from 'vue-pdf-export'\n\nconst security: PdfSecurityOptions = {\n  enabled: true,\n  userPassword: 'open123',\n  ownerPassword: 'owner456',\n  permissions: ['print', 'copy'],\n}\n","ts","",[153,310,311,347,354,376,392,410,427,460],{"__ignoreMap":308},[312,313,316,320,323,327,331,334,337,340,344],"span",{"class":314,"line":315},"line",1,[312,317,319],{"class":318},"s7zQu","import",[312,321,322],{"class":318}," type",[312,324,326],{"class":325},"sMK4o"," {",[312,328,330],{"class":329},"sTEyZ"," PdfSecurityOptions",[312,332,333],{"class":325}," }",[312,335,336],{"class":318}," from",[312,338,339],{"class":325}," '",[312,341,343],{"class":342},"sfazB","vue-pdf-export",[312,345,346],{"class":325},"'\n",[312,348,350],{"class":314,"line":349},2,[312,351,353],{"emptyLinePlaceholder":352},true,"\n",[312,355,357,361,364,367,370,373],{"class":314,"line":356},3,[312,358,360],{"class":359},"spNyl","const",[312,362,363],{"class":329}," security",[312,365,366],{"class":325},":",[312,368,330],{"class":369},"sBMFI",[312,371,372],{"class":325}," =",[312,374,375],{"class":325}," {\n",[312,377,379,383,385,389],{"class":314,"line":378},4,[312,380,382],{"class":381},"swJcz","  enabled",[312,384,366],{"class":325},[312,386,388],{"class":387},"sfNiH"," true",[312,390,391],{"class":325},",\n",[312,393,395,398,400,402,405,408],{"class":314,"line":394},5,[312,396,397],{"class":381},"  userPassword",[312,399,366],{"class":325},[312,401,339],{"class":325},[312,403,404],{"class":342},"open123",[312,406,407],{"class":325},"'",[312,409,391],{"class":325},[312,411,413,416,418,420,423,425],{"class":314,"line":412},6,[312,414,415],{"class":381},"  ownerPassword",[312,417,366],{"class":325},[312,419,339],{"class":325},[312,421,422],{"class":342},"owner456",[312,424,407],{"class":325},[312,426,391],{"class":325},[312,428,430,433,435,438,440,443,445,448,450,453,455,458],{"class":314,"line":429},7,[312,431,432],{"class":381},"  permissions",[312,434,366],{"class":325},[312,436,437],{"class":329}," [",[312,439,407],{"class":325},[312,441,442],{"class":342},"print",[312,444,407],{"class":325},[312,446,447],{"class":325},",",[312,449,339],{"class":325},[312,451,452],{"class":342},"copy",[312,454,407],{"class":325},[312,456,457],{"class":329},"]",[312,459,391],{"class":325},[312,461,463],{"class":314,"line":462},8,[312,464,465],{"class":325},"}\n",[303,467,471],{"className":468,"code":469,"language":470,"meta":308,"style":308},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CHtml2Pdf :security=\"security\" \u002F>\n","vue",[153,472,473],{"__ignoreMap":308},[312,474,475,478,481,484,486,489,492,494,496],{"class":314,"line":315},[312,476,477],{"class":325},"\u003C",[312,479,480],{"class":381},"Html2Pdf",[312,482,483],{"class":325}," :",[312,485,147],{"class":359},[312,487,488],{"class":325},"=",[312,490,491],{"class":325},"\"",[312,493,147],{"class":329},[312,495,491],{"class":325},[312,497,498],{"class":325}," \u002F>\n",[149,500,501],{},"Password protection works in both canvas and selectable-text render modes.",[503,504,506],"h3",{"id":505},"permission-flags","Permission flags",[303,508,510],{"className":305,"code":509,"language":307,"meta":308,"style":308},"type PdfPermission = 'print' | 'modify' | 'copy' | 'annot-forms'\n",[153,511,512],{"__ignoreMap":308},[312,513,514,517,520,522,524,526,528,531,533,536,538,540,542,544,546,548,550,553],{"class":314,"line":315},[312,515,516],{"class":359},"type",[312,518,519],{"class":369}," PdfPermission",[312,521,372],{"class":325},[312,523,339],{"class":325},[312,525,442],{"class":342},[312,527,407],{"class":325},[312,529,530],{"class":325}," |",[312,532,339],{"class":325},[312,534,535],{"class":342},"modify",[312,537,407],{"class":325},[312,539,530],{"class":325},[312,541,339],{"class":325},[312,543,452],{"class":342},[312,545,407],{"class":325},[312,547,530],{"class":325},[312,549,339],{"class":325},[312,551,552],{"class":342},"annot-forms",[312,554,346],{"class":325},[162,556,557,567],{},[165,558,559],{},[168,560,561,564],{},[171,562,563],{},"Permission",[171,565,566],{},"What it allows",[184,568,569,578,587,596],{},[168,570,571,575],{},[189,572,573],{},[153,574,442],{},[189,576,577],{},"Allows printing when the PDF viewer enforces document permissions.",[168,579,580,584],{},[189,581,582],{},[153,583,452],{},[189,585,586],{},"Allows text\u002Fcontent copying and extraction when the viewer enforces permissions.",[168,588,589,593],{},[189,590,591],{},[153,592,535],{},[189,594,595],{},"Allows document modification\u002Fediting when supported by the viewer.",[168,597,598,602],{},[189,599,600],{},[153,601,552],{},[189,603,604],{},"Allows annotations and form-related changes when supported by the viewer.",[606,607,608],"blockquote",{},[149,609,610],{},"PDF permission enforcement depends on the PDF viewer. Password encryption is part of the PDF itself, while permission flags rely on viewer compliance.",[503,612,614],{"id":613},"security-guidance","Security guidance",[149,616,617],{},"The package can generate encrypted\u002Fpassword-protected PDFs, but PDF security should be treated as one layer of application security rather than a replacement for access control.",[149,619,620],{},"Important boundaries:",[622,623,624,632,638,644,654,657,660],"ul",{},[625,626,627,631],"li",{},[628,629,630],"strong",{},"User\u002Fopen password"," controls opening an encrypted PDF.",[625,633,634,637],{},[628,635,636],{},"Owner password"," is used by the PDF encryption layer for owner-level access\u002Fpermission configuration.",[625,639,640,643],{},[628,641,642],{},"Permission flags are viewer-dependent."," Some PDF viewers may not enforce them identically.",[625,645,646,649,650,653],{},[153,647,648],{},"headerHtml"," and ",[153,651,652],{},"footerHtml"," are intentionally trusted developer HTML. Do not pass unsanitized user-controlled HTML.",[625,655,656],{},"Remote images are fetched by the browser. Use trusted origins, correct CORS headers, and avoid exposing secrets in image URLs.",[625,658,659],{},"Passwords exist in browser memory while a PDF is being generated. Do not hard-code sensitive production passwords into public frontend source.",[625,661,662],{},"Generated Blob URLs are cleaned up by the component\u002Fcomposable lifecycle, but applications should still avoid retaining generated Blobs longer than necessary.",[149,664,665,667],{},[153,666,343],{}," is a client-side library and does not require a package-operated server to generate a PDF. Your application, remote assets, analytics, and surrounding infrastructure may still perform their own network requests.",[503,669,671],{"id":670},"password-parts","Password parts",[303,673,675],{"className":305,"code":674,"language":307,"meta":308,"style":308},"const security = {\n  enabled: true,\n  passwordParts: ['15081999', 4821],\n  passwordSeparator: '-',\n}\n",[153,676,677,688,698,724,740],{"__ignoreMap":308},[312,678,679,681,684,686],{"class":314,"line":315},[312,680,360],{"class":359},[312,682,683],{"class":329}," security ",[312,685,488],{"class":325},[312,687,375],{"class":325},[312,689,690,692,694,696],{"class":314,"line":349},[312,691,382],{"class":381},[312,693,366],{"class":325},[312,695,388],{"class":387},[312,697,391],{"class":325},[312,699,700,703,705,707,709,712,714,716,720,722],{"class":314,"line":356},[312,701,702],{"class":381},"  passwordParts",[312,704,366],{"class":325},[312,706,437],{"class":329},[312,708,407],{"class":325},[312,710,711],{"class":342},"15081999",[312,713,407],{"class":325},[312,715,447],{"class":325},[312,717,719],{"class":718},"sbssI"," 4821",[312,721,457],{"class":329},[312,723,391],{"class":325},[312,725,726,729,731,733,736,738],{"class":314,"line":378},[312,727,728],{"class":381},"  passwordSeparator",[312,730,366],{"class":325},[312,732,339],{"class":325},[312,734,735],{"class":342},"-",[312,737,407],{"class":325},[312,739,391],{"class":325},[312,741,742],{"class":314,"line":394},[312,743,465],{"class":325},[149,745,746],{},"This creates one final open password:",[303,748,753],{"className":749,"code":751,"language":752,"meta":308},[750],"language-text","15081999-4821\n","text",[153,754,751],{"__ignoreMap":308},[149,756,757,759],{},[153,758,249],{}," do not create multiple independent passwords.",[149,761,762,763,765,766,769],{},"When ",[153,764,147],{}," is omitted, compatible raw ",[153,767,768],{},"htmlToPdfOptions.jsPDF.encryption"," values are preserved.",[149,771,762,772,775,776,779],{},[153,773,774],{},"security.enabled"," is explicitly ",[153,777,778],{},"false",", encryption is removed.",[157,781,783],{"id":782},"security-model-boundaries","Security Model & Boundaries",[149,785,786,788],{},[153,787,343],{}," provides PDF security features and conservative browser-side cleanup, but no client-side PDF package can make an application \"100% secure\" by itself.",[503,790,792],{"id":791},"verified-outcomes","Verified outcomes",[149,794,795],{},"The final regression suite verified:",[622,797,798,801,804,807,810,813,816],{},[625,799,800],{},"50-page Canvas generation",[625,802,803],{},"100-page Canvas generation",[625,805,806],{},"Canvas cancellation and recovery",[625,808,809],{},"selectable-text cancellation and recovery",[625,811,812],{},"repeated-image caching in selectable-text mode",[625,814,815],{},"page-bounded Canvas rendering in image-heavy documents",[625,817,818],{},"temporary rendering cleanup after cancellation\u002Fgeneration",[149,820,821],{},"The final unit suite completed with:",[303,823,826],{"className":824,"code":825,"language":752,"meta":308},[750],"19 test files passed\n106 \u002F 106 tests passed\n",[153,827,825],{"__ignoreMap":308},[503,829,831],{"id":830},"what-the-package-provides","What the package provides",[622,833,834,837,840,843,850,853,856,859],{},[625,835,836],{},"jsPDF-backed PDF encryption\u002Fpassword protection",[625,838,839],{},"separate user\u002Fopen and owner password inputs",[625,841,842],{},"supported permission flags for print, modify, copy, and annotation\u002Fforms",[625,844,845,846,849],{},"explicit ",[153,847,848],{},"security.enabled: false"," handling to remove inherited raw encryption",[625,851,852],{},"metadata\u002Fcompression processing without sending the document to a package-operated backend",[625,854,855],{},"Blob URL cleanup in the component\u002Fcomposable lifecycle",[625,857,858],{},"cancellation cleanup for temporary rendering structures",[625,860,861],{},"filename normalization that removes unsafe path\u002Ffilename characters and protects Windows reserved names",[503,863,865],{"id":864},"what-remains-the-applications-responsibility","What remains the application's responsibility",[622,867,868,876,879,882,885,888],{},[625,869,870,871,873,874],{},"sanitizing any untrusted HTML before passing it to ",[153,872,648],{}," or ",[153,875,652],{},[625,877,878],{},"protecting passwords, tokens, customer data, and remote asset URLs",[625,880,881],{},"server-side authorization before sensitive data reaches the browser",[625,883,884],{},"selecting CORS-safe and trusted image origins",[625,886,887],{},"deciding whether client-side PDF generation is appropriate for highly sensitive documents",[625,889,890],{},"validating the behavior of permission flags in the PDF viewers used by your customers",[503,892,894],{"id":893},"important-client-side-security-note","Important client-side security note",[149,896,897],{},"Anything available to frontend JavaScript can potentially be inspected by a user who controls that browser session. Do not treat a frontend bundle, minification, or obfuscation as a secret-storage mechanism.",[149,899,900,901,904],{},"Minifying the npm distribution is useful for package size and distribution hygiene, but it is ",[628,902,903],{},"not"," a security boundary.",[906,907,908],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":308,"searchDepth":349,"depth":349,"links":910},[911,916],{"id":159,"depth":349,"text":160,"children":912},[913,914,915],{"id":505,"depth":356,"text":506},{"id":613,"depth":356,"text":614},{"id":670,"depth":356,"text":671},{"id":782,"depth":349,"text":783,"children":917},[918,919,920,921],{"id":791,"depth":356,"text":792},{"id":830,"depth":356,"text":831},{"id":864,"depth":356,"text":865},{"id":893,"depth":356,"text":894},"Create password-protected PDFs with the security prop.","md",null,{},{"description":927,"title":27},"Passwords, owner password, permission flags and client-side security boundaries.","AhTFguvtB0jXDKbbHhj7lu_dlLO7OyPvkRjLJKMonsc",[930,932],{"title":23,"path":24,"stem":25,"description":931,"children":-1},"When enabled, the footer is applied to every PDF page. Header-style selective page targeting is not exposed as a separate footer API.",{"title":31,"path":32,"stem":33,"description":308,"children":-1},1788876780957]