分页页面图像
每页在服务器端光栅化并按需交付。大型文档在第一页打开,而不是在整个文件下载完毕后。
问题
提供文件并让浏览器渲染:最简单的方式,但它将原始字节、元数据、嵌入的附件以及一键转发的能力交给用户。
部署 JavaScript PDF 引擎:仍然在浏览器中保留文件,为您的包添加有意义的下载,并且您仍需自行编写工具栏、缩略图栏和搜索框。
在服务器端渲染并发送图像:用户看到页面,文件从未离开您的基础设施,同一机制同样适用于 Word、Excel、CAD 和电子邮件 —— 这通常是两次冲刺后才出现的需求。
功能
每页在服务器端光栅化并按需交付。大型文档在第一页打开,而不是在整个文件下载完毕后。
使用 AdvancedSearch 插件,对 PDF 的文本层进行全文搜索,搜索结果定位到正确的页面并高亮显示。
小部件自带缩略图栏、页面跳转、缩放和适宽显示。设置 showThumbs 和 FitType 即可。
使用 Annotation 插件:高亮、评论、印章和签名,由您的应用程序存储和导出,而不是嵌入回源文件。
加密的 PDF 在服务器端使用您代码提供的密码打开。密码从不传递到浏览器。
打印是查看器的功能,您可以选择提供或隐藏,这与用户是否可以下载原始文件是不同的决定。
集成
客户端仅收到令牌。它永远不会知道文件名、存储位置,或该文档是 PDF 而非目录中的其他文件。
支持的扩展名
// Server-side: returns an opaque token, never a path or a URL
app.MapPost("/api/open", async (Viewer viewer) =>
{
string token = await viewer.OpenDocumentAsync("wwwroot/files/Contract.pdf");
return Results.Ok(new { token });
});
// For an encrypted PDF, supply the password server-side —
// it is used to decrypt in your process and goes no further.详情
只有在您自行实现时才可以。查看器通过不透明令牌提供页面图像,因此是否发布源文件仍是您代码中的明确决定,而不是让用户阅读时的副作用。
它们可以作为图像正常渲染,但没有可搜索的内容。OCR 仅通过 AdvancedSearch 插件提供,且并非普遍可用——引擎正在重新构建,今天不要基于它进行规划。
页面按需渲染和交付,而不是一次性全部渲染,因此文档长度对内存的影响远小于页面复杂度。真正的成本驱动因素是非常复杂的矢量页面,而不是页数。