mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-07 08:31:01 +01:00
539 lines
24 KiB
Markdown
539 lines
24 KiB
Markdown
# 自行架設指南
|
||
|
||
BentoPDF 可以架設在您自己的基礎設施上。本指南介紹多種部署方式。
|
||
|
||
## 使用 Docker / Podman 快速開始
|
||
|
||
自行架設 BentoPDF 最快的方式:
|
||
|
||
> [!TIP]
|
||
> BentoPDF 提供兩種建置版本:
|
||
>
|
||
> - **自行架設版**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**行銷介面(沒有主視覺、常見問題、使用者推薦與頁尾)。適合內部、團隊或組織部署。它**不是**功能縮減的「精簡」版本。
|
||
> - **商業版**:`ghcr.io/alam00000/bentopdf:latest`。完整的行銷網站,bentopdf.com 本身以及執行公開部署的商業授權持有者都使用此版本。
|
||
>
|
||
> 如果不確定:請使用自行架設版。
|
||
|
||
> [!IMPORTANT]
|
||
> Office 檔案轉換需要 `SharedArrayBuffer`,這表示應用程式必須同時具備跨來源隔離,並從安全環境提供服務。官方映像檔已會傳送所需的 COOP/COEP 標頭,但瀏覽器仍會在純 HTTP 的區域網路來源(例如 `http://192.168.x.x`)上停用 `SharedArrayBuffer`。
|
||
>
|
||
> `http://localhost` 僅適用於同一裝置上的測試。如果使用者透過區域網路 IP 或主機名稱存取 BentoPDF,請以 HTTPS 終止連線。
|
||
|
||
```bash
|
||
# Docker
|
||
docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
|
||
|
||
# Podman
|
||
podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
|
||
```
|
||
|
||
或使用 Docker Compose / Podman Compose:
|
||
|
||
```yaml
|
||
# docker-compose.yml
|
||
services:
|
||
bentopdf:
|
||
image: ghcr.io/alam00000/bentopdf-simple:latest
|
||
ports:
|
||
- '3000:8080'
|
||
restart: unless-stopped
|
||
```
|
||
|
||
```bash
|
||
# Docker Compose
|
||
docker compose up -d
|
||
|
||
# Podman Compose
|
||
podman-compose up -d
|
||
```
|
||
|
||
## Podman Quadlet(Linux Systemd)
|
||
|
||
將 BentoPDF 作為 systemd 服務執行。建立 `~/.config/containers/systemd/bentopdf.container`:
|
||
|
||
```ini
|
||
[Container]
|
||
Image=ghcr.io/alam00000/bentopdf-simple:latest
|
||
ContainerName=bentopdf
|
||
PublishPort=3000:8080
|
||
AutoUpdate=registry
|
||
|
||
[Service]
|
||
Restart=always
|
||
|
||
[Install]
|
||
WantedBy=default.target
|
||
```
|
||
|
||
```bash
|
||
systemctl --user daemon-reload
|
||
systemctl --user enable --now bentopdf
|
||
```
|
||
|
||
完整的 Quadlet 說明請參閱 [Docker 部署指南](/zh-TW/self-hosting/docker)。
|
||
|
||
## 從原始碼建置
|
||
|
||
```bash
|
||
# Clone and build
|
||
git clone https://github.com/alam00000/bentopdf.git
|
||
cd bentopdf
|
||
npm install
|
||
npm run build
|
||
|
||
# The built files are in the `dist` folder
|
||
```
|
||
|
||
## 設定選項
|
||
|
||
### 自行架設版(Simple Mode)
|
||
|
||
自行架設版(`bentopdf-simple` 映像檔,也稱為 Simple Mode)在**功能上與商業版完全相同**:所有 PDF 工具都在,且行為一致。它只是隱藏了僅在 bentopdf.com 本身或商業公開部署上才有意義的行銷介面。**它不是功能縮減的「精簡」版本。**
|
||
|
||
**自行架設版隱藏的內容**(僅限外觀,未移除任何 PDF 功能):
|
||
|
||
- 導覽列、主視覺區塊、功能區塊、常見問題、使用者推薦、頁尾
|
||
- 將頁面標題改為「PDF 工具」
|
||
|
||
**自行架設版保留的內容**(所有實際處理 PDF 的部分):
|
||
|
||
- 所有 PDF 工具(合併、分割、編輯、簽署、OCR、Office 轉換等)
|
||
- 自訂品牌支援,以及所有建置時與執行時設定
|
||
|
||
商業版(`ghcr.io/alam00000/bentopdf:latest`)是 bentopdf.com 本身所使用的版本,也供執行公開部署的商業授權持有者使用。它額外加入了主視覺、常見問題、使用者推薦與頁尾,這些在內部工具上並不合適。
|
||
|
||
如果您是為團隊、組織或作為內部工具自行架設 BentoPDF,請使用自行架設版:
|
||
|
||
```bash
|
||
# Use the pre-built image (recommended)
|
||
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
|
||
|
||
# Or build it yourself
|
||
SIMPLE_MODE=true npm run build
|
||
```
|
||
|
||
完整詳情請參閱 [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md)。
|
||
|
||
### 商業版(以您自己的品牌進行公開部署)
|
||
|
||
商業版(`bentopdf` 映像檔,沒有 `-simple` 後綴)是 bentopdf.com 本身所使用的版本。它在所有 PDF 工具之外,還包含完整的行銷網站(主視覺、功能、常見問題、使用者推薦、頁尾)。當您想要**以自己的品牌將 BentoPDF 部署為公開的 PDF 服務**時,請使用此版本,例如:
|
||
|
||
- 您在自己的網域上將 BentoPDF 作為託管 SaaS 提供給終端使用者
|
||
- 您想要完整的登陸頁體驗(行銷區塊加上工具),而不只是單純的工具介面
|
||
- 您是將 BentoPDF 嵌入商業產品的商業授權持有者
|
||
|
||
**直接執行**(使用 BentoPDF 品牌,方便預覽此版本):
|
||
|
||
```bash
|
||
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
|
||
```
|
||
|
||
**以您自己的品牌建置**(典型的商業工作流程):
|
||
|
||
```bash
|
||
docker build \
|
||
--build-arg VITE_BRAND_NAME="AcmePDF" \
|
||
--build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \
|
||
--build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \
|
||
-t acmepdf .
|
||
|
||
docker run -p 3000:8080 acmepdf
|
||
```
|
||
|
||
其他所有建置時選項(`BASE_URL`、`VITE_DEFAULT_LANGUAGE`、`DISABLE_TOOLS`、WASM URL 覆寫等)的運作方式都與自行架設版相同。
|
||
|
||
::: warning 授權
|
||
在 BentoPDF 的兩種授權選項下,都可以執行商業版:
|
||
|
||
- **AGPL-3.0**(免費):前提是您的部署以 AGPL 公開完整原始碼,包括任何品牌修改與周邊商業邏輯。
|
||
- **商業授權**(終身 $79):適用於不公開品牌分支或商業程式碼的閉源或專有部署。
|
||
|
||
完整比較請參閱[授權頁面](https://www.bentopdf.com/licensing)。採用 AGPL 授權的 WASM 模組(PyMuPDF、Ghostscript、CoherentPDF)會在執行時從 CDN 載入,因此不會進入您的映像檔,也不會改變您的授權狀態。
|
||
:::
|
||
|
||
### Base URL
|
||
|
||
部署到子目錄:
|
||
|
||
```bash
|
||
BASE_URL=/pdf-tools/ npm run build
|
||
```
|
||
|
||
### 自訂品牌
|
||
|
||
在建置時將預設的 BentoPDF 標誌、名稱與頁尾文字替換為您自己的:
|
||
|
||
| 變數 | 說明 | 預設值 |
|
||
| ------------------ | --------------------------- | --------------------------------------- |
|
||
| `VITE_BRAND_NAME` | 顯示於頁首與頁尾的品牌名稱 | `BentoPDF` |
|
||
| `VITE_BRAND_LOGO` | 相對於 `public/` 的標誌路徑 | `images/favicon-no-bg.svg` |
|
||
| `VITE_FOOTER_TEXT` | 自訂頁尾或版權文字 | `© 2026 BentoPDF. All rights reserved.` |
|
||
|
||
```bash
|
||
# Place your logo in public/, then build
|
||
VITE_BRAND_NAME="AcmePDF" \
|
||
VITE_BRAND_LOGO="images/acme-logo.svg" \
|
||
VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \
|
||
npm run build
|
||
```
|
||
|
||
或透過 Docker:
|
||
|
||
```bash
|
||
docker build \
|
||
--build-arg VITE_BRAND_NAME="AcmePDF" \
|
||
--build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \
|
||
--build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \
|
||
-t acmepdf .
|
||
```
|
||
|
||
品牌設定在完整模式與 Simple Mode 下皆可使用,並可與其他所有建置時選項(`BASE_URL`、`SIMPLE_MODE`、`VITE_DEFAULT_LANGUAGE`)搭配使用。
|
||
|
||
### 停用特定工具
|
||
|
||
基於合規或安全考量隱藏個別工具。停用的工具會從首頁、搜尋、快捷鍵、工作流程建構器以及直接 URL 存取中移除。
|
||
|
||
工具 ID 是去掉 `.html` 的頁面 URL:開啟任一工具並查看 URL(例如 `edit-pdf`、`sign-pdf`、`encrypt-pdf`)。
|
||
|
||
**建置時**(寫入套件中):
|
||
|
||
```bash
|
||
DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build
|
||
```
|
||
|
||
**執行時**(無需重新建置,掛載 `config.json` 即可):
|
||
|
||
```json
|
||
{
|
||
"disabledTools": ["edit-pdf", "sign-pdf"]
|
||
}
|
||
```
|
||
|
||
```bash
|
||
docker run -d -p 3000:8080 \
|
||
-v ./config.json:/usr/share/nginx/html/config.json:ro \
|
||
ghcr.io/alam00000/bentopdf-simple:latest
|
||
```
|
||
|
||
兩種方式可以同時使用,清單會合併。
|
||
|
||
您也可以在 `config.json` 中加入 `editorDisabledCategories`,停用 PDF 編輯器中的特定功能(例如塗黑),而不必停用整個工具。完整類別清單請參閱 [Docker 指南](/zh-TW/self-hosting/docker#停用編輯器功能)。
|
||
|
||
## 部署指南
|
||
|
||
選擇您的平台:
|
||
|
||
- [Vercel](/zh-TW/self-hosting/vercel)
|
||
- [Netlify](/zh-TW/self-hosting/netlify)
|
||
- [Cloudflare Pages](/zh-TW/self-hosting/cloudflare)
|
||
- [AWS S3 + CloudFront](/zh-TW/self-hosting/aws)
|
||
- [Hostinger](/zh-TW/self-hosting/hostinger)
|
||
- [Nginx](/zh-TW/self-hosting/nginx)
|
||
- [Apache](/zh-TW/self-hosting/apache)
|
||
- [Docker](/zh-TW/self-hosting/docker)
|
||
- [Kubernetes](/zh-TW/self-hosting/kubernetes)
|
||
- [CORS 代理](/zh-TW/self-hosting/cors-proxy) - 數位簽章所需
|
||
|
||
## 常見問題
|
||
|
||
### Word / ODT / Excel / PowerPoint 轉 PDF 卡住(SharedArrayBuffer 無法使用)
|
||
|
||
**症狀**:以 LibreOffice 為基礎的文件轉換(Word、ODT、Excel、PowerPoint 轉 PDF)卡在約 55% 或無法開始。瀏覽器主控台可能顯示:
|
||
|
||
> `ReferenceError: SharedArrayBuffer is not defined`
|
||
|
||
…或 `window.crossOriginIsolated` 回報 `false`,或 WASM 編譯回報 `expected magic word 00 61 73 6d, found 1f 8b 08 08`。
|
||
|
||
**原因**:LibreOffice WASM 需要 `SharedArrayBuffer`,而瀏覽器只有在頁面**跨來源隔離**且從**安全環境**提供時才會啟用它。這表示必須同時滿足兩個條件:
|
||
|
||
1. 每個回應都包含以下兩個標頭:
|
||
- `Cross-Origin-Embedder-Policy: require-corp`
|
||
- `Cross-Origin-Opener-Policy: same-origin`
|
||
2. 頁面從 `https://...` 或 `http://localhost` 提供。區域網路 IP 上的純 HTTP(例如 `http://192.168.x.x`)不算安全環境,瀏覽器會在那裡停用 `SharedArrayBuffer`。
|
||
|
||
`00 61 73 6d / 1f 8b 08 08` 不符是另一個子症狀:預先壓縮的 `.wasm.gz` / `.data.gz` 檔案缺少 `Content-Encoding: gzip` 回應標頭,因此瀏覽器收到的是原始 gzip 位元組,而非解壓縮後的 WASM。
|
||
|
||
**修正**:請參閱您平台的部署指南以取得確切設定:
|
||
|
||
- [Nginx →](/zh-TW/self-hosting/nginx#word-odt-excel-轉-pdf-無法運作)
|
||
- [Apache →](/zh-TW/self-hosting/apache#word-odt-excel-轉-pdf-無法運作)
|
||
- [AWS S3 + CloudFront →](/zh-TW/self-hosting/aws#步驟-3b-回應標頭政策-libreoffice-wasm-必需)
|
||
- [Cloudflare Pages →](/zh-TW/self-hosting/cloudflare#設定檔)(`_headers` 檔案)
|
||
- [Netlify →](/zh-TW/self-hosting/netlify#word-odt-excel-轉-pdf-卡在-55)(`netlify.toml`)
|
||
- [Vercel →](/zh-TW/self-hosting/vercel#word-odt-excel-轉-pdf-無法運作)(`vercel.json`)
|
||
- [Hostinger →](/zh-TW/self-hosting/hostinger#libreoffice-工具無法運作)(`.htaccess`)
|
||
- [Kubernetes →](/zh-TW/self-hosting/kubernetes#確保-sharedarraybuffer-標頭仍然有效-ingress-gateway)
|
||
- **Docker**:由內建的 nginx 設定自動處理,無需任何操作。
|
||
|
||
**驗證**:在任一 BentoPDF 頁面開啟開發者工具主控台並執行:
|
||
|
||
```js
|
||
console.log(window.crossOriginIsolated); // should be true
|
||
console.log(typeof SharedArrayBuffer); // should be "function"
|
||
```
|
||
|
||
如果頁面使用 HTTPS 或 `http://localhost`,且每個回應都帶有 COEP/COOP 兩個標頭,兩項檢查都會通過。如果您使用的是 `http://192.168.x.x` 或其他非迴路的 HTTP 來源,請以 HTTPS 終止連線,沒有僅靠標頭就能解決的方法。
|
||
|
||
### `.mjs` 檔案以 `application/octet-stream` 提供
|
||
|
||
**症狀**:簽署 PDF / 表單填寫器 / 某些其他工具顯示空白檢視器或無法載入。瀏覽器主控台回報:
|
||
|
||
> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.`
|
||
|
||
**原因**:您的網頁伺服器或反向代理沒有 `.mjs` 檔案的 MIME 類型對應(內建的 PDF 檢視器以此副檔名提供 ES 模組)。許多預設伺服器設定會將無法辨識的副檔名設為 `application/octet-stream`,而瀏覽器會拒絕將其作為 ES 模組執行。
|
||
|
||
**修正**:請參閱您平台的部署指南以取得確切設定片段:
|
||
|
||
- [Nginx →](/zh-TW/self-hosting/nginx#簽署-pdf-或表單填寫器顯示空白檢視器-mjs-mime-錯誤)
|
||
- [Apache →](/zh-TW/self-hosting/apache#簽署-pdf-或表單填寫工具顯示空白檢視器-mjs-mime-錯誤)
|
||
- [AWS S3 + CloudFront →](/zh-TW/self-hosting/aws#步驟-2-建置並上傳)(請參閱 `aws s3 cp ... --include "*.mjs"`)
|
||
- [Kubernetes →](/zh-TW/self-hosting/kubernetes#mjs-mime-類型錯誤-簽署-pdf-表單填寫器-iframe-空白)
|
||
- **Docker、Vercel、Netlify、Cloudflare Pages、Hostinger**:自動處理,無需任何操作。
|
||
|
||
**驗證**:開啟開發者工具 → 網路分頁,找到失敗的 `.mjs` 請求,檢查 `Content-Type` 回應標頭。它應該是 `application/javascript`。如果仍是 `application/octet-stream`,可能是外層的反向代理或 CDN 重新判斷了類型,請檢查服務鏈中的每一層。
|
||
|
||
## WASM 設定(AGPL 元件)
|
||
|
||
BentoPDF 的原始碼**不內含** AGPL 授權的處理函式庫,但已**預先設定 CDN URL**,讓所有功能開箱即用,無需手動設定。
|
||
|
||
::: tip 預設零設定
|
||
自 v2.0.0 起,WASM 模組已透過環境變數預先設定為從 jsDelivr CDN 載入。所有進階功能皆可立即使用,使用者無需任何設定。
|
||
:::
|
||
|
||
| 元件 | 授權 | 功能 |
|
||
| --------------- | -------- | ------------------------------------------ |
|
||
| **PyMuPDF** | AGPL-3.0 | EPUB/MOBI/FB2/XPS 轉換、圖片擷取、表格擷取 |
|
||
| **Ghostscript** | AGPL-3.0 | PDF/A 轉換、壓縮、歪斜校正、點陣化 |
|
||
| **CoherentPDF** | AGPL-3.0 | 目錄、附件、保留書籤的 PDF 合併 |
|
||
|
||
### 預設環境變數
|
||
|
||
這些設定位於 `.env.production`,並在建置時寫入:
|
||
|
||
```bash
|
||
VITE_WASM_PYMUPDF_URL=https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/
|
||
VITE_WASM_GS_URL=https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/
|
||
VITE_WASM_CPDF_URL=https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/
|
||
VITE_TESSERACT_WORKER_URL=
|
||
VITE_TESSERACT_CORE_URL=
|
||
VITE_TESSERACT_LANG_URL=
|
||
VITE_TESSERACT_AVAILABLE_LANGUAGES=
|
||
VITE_OCR_FONT_BASE_URL=
|
||
```
|
||
|
||
### 覆寫 WASM URL
|
||
|
||
您可以在建置時為自訂部署覆寫預設值:
|
||
|
||
```bash
|
||
# Via Docker build args
|
||
docker build \
|
||
--build-arg VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ \
|
||
--build-arg VITE_WASM_GS_URL=https://your-server.com/gs/ \
|
||
--build-arg VITE_WASM_CPDF_URL=https://your-server.com/cpdf/ \
|
||
--build-arg VITE_TESSERACT_WORKER_URL=https://your-server.com/ocr/worker.min.js \
|
||
--build-arg VITE_TESSERACT_CORE_URL=https://your-server.com/ocr/core \
|
||
--build-arg VITE_TESSERACT_LANG_URL=https://your-server.com/ocr/lang-data \
|
||
--build-arg VITE_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \
|
||
--build-arg VITE_OCR_FONT_BASE_URL=https://your-server.com/ocr/fonts \
|
||
-t bentopdf .
|
||
|
||
# Or via .env.production before building from source
|
||
VITE_WASM_PYMUPDF_URL=https://your-server.com/pymupdf/ npm run build
|
||
```
|
||
|
||
若要完全停用某個模組(要求使用者透過進階設定手動設定),請將其變數設為空字串。
|
||
|
||
對於 OCR,您可以將所有 `VITE_TESSERACT_*` 變數留空並使用預設的線上資源,或同時設定 worker/core/lang URL 以自行架設或離線使用 OCR。如果只內含特定 OCR 語言,也請將 `VITE_TESSERACT_AVAILABLE_LANGUAGES` 設為相同的逗號分隔代碼,讓介面只提供已安裝的語言,不支援的選擇則會以說明性錯誤失敗。若要完全離線產生可搜尋的 PDF,也請將 `VITE_OCR_FONT_BASE_URL` 設為提供內建 OCR 字型的內部目錄。
|
||
|
||
使用者也可以隨時透過介面中的**進階設定**覆寫這些預設值:儲存在瀏覽器中的使用者覆寫優先於環境預設值。
|
||
|
||
### 實體隔離 / 離線部署
|
||
|
||
適用於無法連上網際網路的網路(政府、醫療、金融等)。WASM URL 在**建置時**寫入 JavaScript,實際的 WASM 檔案則在執行時由**使用者的瀏覽器**下載。因此您需要在可連網的機器上準備好一切,再將其傳入隔離網路。
|
||
|
||
#### 自動化腳本(建議)
|
||
|
||
內附的 `prepare-airgap.sh` 腳本可自動完成整個流程:下載 WASM 套件、建置 Docker 映像檔,並產生附有設定腳本的獨立套件。
|
||
|
||
```bash
|
||
git clone https://github.com/alam00000/bentopdf.git
|
||
cd bentopdf
|
||
|
||
# Show supported OCR language codes (for --ocr-languages)
|
||
bash scripts/prepare-airgap.sh --list-ocr-languages
|
||
|
||
# Search OCR language codes by name or abbreviation
|
||
bash scripts/prepare-airgap.sh --search-ocr-language german
|
||
|
||
# Interactive mode — prompts for all options
|
||
bash scripts/prepare-airgap.sh
|
||
|
||
# Or fully automated
|
||
bash scripts/prepare-airgap.sh --wasm-base-url https://internal.example.com/wasm
|
||
```
|
||
|
||
這會產生一個套件目錄:
|
||
|
||
```
|
||
bentopdf-airgap-bundle/
|
||
bentopdf.tar # Docker image
|
||
*.tgz # WASM packages (PyMuPDF, Ghostscript, CoherentPDF, Tesseract)
|
||
tesseract-langdata/ # OCR traineddata files
|
||
ocr-fonts/ # OCR text-layer font files
|
||
setup.sh # Setup script for the air-gapped side
|
||
README.md # Instructions
|
||
```
|
||
|
||
透過 USB、內部成品儲存庫或核准的方式將套件傳入實體隔離網路。然後執行內附的設定腳本:
|
||
|
||
```bash
|
||
cd bentopdf-airgap-bundle
|
||
bash setup.sh
|
||
```
|
||
|
||
設定腳本會載入 Docker 映像檔、解壓縮 WASM 檔案,並可選擇啟動容器。
|
||
|
||
**腳本選項:**
|
||
|
||
| 旗標 | 說明 | 預設值 |
|
||
| ------------------------------ | -------------------------------------------- | -------------------------- |
|
||
| `--wasm-base-url <url>` | WASM 在內部的託管位置 | _(必填,缺少時會提示)_ |
|
||
| `--image-name <name>` | Docker 映像檔標籤 | `bentopdf` |
|
||
| `--output-dir <path>` | 輸出套件目錄 | `./bentopdf-airgap-bundle` |
|
||
| `--simple-mode` | 啟用 Simple Mode | 關閉 |
|
||
| `--base-url <path>` | 子目錄 Base URL(例如 `/pdf/`) | `/` |
|
||
| `--language <code>` | 預設介面語言(例如 `fr`、`de`) | _(無)_ |
|
||
| `--brand-name <name>` | 自訂品牌名稱 | _(無)_ |
|
||
| `--brand-logo <path>` | 相對於 `public/` 的標誌路徑 | _(無)_ |
|
||
| `--footer-text <text>` | 自訂頁尾文字 | _(無)_ |
|
||
| `--ocr-languages <list>` | 要內含的 OCR 語言(逗號分隔) | `eng` |
|
||
| `--list-ocr-languages` | 列出支援的 OCR 代碼與名稱後結束 | 關閉 |
|
||
| `--search-ocr-language <term>` | 依名稱或縮寫搜尋 OCR 代碼 | 關閉 |
|
||
| `--dockerfile <path>` | 要使用的 Dockerfile | `Dockerfile` |
|
||
| `--skip-docker` | 略過 Docker 建置與匯出 | 關閉 |
|
||
| `--skip-wasm` | 略過 WASM 下載(重複使用現有的 `.tgz` 檔案) | 關閉 |
|
||
|
||
互動式提示也接受 `list` 以列出完整的 Tesseract 支援代碼清單,以及 `search <term>` 以尋找符合項目,例如 `search german` 或 `search chi`。
|
||
|
||
::: warning 同源要求
|
||
WASM 檔案必須與 BentoPDF 應用程式從**相同來源**提供。Web Worker 使用的 `importScripts()` 無法跨來源載入腳本。例如,若 BentoPDF 執行於 `https://internal.example.com`,WASM Base URL 也應為 `https://internal.example.com/wasm`。
|
||
:::
|
||
|
||
#### 手動步驟
|
||
|
||
<details>
|
||
<summary>如果您偏好不使用腳本,手動完成</summary>
|
||
|
||
**步驟 1:下載 WASM 與 OCR 套件**(在可連網的機器上)
|
||
|
||
```bash
|
||
npm pack @bentopdf/pymupdf-wasm@0.11.14
|
||
npm pack @bentopdf/gs-wasm
|
||
npm pack coherentpdf
|
||
npm pack tesseract.js@7.0.0
|
||
npm pack tesseract.js-core@7.0.0
|
||
mkdir -p tesseract-langdata
|
||
curl -fsSL https://cdn.jsdelivr.net/npm/@tesseract.js-data/eng/4.0.0_best_int/eng.traineddata.gz -o tesseract-langdata/eng.traineddata.gz
|
||
mkdir -p ocr-fonts
|
||
curl -fsSL https://raw.githack.com/googlefonts/noto-fonts/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf -o ocr-fonts/NotoSans-Regular.ttf
|
||
```
|
||
|
||
**步驟 2:以內部 URL 建置 Docker 映像檔**
|
||
|
||
```bash
|
||
git clone https://github.com/alam00000/bentopdf.git
|
||
cd bentopdf
|
||
|
||
docker build \
|
||
--build-arg VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/ \
|
||
--build-arg VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/ \
|
||
--build-arg VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/ \
|
||
--build-arg VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js \
|
||
--build-arg VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core \
|
||
--build-arg VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data \
|
||
--build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \
|
||
-t bentopdf .
|
||
```
|
||
|
||
**步驟 3:匯出 Docker 映像檔**
|
||
|
||
```bash
|
||
docker save bentopdf -o bentopdf.tar
|
||
```
|
||
|
||
**步驟 4:傳入實體隔離網路**
|
||
|
||
透過 USB、內部成品儲存庫或核准的傳輸方式複製:
|
||
|
||
- `bentopdf.tar`:Docker 映像檔
|
||
- 步驟 1 的五個 `.tgz` WASM/OCR 套件
|
||
- 步驟 1 的 `tesseract-langdata/` 目錄
|
||
- 步驟 1 的 `ocr-fonts/` 目錄
|
||
|
||
**步驟 5:在實體隔離網路內設定**
|
||
|
||
```bash
|
||
# Load the Docker image
|
||
docker load -i bentopdf.tar
|
||
|
||
# Extract WASM packages
|
||
mkdir -p ./wasm/pymupdf ./wasm/gs ./wasm/cpdf ./wasm/ocr/core ./wasm/ocr/lang-data ./wasm/ocr/fonts
|
||
tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C ./wasm/pymupdf --strip-components=1
|
||
tar xzf bentopdf-gs-wasm-*.tgz -C ./wasm/gs --strip-components=1
|
||
tar xzf coherentpdf-*.tgz -C ./wasm/cpdf --strip-components=1
|
||
TEMP_TESS=$(mktemp -d)
|
||
tar xzf tesseract.js-7.0.0.tgz -C "$TEMP_TESS"
|
||
cp "$TEMP_TESS/package/dist/worker.min.js" ./wasm/ocr/worker.min.js
|
||
rm -rf "$TEMP_TESS"
|
||
tar xzf tesseract.js-core-7.0.0.tgz -C ./wasm/ocr/core --strip-components=1
|
||
cp ./tesseract-langdata/*.traineddata.gz ./wasm/ocr/lang-data/
|
||
cp ./ocr-fonts/* ./wasm/ocr/fonts/
|
||
|
||
# Run BentoPDF
|
||
docker run -d -p 3000:8080 --restart unless-stopped bentopdf
|
||
```
|
||
|
||
請確認這些檔案可透過您在步驟 2 設定的 URL 存取,包括 `.../ocr/worker.min.js`、`.../ocr/core`、`.../ocr/lang-data` 與 `.../ocr/fonts`。
|
||
|
||
</details>
|
||
|
||
::: info 從原始碼建置而非使用 Docker?
|
||
在執行 `npm run build` 之前,於 `.env.production` 中設定這些變數:
|
||
|
||
```bash
|
||
VITE_WASM_PYMUPDF_URL=https://internal-server.example.com/wasm/pymupdf/
|
||
VITE_WASM_GS_URL=https://internal-server.example.com/wasm/gs/
|
||
VITE_WASM_CPDF_URL=https://internal-server.example.com/wasm/cpdf/
|
||
VITE_TESSERACT_WORKER_URL=https://internal-server.example.com/wasm/ocr/worker.min.js
|
||
VITE_TESSERACT_CORE_URL=https://internal-server.example.com/wasm/ocr/core
|
||
VITE_TESSERACT_LANG_URL=https://internal-server.example.com/wasm/ocr/lang-data
|
||
VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts
|
||
```
|
||
|
||
:::
|
||
|
||
### 架設您自己的 WASM 代理
|
||
|
||
如果您需要以正確的 CORS 標頭提供 AGPL WASM 檔案,可以部署一個簡單的代理。範例實作請參閱 [Cloudflare WASM 代理指南](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md)。
|
||
|
||
::: tip 為何要分開?
|
||
這種分離可確保:
|
||
|
||
- 商業使用者有明確的法律合規性
|
||
- BentoPDF 核心維持其雙重授權(AGPL-3.0 / 商業授權)
|
||
- WASM 檔案在執行時載入,而非內含於原始碼中
|
||
:::
|
||
|
||
## 系統需求
|
||
|
||
| 需求 | 最低規格 |
|
||
| -------- | --------------------------------- |
|
||
| 儲存空間 | 約 100 MB(不含 AGPL 模組的核心) |
|
||
| RAM | 512 MB |
|
||
| CPU | 任何現代處理器 |
|
||
|
||
::: tip
|
||
BentoPDF 是靜態網站,不需要資料庫或後端伺服器!
|
||
:::
|