乐于分享
好东西不私藏

一篇文章带你认识bentopdf

一篇文章带你认识bentopdf

产品概述

什么是 BentoPDF?

BentoPDF 是一个强大的、以隐私为优先的客户端 PDF 工具包,完全在浏览器中运行,无需任何服务器端处理。它提供了超过 100 种 PDF 处理工具,包括合并、拆分、转换、编辑、签名等功能,所有操作都在本地完成,确保您的文件安全和隐私。

产品优势
  • 隐私优先: 所有文件处理完全在用户浏览器中进行,不上传到任何服务器
  • 完全免费: 核心功能完全免费,开源可用
  • 无限制: 没有文件大小限制、没有使用次数限制
  • 自托管: 可以轻松部署在任何静态托管服务上
  • 多语言: 支持 20+ 种语言,包括中文简体和繁体
  • 双许可: AGPL-3.0 开源许可 + 商业许可

核心能力

PDF 组织与管理
PDF 编辑与修改
格式转换(转换为 PDF)

支持将以下格式转换为 PDF:

  • 图像格式: JPG、PNG、BMP、GIF、TIFF、WebP、HEIC、SVG、PSD
  • 文档格式: Word、Excel、PowerPoint、ODT、ODS、ODP、RTF、TXT
  • 电子书格式: EPUB、MOBI、FB2
  • 其他格式: CSV、Markdown、JSON、XML、CBZ、电子邮件 (EML/MSG)、Apple Pages、WordPerfect (WPD)、WPS Office、Microsoft Publisher (PUB)、Microsoft Visio (VSD/VSDX)
格式转换(从 PDF 转出)

支持将 PDF 转换为以下格式:

  • 图像格式: JPG、PNG、WebP、BMP、TIFF、SVG
  • 文档格式: Word、Excel、CSV、Text、Markdown
  • 其他格式: JSON、CBZ(漫画)、灰度 PDF
OCR 与识别
PDF 安全与优化
热门工具

竞品对比

BentoPDF vs 在线 PDF 工具
BentoPDF vs 其他开源 PDF 工具

设计理念

核心理念

1.隐私第一(Privacy First)

BentoPDF 的设计核心原则是保护用户隐私:

  • 零上传架构: 所有文件处理完全在用户浏览器中进行
  • 无服务器依赖: 不需要任何后端服务器处理
  • 数据最小化: 不收集用户的文件数据
  • 本地存储: 所有配置和设置存储在用户本地浏览器中

2.渐进式功能(Progressive Enhancement)

BentoPDF 采用渐进式增强的设计理念:

  • 核心功能优先: 基础 PDF 处理功能无需额外依赖
  • 可选 WASM 模块: 高级功能通过 WASM 模块提供,按需加载
  • 降级处理: 如果高级功能不可用,提供替代方案或友好提示
  • 用户可配置: 用户可以自定义 WASM 模块的来源和配置

3.可扩展性与可定制性

BentoPDF 设计时充分考虑了可定制需求:

  • 可禁用工具: 可以在构建时或运行时禁用特定工具
  • 自定义品牌: 支持修改 Logo、品牌名称和页脚文本
  • 多种部署模式: 完整模式、简洁模式、子目录部署等
  • 多语言支持: 易于添加新的语言翻译

4.性能优化

  • 按需加载: WASM 模块仅在需要时加载
  • Web Workers: 复杂计算在后台线程中进行,不阻塞 UI
  • 智能缓存: 常用资源进行本地缓存
  • 代码分割: 按工具模块进行代码分割,减少初始加载

5.安全设计

  • 非 root 运行: Docker 容器使用非 root 用户
  • 安全头配置: 完善的 CSP、COOP、COEP 等安全头
  • 内容验证: 对用户输入进行严格验证和清理
  • 最小权限: 遵循最小权限原则
