官方的 Doconut 功能目录 将浏览器打印和 PDF 导出列为查看器功能。要控制对这些功能的访问仍需做出两个独立的决定:Doconut 是否展示相关操作,以及宿主应用是否授权当前用户和文档执行该操作。

若要了解已安装构建所支持的精确控制,请先查阅 Doconut 文档 并使用官方 Doconut 下载页面 提供的打包示例。请勿复制来自无关版本或未经验证的文章中的配置键或源代码。
1. 首先定义打印策略
在更改工具栏之前,先写下谁可以打印以及在何种条件下可以打印。一个有用的策略会回答以下问题:
- 是否允许所有查看器、仅特定角色或特定文档进行打印?
- 决定是否取决于租户、案件状态、文档分类或到期时间吗?
- 可打印输出是否需要水印?
- 是否应审计打印事件?
- 用户是否可以打印较旧的文档修订版?
- 当预览打开期间权限发生变化时应如何处理?
当实际规则具有上下文性时,避免使用单一的全局布尔值。将打印建模为独立的操作,以便能够与查看和下载分开进行授权。
2. 将 UI 状态与授权分离
宿主页面在收到应用拥有的权限结果后,可以决定是否展示打印控件。这可以为无法打印的用户提供更清晰的提示。
然而,隐藏控件并不是授权边界。用户仍然可以直接调用已知端点、重放先前请求,或对可见内容使用浏览器打印。所有生成可打印输出的服务器路由必须强制执行相同的策略。
使用 UI 中的不同状态:
| 状态 | 查看器行为 | 服务器行为 |
|---|---|---|
| 允许打印 | 显示受支持的打印操作 | 授权并创建请求的输出 |
| 禁止打印 | 隐藏或禁用该操作,并提供明确说明 | 返回 Forbidden 响应 |
| 策略未知 | 在权限加载期间保持操作不可用 | 不生成输出 |
| 会话已过期 | 提示用户重新认证 | 拒绝过期请求 |
3. 保护打印端点
保护调用打印或返回可打印输出的应用操作。授权决策应考虑租户成员资格、所有权、分类、工作流状态以及文档修订。应在服务器端解析文档,而不是接受客户端提供的路径或存储 URL。
如果你的应用通过特定查看器路由进行打印而不是生成 PDF,请在调用该路由之前同样执行授权检查。
4. 配置已安装的查看器版本
在服务器规则确定后,使用与你的版本随附的包和示例文件中记录的确切选项来配置 Doconut UI。Doconut 在线演示 可让你在决定具体集成方式之前观察受支持的查看器行为。请验证:
- 选项设置位置:服务器配置、视图模型或客户端初始化。
- 它是隐藏工具栏项、禁用操作,还是影响生成的输出。
- 该值是针对每个查看器实例还是全局生效。
- 打印和导出是否为独立操作。
- 更新是否更改了选项名称或默认值。
将官方示例视为唯一可信来源。仅凭看起来合理的属性名并不足以证明已安装的查看器能够识别它。
5. 诚实地处理浏览器打印
查看器设置无法保证可见信息永远不会被打印或捕获。浏览器可能会打印宿主页面,用户也可以截屏或拍照。键盘拦截和针对打印的 CSS 能改善预期体验,但这些都是可绕过的客户端措施。
如果宿主页面不应生成有用的纸质副本,你的应用可以使用自定义的打印专用呈现方式,将预览替换为说明性信息。请将此类宿主页面行为与 Doconut 文档中列出的查看器控制分离。
不要将此描述为文档保护。当风险评估要求更强的威慑时,请使用服务器端渲染、授权、受控导出以及可见水印。
6. 将下载、导出和打印分开
用户和开发者常把这些操作视为同一个 “只读” 开关,但它们代表不同的数据流:
- 查看 显示渲染后的内容。
- 下载 返回源文件或其他存储文件。
- 导出 生成衍生格式。
- 打印 生成可打印的表示或调用浏览器打印。
请对每项操作显式授权。无法打印的用户仍可能被允许下载,反之亦然。你的工具栏应当反映服务器的决策,而不是自行定义。
7. 添加有用的审计事件
如果打印属于敏感操作,请在不记录文档本身的前提下记录决策。审计事件可包括用户、租户、文档标识、修订、策略结果、时间戳以及关联 ID。
同时记录成功和被拒的尝试。如果打印服务创建了临时文件,也要记录其清理是否完成。请将文件路径、令牌、包含个人数据的文档标题以及可打印内容排除在常规日志之外。
8. 超越按钮缺失的测试
工具栏仅是第一道断言。请为整个操作添加测试:
授权用户
- 预期的打印操作可见。
- 对允许的文档的打印请求成功。
- 使用了正确的修订。
- 生成的输出中出现所需的标记。
- 审计事件记录成功。
未授权用户
- 操作缺失或被禁用。
- 直接请求打印路由返回 Forbidden 响应。
- 更改文档 ID 并不能绕过规则。
- 从授权会话复制的 URL 不能被不当重用。
- 拒绝响应不泄露其他租户是否拥有该文档。
状态变化
- 会话期间撤销的权限在下次打印请求时生效。
- 会话过期后无法打印。
- 已删除或被取代的文档会产生受控错误。
- 临时打印输出遵循配置的保留规则。
浏览器自动化可以验证可见状态和响应码。集成测试应独立验证策略评估和文档级授权。
常见问题
隐藏打印按钮会阻止浏览器的打印快捷键吗?
不会。它仅在已安装的查看器实现此行为时才会移除预期的查看器操作。浏览器打印和屏幕捕获需要另行考虑,无法通过客户端代码完全阻止。
打印权限应包含在查看 URL 中吗?
更倾向于使用与已认证用户、文档和操作关联的服务器端授权决策。如果临时引用携带权限,请将其范围限定得很窄,防止其出现在日志和引用者中,并在敏感操作时重新验证。
仅禁用打印对机密文档足够吗?
不够。这只是可用性或威慑控制之一。机密工作流还需要存储保护、对象级授权、受控导出、保留规则、监控以及可接受的残余风险模型。
结论
可信赖的 Doconut 打印控制实现始于服务器,终于界面。先定义策略,保护操作,仅配置已安装查看器文档中记载的选项,向用户解释结果,并对直接请求以及工具栏可见性进行测试。请使用官方功能页面、文档、下载和演示作为实现来源,而不是在文章中自行重写产品代码。