跳到主要内容
CHENGYU

自托管 BentoPDF,在浏览器里合并和拆分 PDF

自托管 BentoPDF 工具页,验证 PDF 合并、拆页和下载,明确浏览器计算、HTTPS 隔离响应头与离线依赖的条件。

文章目录
LisaHost:原生与住宅IP产品,按套餐选择
腾讯云:锐驰型200Mbps峰值带宽,中国内地2核2G50元每月
DMIT:Premium中国大陆优化线路CN2GIA
晚安云:香港云服务器2核2G15元每月
雨云|国内外节点,灵活部署|云服务器 · 预装宝塔 / 1Panel
Evoxt:最高6.0GHz CPU,2.99美元每月起
搬瓦工|CN2 GIA 精品线路|洛杉矶 CN2 GIA 套餐
BRNCHost:Bursa土耳其游戏服务器,1Gbps端口,DDoS防护
WorkBuddy:交代任务,交付文件
京东云:AI进入真实业务
野草云:香港200Mbps峰值带宽,不限月流量,30元每月起
RackNerd:海外VPS21.99美元每年起

把几个 PDF 合并、拆出指定页或调整页面顺序,是常见的小工作。为了这些操作反复上传文件到不同网站,既麻烦,也容易忘记文件去了哪里。BentoPDF 可以自建一个工具入口,主要文件处理在访问者的浏览器里完成。

这里使用项目提供的自托管版镜像 bentopdf-simple。它包含 PDF 工具,但省去了面向商业站点的宣传页面。VPS 提供应用文件,文件大小和浏览器内存仍会影响操作体验,不能因为部署在 VPS 上就期待服务器替电脑承担全部计算。

先用一个本机端口部署工具页

准备 Linux VPS、Docker Engine、Compose 和 SSH 账号。首次运行不需要数据库或个人文件库。

BentoPDF 主要在浏览器处理文件,VPS 负责提供工具页面。已有 Linux VPS 可先复用;如果计划同时部署其他自托管服务,可以查看雨云云服务器,优惠码 KuZhuJi,按这些服务的总资源需求选择配置。仅为一个静态工具页,也可以考虑已有静态托管空间;大 PDF 的处理能力仍要在使用者的设备上验证。

mkdir -p ~/apps/bentopdf
cd ~/apps/bentopdf
umask 077
docker pull ghcr.io/alam00000/bentopdf-simple:latest
printf 'BENTOPDF_IMAGE=%s\n' "$(docker image inspect --format '{{index .RepoDigests 0}}' ghcr.io/alam00000/bentopdf-simple:latest)" > .env

确认镜像摘要非空,保存为 compose.yml:

services:
  bentopdf:
    image: ${BENTOPDF_IMAGE:?请固定镜像摘要}
    restart: unless-stopped
    ports:
      - "127.0.0.1:3018:8080"

容器端口是 8080,宿主机示例使用 3018,避免与其他服务抢端口。处理后的文件由浏览器下载到使用者的设备,这份部署不需要文档持久卷。

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=100 bentopdf

电脑上运行:

ssh -N -L 3018:127.0.0.1:3018 user@VPS_IP

替换账号和 VPS 地址,打开 http://localhost:3018。先用没有个人信息的文件检查页面,不直接拿重要合同或证件做第一次尝试。

用三页测试文件核对结果

准备两份测试 PDF,分别含两页和一页,把它们合并为三页文件。下载后用独立 PDF 阅读器打开,检查页数、顺序、文字是否清晰,再从合并结果拆出其中一页。

这组动作能检查导入、处理和下载,而不仅是看工具按钮是否存在。文件带数字签名时,编辑或重组页面可能影响签名有效性,应保留原文件并用实际阅读器核验。压缩和格式转换也要逐页看结果,不能只根据输出文件变小就认为处理成功。

大文件卡住时,观察浏览器内存与页面响应,先用较小样本确认工具功能。VPS 的 CPU 和内存升级并不直接解决浏览器端内存不足;换设备、减少一次处理的页数或分批操作可能更符合这个架构。

HTTPS 和隔离响应头会影响部分转换工具

普通 PDF 操作与 Office 文件转换的运行条件不完全一样。官方说明中,LibreOffice WASM 的 Office 转换需要 SharedArrayBuffer,这要求安全上下文及跨源隔离。localhost 可用于本机测试;直接通过公网 IP 的 HTTP 页面访问,可能看到主页正常,但相关转换功能不可用。

正式域名应通过 HTTPS 提供页面。若 Caddy 在 VPS 宿主机上,可以代理到本机端口:

pdf.example.com {
    reverse_proxy 127.0.0.1:3018
}

替换域名、核对 DNS 和证书条件,验证后重载。不要让其他代理层随意移除应用的 COOP、COEP 响应头。接入域名以后,再实际尝试需要的转换功能;只确认主页 HTTPS 正常还不够。

项目的部分 WASM 依赖可能在浏览器运行时加载。需要断网或内网使用时,应采用项目的 air-gap 构建方案,把相关依赖一并放到可访问的位置;普通 Docker 镜像运行成功,不代表所有工具都已具备离线条件。

页面重建与文档保存分开管理

部署侧需要保存 Compose、.env、镜像摘要和代理配置。使用者需要保存原始 PDF 与处理后的文件,并记录重要处理的步骤。网站目录备份不会把每位用户浏览器中处理的文件一起带走。

私人入口可以继续使用 SSH 隧道或 VPN,也可以在代理层给全部路径增加认证。入口认证限制谁能打开工具页,不负责替使用者管理下载文件。

升级时先保留旧镜像摘要,在新版本中重跑合并、拆页和实际需要的转换样本。核对输出页数、顺序和关键内容以后再处理正式资料。如果工具页出现资源加载失败,检查网络请求与代理响应头,再区分页面本身、WASM 依赖和文件处理的问题。

镜像、浏览器处理与离线构建说明见 BentoPDF 官方 README,自托管版镜像可查看 官方镜像仓库。

继续阅读 返回顶部