架构设计原则
  1. 1.模块化设计: 每个工具相对独立,便于维护和扩展
  2. 2.依赖注入: 通过配置管理外部依赖(WASM 模块)
  3. 3.事件驱动: 使用事件机制解耦组件间通信
  4. 4.类型安全: 全面使用 TypeScript 确保代码质量
  5. 5.测试覆盖: 使用 Vitest 进行单元和集成测试

技术架构

系统架构图
┌─────────────────────────────────────────────────────────────────┐│                         用户界面层 (UI)                          │├─────────────────────────────────────────────────────────────────┤│  ┌──────────────┐  ┌──────────────┐  ┌────────────────────────┐ ││  │   工具页面   │  │   主页/搜索  │  │   PDF 编辑器/查看器    │ ││  └──────────────┘  └──────────────┘  └────────────────────────┘ ││  ┌──────────────────────────────────────────────────────────┐  ││  │                    工作流构建器 (Rete.js)                │  ││  └──────────────────────────────────────────────────────────┘  │├─────────────────────────────────────────────────────────────────┤│                       业务逻辑层 (Logic)                        │├─────────────────────────────────────────────────────────────────┤│  ┌──────────────┐ ┌──────────────┐ ┌────────────────────────┐ ││  │  PDF 操作    │ │ 格式转换     │ │   OCR/识别引擎         │ ││  └──────────────┘ └──────────────┘ └────────────────────────┘ ││  ┌──────────────┐ ┌──────────────┐ ┌────────────────────────┐ ││  │  签名/加密   │ │ 工作流引擎   │ │   表单处理             │ ││  └──────────────┘ └──────────────┘ └────────────────────────┘ │├─────────────────────────────────────────────────────────────────┤│                      核心服务层 (Services)                       │├─────────────────────────────────────────────────────────────────┤│  ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐  ││  │  WASM 提供者  │ │ 国际化 (i18n) │ │   工具管理器       │  ││  └────────────────┘ └────────────────┘ └───────────────────┘  ││  ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐  ││  │  快捷键管理   │ │ 配置管理       │ │   文件处理         │  ││  └────────────────┘ └────────────────┘ └───────────────────┘  │├─────────────────────────────────────────────────────────────────┤│                     技术基础设施层 (Infra)                       │├─────────────────────────────────────────────────────────────────┤│  ┌──────────────────────────────────────────────────────────┐  ││  │                     Vite 构建系统                        │  ││  └──────────────────────────────────────────────────────────┘  ││  ┌──────────────┐ ┌──────────────┐ ┌────────────────────────┐ ││  │  TypeScript  │ │ Tailwind CSS │ │   Handlebars 模板      │ ││  └──────────────┘ └──────────────┘ └────────────────────────┘ │├─────────────────────────────────────────────────────────────────┤│                       WASM 模块层 (WASM)                        │├─────────────────────────────────────────────────────────────────┤│  ┌──────────────┐ ┌──────────────┐ ┌────────────────────────┐ ││  │  PyMuPDF     │ │  Ghostscript │ │   CoherentPDF (CPDF)   │ ││  └──────────────┘ └──────────────┘ └────────────────────────┘ ││  ┌──────────────┐ ┌──────────────┐ ┌────────────────────────┐ ││  │  Tesseract   │ │  LibreOffice │ │   WASM-Vips            │ ││  └──────────────┘ └──────────────┘ └────────────────────────┘ │└─────────────────────────────────────────────────────────────────┘
目录结构详解
bentopdf/├── .github/                    # GitHub 配置│   ├── ISSUE_TEMPLATE/        # 问题模板│   └── workflows/             # CI/CD 工作流 (构建、发布、安全扫描)├── chart/                     # Helm Chart (Kubernetes 部署)│   ├── templates/│   └── values.yaml├── cloudflare/                # Cloudflare Workers 配置│   ├── cors-proxy-worker.js   # CORS 代理 Worker│   └── wasm-proxy-worker.js   # WASM 代理 Worker├── docs/                      # VitePress 文档│   ├── .vitepress/│   ├── self-hosting/          # 自托管指南│   └── tools/                 # 工具文档├── public/                    # 静态资源│   ├── images/               # 图片资源│   ├── locales/              # 多语言翻译文件│   │   ├── en/               # 英语│   │   ├── zh/               # 简体中文│   │   ├── zh-TW/            # 繁体中文│   │   └── ...               # 其他语言│   ├── pdfjs-annotation-viewer/  # PDF.js 注释查看器│   ├── pdfjs-viewer/         # PDF.js 查看器│   ├── libreoffice-wasm/     # LibreOffice WASM│   ├── workers/              # Web Workers│   └── config.json           # 运行时配置├── scripts/                   # 构建和发布脚本│   ├── build.js│   ├── prepare-airgap.sh     # 离线部署准备脚本│   ├── generate-i18n-pages.mjs│   ├── generate-sitemap.mjs│   └── ...├── src/│   ├── css/                  # 样式文件│   │   ├── styles.css│   │   ├── bookmark.css│   │   └── markdown-editor.css│   ├── js/│   │   ├── compare/          # PDF 比较功能│   │   ├── config/           # 配置文件│   │   │   ├── tools.ts      # 工具定义和分类│   │   │   ├── pdf-tools.ts  # PDF 工具配置│   │   │   └── ...│   │   ├── const/            # 常量定义│   │   ├── handlers/         # 事件处理器│   │   ├── i18n/             # 国际化│   │   │   ├── index.ts│   │   │   └── i18n.ts│   │   ├── logic/            # 工具逻辑实现 (100+ 工具)│   │   ├── types/            # TypeScript 类型定义│   │   ├── utils/            # 工具函数│   │   │   ├── wasm-provider.ts    # WASM 提供者管理│   │   │   ├── wasm-preloader.ts   # WASM 预加载│   │   │   ├── pdf-operations.ts   # PDF 操作工具│   │   │   ├── tesseract-runtime.ts # Tesseract OCR 运行时│   │   │   └── ...│   │   ├── workflow/         # 工作流引擎│   │   │   ├── nodes/        # 工作流节点定义│   │   │   ├── engine.ts     # 工作流执行引擎│   │   │   ├── editor.ts     # 工作流编辑器│   │   │   └── ...│   │   ├── main.ts           # 主入口文件│   │   └── ui.ts             # UI 工具函数│   ├── pages/                # 工具页面 (HTML)│   └── partials/             # Handlebars 模板片段├── docker-compose.yml        # Docker Compose 配置├── Dockerfile                # 主 Dockerfile├── Dockerfile.nonroot        # 非 root 用户 Dockerfile├── vite.config.ts            # Vite 配置├── package.json              # 项目依赖和脚本└── tsconfig.json             # TypeScript 配置核心模块
WASM 模块管理系统

