Redaction Preview Mode Using Custom CSS

The "eye" button toggles redact annotations' visibility by applying custom CSS to the viewer's annotation layer. This approach can be used to allow admins to preview content that is marked for redaction while keeping it hidden from non-admin users.

// Initialize PDF viewer with default configuration window.onload = function () { // Configuration constants const CONFIG = { initialDocument: "/document-solutions/javascript-pdf-viewer/demos/product-bundles/assets/pdf/redact-preview.pdf", userName: "Document Reviewer" }; // State management const state = { viewer: null, React: null, isRedactionPreview: false }; try { // 1. Initialize viewer and setup interface state.viewer = new DsPdfViewer("#viewer", { userName: CONFIG.userName }); // 2. Set up default interface state.viewer.addDefaultPanels(); state.viewer.toggleSidebar(false); // 3. Get React instance state.React = state.viewer.getType("React"); if (!state.React) { console.warn("React instance not found in viewer"); return; } // Create eye icon SVG for the toggle button const createEyeIcon = () => state.React.createElement( "svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: state.isRedactionPreview ? "#ff0000" : "#008000", "aria-hidden": "true" }, state.React.createElement("path", { d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z" }) ); // Toggle redaction preview mode const toggleRedactionPreview = () => { state.isRedactionPreview = !state.isRedactionPreview; state.viewer.removeViewAreaStyle("redaction-preview-style"); if (state.isRedactionPreview) { state.viewer.addViewAreaStyle(` .redactAnnotation .trigger { background: none !important; border: 2px dashed rgba(255, 0, 0, 0.5) !important; box-shadow: inset 0 0 8px rgba(255, 0, 0, 0.3); } .redactAnnotation .trigger *, .redactAnnotation .trigger img { display: none !important; } `, "redaction-preview-style"); } state.viewer.toolbar.updateItem("preview-content", { icon: { type: "svg", content: createEyeIcon() }, title: state.isRedactionPreview ? "Hide redacted content (secure mode)" : "Preview redacted content (review mode)" }); }; // Add custom preview button to toolbar state.viewer.toolbar.addItem({ key: "preview-content", icon: { type: "svg", content: createEyeIcon() }, title: "Preview redacted content (review mode)", enabled: true, action: toggleRedactionPreview }); // Position the button state.viewer.toolbarLayout.viewer.default.unshift("preview-content"); state.viewer.toolbarLayout.viewer.mobile.unshift("preview-content"); // Load initial document state.viewer.open(CONFIG.initialDocument); } catch (error) { console.error("PDF viewer initialization error:", error); } };
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>PDF Redaction Preview Mode with CSS Customization</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="./src/styles.css"> <script src="/document-solutions/javascript-pdf-viewer/demos/product-bundles/build/dspdfviewer.js"></script> <script src="/document-solutions/javascript-pdf-viewer/demos/product-bundles/build/wasmSupportApi.js"></script> <script src="/document-solutions/javascript-pdf-viewer/demos/resource/js/init.js"></script> <script src="./src/app.js"></script> </head> <body> <div id="viewer"></div> </body> </html>
#viewer { height: 100%; }