Security (Vue)

This sample shows how to password protect PDF file and how to set PDF file permissions using PdfDocument's userPassword, ownerPassword, permissions, version properties and wijmo.pdf.security module.

Learn about Wijmo | PdfDocument API Reference

This example uses Vue.

app.vue
index.html
Copy to CodeMine
<template> <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-heading"> Security settings </div> <div class="panel-body"> <div class="row"> <div class="col-sm-3"> <input type="text" class="form-control" placeholder="User password" v-model="opts.userPassword" /> </div> <div class="col-sm-3"> <input type="text" class="form-control" placeholder="Owner password" v-model="opts.ownerPassword" /> </div> </div> <hr /> <div class="row"> <div class="col-sm-3"> <wj-menu :value="opts.version" :header="'PDF version'" :itemClicked="versionChanged"> <wj-menu-item :value="PdfVersionEnum.v1_3">1.3</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_4">1.4</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_5">1.5</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_6">1.6</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_7">1.7</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_7Ext3">1.7 ExtensionLevel 3</wj-menu-item> </wj-menu> </div> </div> <hr /> <div class="row"> <div class="col"> <b>Permissions</b> (require owner password) </div> </div> <div class="row"> <div class="col-sm-3"> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.annotating" />Annotating </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.contentAccessibility" />ContentAccessibility </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.copying" />Copying </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.documentAssembly" />DocumentAssembly </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.fillingForms" />FillingForms </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.modifying" />Modifying </label> </div> </div> </div> <div class="row"> <div class="col-sm-2">Printing</div> </div> <div class="row"> <div class="col-sm-6"> <label class="radio-inline"> <input name="printing" type="radio" :value="PdfPrintPermissionEnum.NotAllowed" v-model="opts.permissions.printing" checked />NotAllowed </label> <label class="radio-inline"> <input name="printing" type="radio" :value="PdfPrintPermissionEnum.AllowLowResolution" v-model="opts.permissions.printing" />AllowLowResolution </label> <label class="radio-inline"> <input name="printing" type="radio" :value="PdfPrintPermissionEnum.AllowHighResolution" v-model="opts.permissions.printing" />AllowHighResolution </label> </div> </div> </div> </div> <button class="btn btn-default" @click="drawPdf">Draw PDF</button> </div> </template> <script setup> import { PdfVersion, PdfPrintPermission, saveBlob, PdfDocument } from "@mescius/wijmo.pdf"; import "@mescius/wijmo.pdf.security"; import { ref } from "vue"; const PdfVersionEnum = ref(PdfVersion); const PdfPrintPermissionEnum = ref(PdfPrintPermission); const opts = ref({ userPassword: undefined, ownerPassword: undefined, version: PdfVersion.v1_3, permissions: { annotating: false, contentAccessibility: false, copying: false, documentAssembly: false, fillingForms: false, modifying: false, printing: PdfPrintPermission.NotAllowed, }, }); function drawPdf() { let p = opts.value.permissions, doc = new PdfDocument({ userPassword: opts.value.userPassword, ownerPassword: opts.value.ownerPassword, version: opts.value.version, permissions: { annotating: p.annotating, contentAccessibility: p.contentAccessibility, copying: p.copying, documentAssembly: p.documentAssembly, fillingForms: p.fillingForms, modifying: p.modifying, printing: p.printing, }, ended: (doc, args) => saveBlob(args.blob, "Document.pdf"), }); // doc.drawText("Demo page."); // doc.end(); } function versionChanged(sender) { if (sender.selectedValue) { opts.value.version = sender.selectedValue; } } </script> <style> body { margin-bottom: 24px; } </style>
<template> <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-heading"> Security settings </div> <div class="panel-body"> <div class="row"> <div class="col-sm-3"> <input type="text" class="form-control" placeholder="User password" v-model="opts.userPassword" /> </div> <div class="col-sm-3"> <input type="text" class="form-control" placeholder="Owner password" v-model="opts.ownerPassword" /> </div> </div> <hr /> <div class="row"> <div class="col-sm-3"> <wj-menu :value="opts.version" :header="'PDF version'" :itemClicked="versionChanged"> <wj-menu-item :value="PdfVersionEnum.v1_3">1.3</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_4">1.4</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_5">1.5</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_6">1.6</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_7">1.7</wj-menu-item> <wj-menu-item :value="PdfVersionEnum.v1_7Ext3">1.7 ExtensionLevel 3</wj-menu-item> </wj-menu> </div> </div> <hr /> <div class="row"> <div class="col"> <b>Permissions</b> (require owner password) </div> </div> <div class="row"> <div class="col-sm-3"> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.annotating" />Annotating </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.contentAccessibility" />ContentAccessibility </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.copying" />Copying </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.documentAssembly" />DocumentAssembly </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.fillingForms" />FillingForms </label> </div> <div class="checkbox"> <label> <input type="checkbox" v-model="opts.permissions.modifying" />Modifying </label> </div> </div> </div> <div class="row"> <div class="col-sm-2">Printing</div> </div> <div class="row"> <div class="col-sm-6"> <label class="radio-inline"> <input name="printing" type="radio" :value="PdfPrintPermissionEnum.NotAllowed" v-model="opts.permissions.printing" checked />NotAllowed </label> <label class="radio-inline"> <input name="printing" type="radio" :value="PdfPrintPermissionEnum.AllowLowResolution" v-model="opts.permissions.printing" />AllowLowResolution </label> <label class="radio-inline"> <input name="printing" type="radio" :value="PdfPrintPermissionEnum.AllowHighResolution" v-model="opts.permissions.printing" />AllowHighResolution </label> </div> </div> </div> </div> <button class="btn btn-default" @click="drawPdf">Draw PDF</button> </div> </template> <script setup> import { PdfVersion, PdfPrintPermission, saveBlob, PdfDocument } from "@mescius/wijmo.pdf"; import "@mescius/wijmo.pdf.security"; import { ref } from "vue"; const PdfVersionEnum = ref(PdfVersion); const PdfPrintPermissionEnum = ref(PdfPrintPermission); const opts = ref({ userPassword: undefined, ownerPassword: undefined, version: PdfVersion.v1_3, permissions: { annotating: false, contentAccessibility: false, copying: false, documentAssembly: false, fillingForms: false, modifying: false, printing: PdfPrintPermission.NotAllowed, }, }); function drawPdf() { let p = opts.value.permissions, doc = new PdfDocument({ userPassword: opts.value.userPassword, ownerPassword: opts.value.ownerPassword, version: opts.value.version, permissions: { annotating: p.annotating, contentAccessibility: p.contentAccessibility, copying: p.copying, documentAssembly: p.documentAssembly, fillingForms: p.fillingForms, modifying: p.modifying, printing: p.printing, }, ended: (doc, args) => saveBlob(args.blob, "Document.pdf"), }); // doc.drawText("Demo page."); // doc.end(); } function versionChanged(sender) { if (sender.selectedValue) { opts.value.version = sender.selectedValue; } } </script> <style> body { margin-bottom: 24px; } </style>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo PDF Security</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="compiler.js" type="module"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.21.5/system.src.js" integrity="sha512-skZbMyvYdNoZfLmiGn5ii6KmklM82rYX2uWctBhzaXPxJgiv4XBwJnFGr5k8s+6tE1pcR1nuTKghozJHyzMcoA==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app.js'); </script> </head> <body> <div id="app"></div> </body> </html>
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' }, '*.vue': { loader: '../plugin-vue/index.js' } //'*.vue': { loader: 'systemjs-plugin-vue' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/wijmo': 'npm:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'npm:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'npm:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'npm:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'npm:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'npm:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'npm:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'npm:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'npm:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'npm:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'npm:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'npm:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'npm:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'npm:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'npm:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'npm:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'npm:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.style': 'npm:@mescius/wijmo.grid.style/index.js', '@mescius/wijmo.grid.grouppanel': 'npm:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'npm:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'npm:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'npm:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'npm:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'npm:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'npm:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'npm:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'npm:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'npm:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'npm:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'npm:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'npm:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'npm:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'npm:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'npm:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'npm:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'npm:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.barcode': 'npm:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'npm:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'npm:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'npm:@mescius/wijmo.barcode.specialized/index.js', "@mescius/wijmo.vue2.chart.analytics": "npm:@mescius/wijmo.vue2.chart.analytics/index.js", "@mescius/wijmo.vue2.chart.animation": "npm:@mescius/wijmo.vue2.chart.animation/index.js", "@mescius/wijmo.vue2.chart.annotation": "npm:@mescius/wijmo.vue2.chart.annotation/index.js", "@mescius/wijmo.vue2.chart.finance.analytics": "npm:@mescius/wijmo.vue2.chart.finance.analytics/index.js", "@mescius/wijmo.vue2.chart.finance": "npm:@mescius/wijmo.vue2.chart.finance/index.js", "@mescius/wijmo.vue2.chart.hierarchical": "npm:@mescius/wijmo.vue2.chart.hierarchical/index.js", "@mescius/wijmo.vue2.chart.interaction": "npm:@mescius/wijmo.vue2.chart.interaction/index.js", "@mescius/wijmo.vue2.chart.radar": "npm:@mescius/wijmo.vue2.chart.radar/index.js", '@mescius/wijmo.vue2.chart.map': 'npm:@mescius/wijmo.vue2.chart.map/index.js', "@mescius/wijmo.vue2.chart": "npm:@mescius/wijmo.vue2.chart/index.js", "@mescius/wijmo.vue2.core": "npm:@mescius/wijmo.vue2.core/index.js", "@mescius/wijmo.vue2.gauge": "npm:@mescius/wijmo.vue2.gauge/index.js", "@mescius/wijmo.vue2.grid.detail": "npm:@mescius/wijmo.vue2.grid.detail/index.js", "@mescius/wijmo.vue2.grid.filter": "npm:@mescius/wijmo.vue2.grid.filter/index.js", "@mescius/wijmo.vue2.grid.grouppanel": "npm:@mescius/wijmo.vue2.grid.grouppanel/index.js", '@mescius/wijmo.vue2.grid.search': 'npm:@mescius/wijmo.vue2.grid.search/index.js', "@mescius/wijmo.vue2.grid.multirow": "npm:@mescius/wijmo.vue2.grid.multirow/index.js", "@mescius/wijmo.vue2.grid.sheet": "npm:@mescius/wijmo.vue2.grid.sheet/index.js", '@mescius/wijmo.vue2.grid.transposed': 'npm:@mescius/wijmo.vue2.grid.transposed/index.js', '@mescius/wijmo.vue2.grid.transposedmultirow': 'npm:@mescius/wijmo.vue2.grid.transposedmultirow/index.js', "@mescius/wijmo.vue2.grid": "npm:@mescius/wijmo.vue2.grid/index.js", "@mescius/wijmo.vue2.input": "npm:@mescius/wijmo.vue2.input/index.js", "@mescius/wijmo.vue2.olap": "npm:@mescius/wijmo.vue2.olap/index.js", "@mescius/wijmo.vue2.viewer": "npm:@mescius/wijmo.vue2.viewer/index.js", "@mescius/wijmo.vue2.nav": "npm:@mescius/wijmo.vue2.nav/index.js", "@mescius/wijmo.vue2.base": "npm:@mescius/wijmo.vue2.base/index.js", '@mescius/wijmo.vue2.barcode.common': 'npm:@mescius/wijmo.vue2.barcode.common/index.js', '@mescius/wijmo.vue2.barcode.composite': 'npm:@mescius/wijmo.vue2.barcode.composite/index.js', '@mescius/wijmo.vue2.barcode.specialized': 'npm:@mescius/wijmo.vue2.barcode.specialized/index.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'jszip': 'npm:jszip/dist/jszip.js', 'css': 'npm:systemjs-plugin-css/css.js', 'vue': 'npm:vue/dist/vue.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', '@vue/compiler-dom':'npm:@vue/compiler-dom/dist/compiler-dom.global.prod.js', '@vue/runtime-dom':'npm:@vue/runtime-dom/dist/runtime-dom.global.prod.js', '@vue/shared':'npm:@vue/shared/dist/shared.cjs.js', 'vue-loader': 'npm:systemjs-vue-browser/index.js', //'systemjs-plugin-vue': 'npm:systemjs-plugin-vue/index.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, rxjs: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, wijmo: { defaultExtension: 'js', } } }); })(this);