BentoPDF 使用多个 WASM 模块来提供高级 PDF 处理功能。 wasm-provider.ts 负责管理这些模块。

classWasmProviderManager {privateconfigWasmProviderConfig;privatevalidationCacheMap<WasmPackageboolean>;privatetrustedHostsSet<string>;// 获取 WASM 模块 URLgetUrl(packageNameWasmPackage): string | undefined;// 设置自定义 WASM URLsetUrl(packageNameWasmPackageurlstring): void;// 验证 WASM 可用性validateUrl(packageNameWasmPackageurl?: string): Promise<{ validbooleanerror?: string }>;// 检查模块是否配置isConfigured(packageNameWasmPackage): boolean;}

支持的 WASM 模块

配置优先级

WASM 配置采用多优先级策略:

  1. 1.用户配置: 用户在高级设置中配置的 URL(最高优先级)
  2. 2.环境变量: 构建时通过环境变量配置的 URL
  3. 3.CDN 默认: 默认的 jsDelivr CDN URL(最低优先级)

安全机制

  • 可信主机: 只允许从预定义的可信主机加载 WASM
  • URL 验证: 验证 URL 格式和可达性
  • 本地存储: 用户配置安全存储在 localStorage
  • 内容类型检查: 验证返回的内容类型正确
工作流引擎

工作流引擎允许用户通过可视化界面创建自定义 PDF 处理管道。

  工作流执行流程

  1. 1.拓扑排序 :确保节点按正确的依赖顺序执行
  2. 2.循环检测 :防止出现无限循环
  3. 3.顺序执行 :逐个处理节点,支持进度显示
  4. 4.错误处理 :单个节点失败不会导致整个工作流崩溃
1. 拓扑排序 (Topological Sort)   ↓2. 循环检测 (Cycle Detection)   ↓3. 节点验证 (Node Validation)   ↓4. 顺序执行 (Sequential Execution)   ↓5. 进度报告 (Progress Reporting)   ↓6. 错误处理 (Error Handling)
  1. 支持的工作流节点
  • 输入节点:PDF Input
  • 处理节点:Merge、Split、Compress、Encrypt、Decrypt、Rotate、Crop、Watermark 等
  • 输出节点:Download
PDF 处理流水线

BentoPDF 实现了高效的 PDF 处理流水线:

处理流程

1.文件加载   ↓2.PDF 解析 (pdf-lib / PDF.js)   ↓3.操作执行 (根据工具选择)   ├─→ 基础操作 (pdf-lib)   ├─→ 高级操作 (PyMuPDF WASM)   ├─→ PDF/A 转换 (Ghostscript WASM)   └─→ 书签/元数据 (CoherentPDF WASM)   ↓4.结果生成   ↓5.文件下载

内存管理策略

  •  流式处理: 大文件分块处理,避免内存溢出
  •  及时释放: 处理完成后立即释放 ArrayBuffer
  •  Worker 隔离: 复杂计算在 Web Worker 中进行,避免阻塞主线程
  •  对象池: 重用常用对象,减少 GC 压力

安装部署

Docker 启动
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest

启动之后,通过IP+3000端口 即可访问。如:

本地开发环境部署
# 1. 克隆仓库git clone https://github.com/alam00000/bentopdf.gitcd bentopdf# 2. 安装依赖npm install# 3. 启动开发服务器npm run dev# 4. 打开浏览器访问 http://localhost:5173
测试
图片转PDF

优劣势与适用场景

核心优势
劣势与局限性

总结:

BentoPDF 最适合 :

  • ✅ 对隐私安全有高要求的用户和组织
  • ✅ 需要全面 PDF 工具但不想付费的用户
  • ✅ 企业内部需要统一、可定制 PDF 工具平台的场景
  • ✅ 有自托管/离线部署需求的环境
  • ✅ 教育机构和个人日常使用

BentoPDF 不太适合 :

  • ❌ 需要专业级 PDF 深度编辑功能的专业用户
  • ❌ 多人实时协作场景
  • ❌ 移动端优先使用场景
  • ❌ 超大文件(>1GB)批量处理场景

整体而言,BentoPDF 在隐私优先的 PDF 工具领域是一个功能全面且优秀的选择,特别适合企业内部部署和对数据安全有要求的用户使用。

项目链接:https://github.com/alam00000/bentopdf.git

大数据、大模型相关学习资料、大数据项目、湖仓一体、架构师必知必会、数据中台建设方法论...

共有1400多份文档资料,另专为星球成员整理了一份比较详细的语雀知识库合计190万字和飞书文档资料。(内容太多,仅展示部分内容...),欢迎大家踊跃加入星球,您将获得:

一、 提供最全的大数据知识库,不限设备,随时随地打开看的在线文档。

二、免费答疑解惑、交流技术

三、面试指导、模拟面试

四、各类pdf文档下载、星球代码下载

五、提供简历模板,简历修改指导服务,星球成员免费提供简历修改指导。

另外说明加入星球后支持三天无理由退款,不满意无条件随时退。

需要资料请加微信:D1435221412