Security (React)

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 React.

import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import ReactDOM from 'react-dom/client'; import React, { useState } from 'react'; import { PdfVersion, PdfPrintPermission, saveBlob, PdfDocument } from '@mescius/wijmo.pdf'; import '@mescius/wijmo.pdf.security'; import * as wjInput from '@mescius/wijmo.react.input'; function App() { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const [state, setState] = useState({ userPassword: '', ownerPassword: '', version: PdfVersion.v1_3, permissions: { annotating: false, contentAccessibility: false, copying: false, documentAssembly: false, fillingForms: false, modifying: false, printing: PdfPrintPermission.NotAllowed } }); const drawPdf = () => { const permissions = state.permissions || {}; const doc = new PdfDocument({ userPassword: state.userPassword, ownerPassword: state.ownerPassword, version: state.version, permissions: { annotating: permissions.annotating, contentAccessibility: permissions.contentAccessibility, copying: permissions.copying, documentAssembly: permissions.documentAssembly, fillingForms: permissions.fillingForms, modifying: permissions.modifying, printing: permissions.printing }, ended: (doc, args) => saveBlob(args.blob, 'Document.pdf') }); // doc.drawText('Demo page.'); // doc.end(); }; const userPasswordChange = (event) => { setState((prevState) => (Object.assign(Object.assign({}, prevState), { userPassword: event.target.value }))); }; const ownerPasswordChange = (event) => { setState((prevState) => (Object.assign(Object.assign({}, prevState), { ownerPassword: event.target.value }))); }; const versionChanged = (menu) => { if (menu.selectedValue) { setState((prevState) => (Object.assign(Object.assign({}, prevState), { version: menu.selectedValue }))); } }; const permChanged = (event, stateProp) => { let val = event.target.checked; setState((prevState) => (Object.assign(Object.assign({}, prevState), { permissions: Object.assign(Object.assign({}, prevState.permissions), { [stateProp]: val }) }))); }; const printingChanged = (event) => { let val = event.target.value; setState((prevState) => (Object.assign(Object.assign({}, prevState), { permissions: Object.assign(Object.assign({}, prevState.permissions), { printing: val }) }))); }; return (<div className="container-fluid"> <div className="panel panel-default"> <div className="panel-heading">Security settings</div> <div className="panel-body"> <div className="row"> <div className="col-sm-3"> <input type="text" className="form-control" placeholder="User password" onChange={userPasswordChange} value={state.userPassword}/> </div> <div className="col-sm-3"> <input type="text" className="form-control" placeholder="Owner password" onChange={ownerPasswordChange} value={state.ownerPassword}/> </div> </div> <hr /> <div className="row"> <div className="col-sm-3"> <wjInput.Menu header='PDF version' itemClicked={versionChanged} value={state.version}> <wjInput.MenuItem value={PdfVersion.v1_3}>1.3</wjInput.MenuItem> <wjInput.MenuItem value={PdfVersion.v1_4}>1.4</wjInput.MenuItem> <wjInput.MenuItem value={PdfVersion.v1_5}>1.5</wjInput.MenuItem> <wjInput.MenuItem value={PdfVersion.v1_6}>1.6</wjInput.MenuItem> <wjInput.MenuItem value={PdfVersion.v1_7}>1.7</wjInput.MenuItem> <wjInput.MenuItem value={PdfVersion.v1_7Ext3}>1.7 ExtensionLevel 3</wjInput.MenuItem> </wjInput.Menu> </div> </div> <hr /> <div className="row"> <div className="col"> <b>Permissions</b> (require owner password) </div> </div> <div className="row"> <div className="col-sm-3"> <div className="checkbox"> <label> <input type="checkbox" checked={(_a = state.permissions) === null || _a === void 0 ? void 0 : _a.annotating} onChange={(e) => permChanged(e, 'annotating')}/>Annotating </label> </div> <div className="checkbox"> <label> <input type="checkbox" checked={(_b = state.permissions) === null || _b === void 0 ? void 0 : _b.contentAccessibility} onChange={(e) => permChanged(e, 'contentAccessibility')}/>ContentAccessibility </label> </div> <div className="checkbox"> <label> <input type="checkbox" checked={(_c = state.permissions) === null || _c === void 0 ? void 0 : _c.copying} onChange={(e) => permChanged(e, 'copying')}/>Copying </label> </div> <div className="checkbox"> <label> <input type="checkbox" checked={(_d = state.permissions) === null || _d === void 0 ? void 0 : _d.documentAssembly} onChange={(e) => permChanged(e, 'documentAssembly')}/>DocumentAssembly </label> </div> <div className="checkbox"> <label> <input type="checkbox" checked={(_e = state.permissions) === null || _e === void 0 ? void 0 : _e.fillingForms} onChange={(e) => permChanged(e, 'fillingForms')}/>FillingForms </label> </div> <div className="checkbox"> <label> <input type="checkbox" checked={(_f = state.permissions) === null || _f === void 0 ? void 0 : _f.modifying} onChange={(e) => permChanged(e, 'modifying')}/>Modifying </label> </div> </div> </div> <div className="row"> <div className="col-sm-2">Printing</div> </div> <div className="row"> <div className="col-sm-6"> <label className="radio-inline"> <input name="printing" type="radio" value={PdfPrintPermission.NotAllowed} checked={((_g = state.permissions) === null || _g === void 0 ? void 0 : _g.printing) == PdfPrintPermission.NotAllowed} onChange={printingChanged}/>NotAllowed </label> <label className="radio-inline"> <input name="printing" type="radio" value={PdfPrintPermission.AllowLowResolution} checked={((_h = state.permissions) === null || _h === void 0 ? void 0 : _h.printing) == PdfPrintPermission.AllowLowResolution} onChange={printingChanged}/>AllowLowResolution </label> <label className="radio-inline"> <input name="printing" type="radio" value={PdfPrintPermission.AllowHighResolution} checked={((_j = state.permissions) === null || _j === void 0 ? void 0 : _j.printing) == PdfPrintPermission.AllowHighResolution} onChange={printingChanged}/>AllowHighResolution </label> </div> </div> </div> </div> <button className="btn btn-default" onClick={drawPdf}>Draw PDF</button> </div>); } const container = document.getElementById('app'); if (container) { const root = ReactDOM.createRoot(container); root.render(<App />); }
<!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="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.40/system.src.js" integrity="sha512-G6mEj6h18+m3MvzdviSDfPle/TfH0//cXcB33AKlNR/Rha0yQsKefDZKRTkIZos97HEGq2JMV1RT5ybMoQ3WsQ==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div id="app"></div> </body> </html>
body { margin-bottom: 24px; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@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.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.grid.immutable': 'npm:@mescius/wijmo.grid.immutable/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/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.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.react.chart.analytics": "npm:@mescius/wijmo.react.chart.analytics/index.js", "@mescius/wijmo.react.chart.animation": "npm:@mescius/wijmo.react.chart.animation/index.js", "@mescius/wijmo.react.chart.annotation": "npm:@mescius/wijmo.react.chart.annotation/index.js", "@mescius/wijmo.react.chart.finance.analytics": "npm:@mescius/wijmo.react.chart.finance.analytics/index.js", "@mescius/wijmo.react.chart.finance": "npm:@mescius/wijmo.react.chart.finance/index.js", "@mescius/wijmo.react.chart.hierarchical": "npm:@mescius/wijmo.react.chart.hierarchical/index.js", "@mescius/wijmo.react.chart.interaction": "npm:@mescius/wijmo.react.chart.interaction/index.js", "@mescius/wijmo.react.chart.radar": "npm:@mescius/wijmo.react.chart.radar/index.js", "@mescius/wijmo.react.chart": "npm:@mescius/wijmo.react.chart/index.js", "@mescius/wijmo.react.core": "npm:@mescius/wijmo.react.core/index.js", '@mescius/wijmo.react.chart.map': 'npm:@mescius/wijmo.react.chart.map/index.js', "@mescius/wijmo.react.gauge": "npm:@mescius/wijmo.react.gauge/index.js", "@mescius/wijmo.react.grid.detail": "npm:@mescius/wijmo.react.grid.detail/index.js", "@mescius/wijmo.react.grid.filter": "npm:@mescius/wijmo.react.grid.filter/index.js", "@mescius/wijmo.react.grid.grouppanel": "npm:@mescius/wijmo.react.grid.grouppanel/index.js", '@mescius/wijmo.react.grid.search': 'npm:@mescius/wijmo.react.grid.search/index.js', "@mescius/wijmo.react.grid.multirow": "npm:@mescius/wijmo.react.grid.multirow/index.js", "@mescius/wijmo.react.grid.sheet": "npm:@mescius/wijmo.react.grid.sheet/index.js", '@mescius/wijmo.react.grid.transposed': 'npm:@mescius/wijmo.react.grid.transposed/index.js', '@mescius/wijmo.react.grid.transposedmultirow': 'npm:@mescius/wijmo.react.grid.transposedmultirow/index.js', '@mescius/wijmo.react.grid.immutable': 'npm:@mescius/wijmo.react.grid.immutable/index.js', "@mescius/wijmo.react.grid": "npm:@mescius/wijmo.react.grid/index.js", "@mescius/wijmo.react.input": "npm:@mescius/wijmo.react.input/index.js", "@mescius/wijmo.react.olap": "npm:@mescius/wijmo.react.olap/index.js", "@mescius/wijmo.react.viewer": "npm:@mescius/wijmo.react.viewer/index.js", "@mescius/wijmo.react.nav": "npm:@mescius/wijmo.react.nav/index.js", "@mescius/wijmo.react.base": "npm:@mescius/wijmo.react.base/index.js", '@mescius/wijmo.react.barcode.common': 'npm:@mescius/wijmo.react.barcode.common/index.js', '@mescius/wijmo.react.barcode.composite': 'npm:@mescius/wijmo.react.barcode.composite/index.js', '@mescius/wijmo.react.barcode.specialized': 'npm:@mescius/wijmo.react.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'react': 'npm:react/umd/react.production.min.js', 'react-dom': 'npm:react-dom/umd/react-dom.production.min.js', 'react-dom/client': 'npm:react-dom/umd/react-dom.production.min.js', 'redux': 'npm:redux/dist/redux.min.js', 'react-redux': 'npm:react-redux/dist/react-redux.min.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js', "react-use-event-hook": "npm:react-use-event-hook/dist/esm/useEvent.js", }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);