核心内容摘要
川渝“嗓音”大PK:四川BBBB嗓和重庆BBBB嗓,听觉盛宴等你解锁!
项目标题与描述BentoPDF是一个强大、以隐私为先、客户端运行的 PDF 工具套件支持自托管。
它允许您直接在浏览器中操作、编辑、合并和处理 PDF 文件无需服务器端处理确保您的文件始终保持安全和私密。
项目的核心目标是提供一个完全免费、无需注册、无限使用且尊重用户隐私的 PDF 处理解决方案。
所有工具都 100% 在浏览器中运行文件永不离开您的设备结合开源AGPL-
0和商业双重许可模式适合个人和企业使用。
功能特性基于对项目代码的分析BentoPDF 提供了极其丰富的功能主要特性包括100 种 PDF 工具涵盖 PDF 处理的全方位需求工具被组织为多个清晰的类别。
隐私优先完全本地处理所有处理都在您的浏览器中完成文件不会上传到任何服务器确保了数据的绝对私密性。
100% 免费无需注册所有工具均可免费无限次使用无需创建账户或登录。
支持离线使用应用可作为渐进式 Web 应用 (PWA) 安装并支持服务端缓存提供离线功能。
多语言国际化 (i18n)支持包括英语、中文、德语、法语、西班牙语、越南语等在内的十余种语言并提供完整的翻译和语言切换机制。
简洁模式 (Simple Mode)为组织内部部署提供选项可隐藏所有品牌和营销内容只展示核心 PDF 工具提供更清爽的界面。
键盘快捷键支持为常用操作提供了全面的键盘快捷键提升操作效率。
完善的工具集PDF 转换器支持在 PDF 与 Word、Excel、JPG、PNG、文本、Markdown 等 40 多种格式之间相互转换。
PDF 编辑器提供压缩、旋转、裁剪、添加水印、页眉页脚、页码、背景色等 25 种以上编辑功能。
PDF 合并与拆分轻松合并多个 PDF 文件或将单个 PDF 拆分为多个文件支持页面提取、删除、重排等。
PDF 安全工具提供加密、解密、数字签名、权限管理、移除元数据、线性化等安全功能。
灵活部署支持通过 Docker 容器、Docker Compose、静态网站 (Netlify, Vercel, GitHub Pages) 等多种方式轻松自托管。
安装指南BentoPDF 提供了多种安装和部署方式以适应不同的使用场景。
系统要求现代浏览器支持 WebAssemblyNode.js用于从源码构建Docker用于容器化部署部署方式
使用 Docker最简单快捷从 Docker Hub 拉取预构建的镜像并运行# 标准模式包含完整品牌和营销内容dockerrun -p3000:8080 bentopdf/bentopdf:latest# 简洁模式仅显示工具界面适合内网部署dockerrun -p3001:8080 bentopdf/bentopdf-simple:latest访问http://localhost:3000或http://localhost:3001即可使用。
使用 Docker Compose创建docker-compose.yml文件version:
8services:bentopdf:image:bentopdf/bentopdf:latest# 或 bentopdf/bentopdf-simple:latestcontainer_name:bentopdfrestart:unless-stoppedports:-8080:8080security_opt:-no-new-privileges:true然后运行docker-compose up -d。
作为静态网站部署BentoPDF 可以部署在任何静态网站托管服务上Netlify手动上传发布包或连接 GitHub 仓库自动部署。
Vercel导入 Git 仓库并选择 Vite 框架预设。
GitHub Pages通过 GitHub Actions 工作流自动构建和部署。
项目每个版本都提供预构建的dist-{version}.zip文件下载解压后即可上传至静态主机。
从源码构建和运行用于开发# 克隆仓库gitclone https://github.com/alam00000/bentopdf.gitcdbentopdf# 安装依赖npminstall# 开发模式运行标准模式npmrun dev# 开发模式运行简洁模式npmrun serve:simple# 构建生产版本npmrun build使用说明基础使用访问您部署的 BentoPDF 实例。
在主页面您可以看到按类别组织的所有工具。
您可以直接点击工具卡片或使用顶部的搜索框快速查找工具。
选择工具后按照界面提示上传文件、配置选项然后开始处理。
处理完成后结果文件将直接在浏览器中下载。
语言切换BentoPDF 支持多语言。
页脚区域内置了语言切换器点击后可以从下拉列表中选择您偏好的语言。
语言设置会保存在本地。
键盘快捷键BentoPDF 提供了便捷的键盘快捷键以提升效率Escape返回工具网格视图。
Ctrl/Cmd K聚焦工具搜索框。
Ctrl/Cmd /显示/隐藏快捷键帮助面板。
在特定工具界面如编辑器中还支持方向键翻页等更多快捷键。
API 概览BentoPDF 是一个前端应用没有传统后端 API。
其核心功能通过集成多个 WebAssembly 库如 pdf.js, pymupdf-wasm, gs-wasm在浏览器中实现。
对于数字签名等需要网络请求的功能项目提供了一个可选的 Cloudflare Worker 代理 (cors-proxy-worker.js) 来处理跨域请求。
项目的构建和配置基于 Vite并使用了多个插件tailwindcss/vite: 用于 Tailwind CSS。
vite-plugin-handlebars: 用于 HTML 模板和局部组件如导航栏、页脚。
vite-plugin-static-copy: 用于复制静态资源。
自定义的languageRouterPlugin: 用于开发环境下的多语言路由重写。
核心代码以下是项目中一些核心模块的代码示例展示了其关键实现。
应用状态管理 (src/js/state.js)此模块集中管理了应用的核心状态确保在不同工具间切换时状态清晰。
// src/js/state.jsexportconststate{activeTool:null,// 当前激活的工具IDfiles:[],// 用户上传的文件列表pdfDoc:null,// 当前加载的PDF.js文档对象pdfPages:[],// 文档的页面代理对象数组currentPdfUrl:null,// 当前PDF文件的Blob URL};// 重置状态通常在切换工具或完成操作时调用exportfunctionresetState(){state.activeToolnull;state.files[];state.pdfDocnull;state.pdfPages[];state.currentPdfUrlnull;document.getElementById(tool-content).innerHTML;}
国际化 (i18n) 语言检测 (src/js/i18n/i18n.js)此函数根据URL路径或本地存储来确定当前应使用的语言。
// src/js/i18n/i18n.js (节选)exportconstgetLanguageFromUrl(){constbasePathimport.meta.env.BASE_URL.replace(/\/$/,);letpathwindow.location.pathname;// 处理基础路径如部署在子目录时if(basePathbasePath!/path.startsWith(basePath)){pathpath.slice(basePath.length)||/;}// 从URL路径匹配语言代码constlangMatchpath.match(/^\/(en|fr|es|de|zh|zh-TW|vi|tr|id|it|pt)(?:\/|$)/);if(langMatchsupportedLanguages.includes(langMatch[1])){returnlangMatch[1];}// 回退到本地存储的语言设置conststoredLanglocalStorage.getItem(i18nextLng);if(storedLangsupportedLanguages.includes(storedLang)){returnstoredLang;}// 默认返回英语returnen;};
Vite 配置中的语言路由中间件 (vite.config.ts)在开发服务器中此中间件负责将类似/de/tools的请求重写为/tools.html并注入语言上下文实现无刷新语言切换。
// vite.config.ts (节选)functioncreateLanguageMiddleware(isDev:boolean){return(req,res,next){constbasePathgetBasePath();letpathnamereq.url.split(?)[0];// 剥离基础路径if(basePathbasePath!/pathname.startsWith(basePath)){pathnamepathname.slice(basePath.length)||/;}constlangMatchpathname.match(LANG_REGEX);if(langMatch){const[,lang,rest]langMatch;// 重写请求到对应的 .html 文件req.url${basePath}/${rest||index}.html;// 将语言信息附加到请求对象供后续插件使用(reqasany).languagelang;}elseif(PAGES.has(pathname.slice(
.replace(/\.html$/,))){// 处理无语言前缀的页面请求附加默认语言(reqasany).languageen;}next();};}
服务端脚本 - 版本发布 (scripts/release.js)此脚本自动化了项目的版本发布流程包括更新版本号、创建 Git 标签、构建和打包。
#!/usr/bin/env node// scripts/release.js (节选)functionmain(){consttypeprocess.argv[2]||patch;// 接受 major, minor, patch 参数console.log( Releasing${type}version...);//