PDF

一个不交出 PDF 的 PDF 查看器

浏览器内置的 PDF 查看器通过向用户提供文件来工作。对于合同、医疗记录或密封投标,这往往正是您想避免的情况。Doconut 在服务器端渲染页面并发送图像,使查看和拥有不再是同一行为。

0
发送给客户端的源 PDF 字节数
100%
服务器端渲染
1
同样适用于其他所有格式的查看器

问题

展示 PDF 的三种方式及其各自成本

提供文件并让浏览器渲染:最简单的方式,但它将原始字节、元数据、嵌入的附件以及一键转发的能力交给用户。

部署 JavaScript PDF 引擎:仍然在浏览器中保留文件,为您的包添加有意义的下载,并且您仍需自行编写工具栏、缩略图栏和搜索框。

在服务器端渲染并发送图像:用户看到页面,文件从未离开您的基础设施,同一机制同样适用于 Word、Excel、CAD 和电子邮件 —— 这通常是两次冲刺后才出现的需求。

功能

查看器对 PDF 的处理方式

分页页面图像

每页在服务器端光栅化并按需交付。大型文档在第一页打开,而不是在整个文件下载完毕后。

文本层搜索

使用 AdvancedSearch 插件,对 PDF 的文本层进行全文搜索,搜索结果定位到正确的页面并高亮显示。

缩略图和导航

小部件自带缩略图栏、页面跳转、缩放和适宽显示。设置 showThumbs 和 FitType 即可。

批注

使用 Annotation 插件:高亮、评论、印章和签名,由您的应用程序存储和导出,而不是嵌入回源文件。

受密码保护的文件

加密的 PDF 在服务器端使用您代码提供的密码打开。密码从不传递到浏览器。

受您控制的打印

打印是查看器的功能,您可以选择提供或隐藏,这与用户是否可以下载原始文件是不同的决定。

集成

打开 PDF

客户端仅收到令牌。它永远不会知道文件名、存储位置,或该文档是 PDF 而非目录中的其他文件。

支持的扩展名

.pdf
csharp
// 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.

详情

PDF 细节

  • 文本层搜索需要 AdvancedSearch 插件;OCR 并非普遍可用,不能假设扫描页具备 OCR。
  • 批注需要 Annotation 插件,并由您的应用程序存储,而不是写回源 PDF。
  • 将 PDF 转换为 Word、Excel 或图像需要 Converter 插件以及 DocumentConverter.ConvertAsync()。

常见问题

用户仍然可以下载原始 PDF 吗?

只有在您自行实现时才可以。查看器通过不透明令牌提供页面图像,因此是否发布源文件仍是您代码中的明确决定,而不是让用户阅读时的副作用。

它能在没有文本层的扫描 PDF 上工作吗?

它们可以作为图像正常渲染,但没有可搜索的内容。OCR 仅通过 AdvancedSearch 插件提供,且并非普遍可用——引擎正在重新构建,今天不要基于它进行规划。

它能处理多大的 PDF?

页面按需渲染和交付,而不是一次性全部渲染,因此文档长度对内存的影响远小于页面复杂度。真正的成本驱动因素是非常复杂的矢量页面,而不是页数。

在您自己的文档上试用

临时许可证的申请只需几分钟,并且完全在您自己的机器上运行。重要的文件是那些已经导致您当前查看器出现问题的文件。