mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-13 01:54:00 +01:00
feat: translate all pages, UI messages and docs and fix SEO redirects and indexing
This commit is contained in:
1 parent
5e019de5ae
commit
4edb1718cc
3344 files changed
+415643
-4759
No files matched your search
@@ -0,0 +1,136 @@
|
||||
# 参与贡献
|
||||
|
||||
感谢您有兴趣为 BentoPDF 做出贡献!本指南将帮助您快速上手。
|
||||
|
||||
## 开始上手
|
||||
|
||||
### 前置条件
|
||||
|
||||
- Node.js 18+
|
||||
- npm 9+
|
||||
- Git
|
||||
|
||||
### 环境搭建
|
||||
|
||||
```bash
|
||||
# Fork and clone the repository
|
||||
git clone https://github.com/YOUR_USERNAME/bentopdf.git
|
||||
cd bentopdf
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Start development server
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
bentopdf/
|
||||
├── src/
|
||||
│ ├── js/
|
||||
│ │ ├── config/ # Tool definitions
|
||||
│ │ ├── logic/ # Tool page logic
|
||||
│ │ ├── utils/ # Shared utilities
|
||||
│ │ └── ui.ts # UI helpers
|
||||
│ ├── pages/ # Tool HTML pages
|
||||
│ └── css/ # Styles
|
||||
├── public/
|
||||
│ ├── locales/ # Translations
|
||||
│ └── pymupdf-wasm/ # WASM modules
|
||||
├── docs/ # Documentation (VitePress)
|
||||
└── scripts/ # Build scripts
|
||||
```
|
||||
|
||||
## 添加新工具
|
||||
|
||||
### 第 1 步:创建逻辑文件
|
||||
|
||||
创建 `src/js/logic/your-tool-page.ts`:
|
||||
|
||||
```typescript
|
||||
import { showLoader, hideLoader, showAlert } from '../ui.js';
|
||||
import { state } from '../state.js';
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
// Your tool logic here
|
||||
});
|
||||
```
|
||||
|
||||
### 第 2 步:创建 HTML 页面
|
||||
|
||||
参照现有的工具模板,创建 `src/pages/your-tool.html`。
|
||||
|
||||
### 第 3 步:注册工具
|
||||
|
||||
添加到 `src/js/config/tools.ts`:
|
||||
|
||||
```typescript
|
||||
{
|
||||
href: import.meta.env.BASE_URL + 'your-tool.html',
|
||||
name: 'Your Tool',
|
||||
icon: 'ph-icon-name',
|
||||
subtitle: 'Description of your tool.',
|
||||
}
|
||||
```
|
||||
|
||||
### 第 4 步:添加到构建配置
|
||||
|
||||
将页面添加到 `vite.config.ts`:
|
||||
|
||||
```typescript
|
||||
'your-tool': resolve(__dirname, 'src/pages/your-tool.html'),
|
||||
```
|
||||
|
||||
### 第 5 步:添加翻译
|
||||
|
||||
在 `public/locales/` 下的所有语言文件中添加条目:
|
||||
|
||||
```json
|
||||
{
|
||||
"yourTool": {
|
||||
"name": "Your Tool",
|
||||
"subtitle": "Description"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 代码风格
|
||||
|
||||
- 所有新代码都使用 TypeScript
|
||||
- 遵循现有模式以保持一致
|
||||
- 提交前运行 `npm run format`
|
||||
- 生产代码中不要写注释(构建时会移除注释)
|
||||
|
||||
## Pull Request 流程
|
||||
|
||||
1. 创建功能分支:`git checkout -b feature/your-feature`
|
||||
2. 进行修改
|
||||
3. 充分测试:`npm run build`
|
||||
4. 提交 PR 并附上清晰的说明
|
||||
|
||||
## 翻译
|
||||
|
||||
添加新语言请参阅 [TRANSLATION.md](https://github.com/alam00000/bentopdf/blob/main/TRANSLATION.md)。
|
||||
|
||||
## 贡献者许可协议
|
||||
|
||||
在您的 PR 被合并之前,需要先签署我们的 CLA:
|
||||
|
||||
- [个人 CLA (ICLA)](https://github.com/alam00000/bentopdf/blob/main/ICLA.md)
|
||||
- [企业 CLA (CCLA)](https://github.com/alam00000/bentopdf/blob/main/CCLA.md)
|
||||
|
||||
## 获取帮助
|
||||
|
||||
- [GitHub Issues](https://github.com/alam00000/bentopdf/issues)
|
||||
- [Discord 社区](https://discord.gg/Bgq3Ay3f2w)
|
||||
|
||||
## 许可证
|
||||
|
||||
BentoPDF 采用双重许可:
|
||||
|
||||
- **AGPL-3.0**:适用于公开分享完整源代码的开源项目
|
||||
- **商业许可**:适用于专有/闭源应用 - [购买终身许可,仅需 $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)
|
||||
|
||||
贡献代码即表示您同意您的贡献将按上述条款授权。
|
||||
@@ -0,0 +1,80 @@
|
||||
# 快速入门
|
||||
|
||||
欢迎使用 BentoPDF!本指南将帮助您快速上手。
|
||||
|
||||
## 什么是 BentoPDF?
|
||||
|
||||
BentoPDF 是一款免费、开源、隐私优先的 PDF 工具箱,**完全在浏览器中运行**。您的文件不会离开您的设备,所有处理都通过 WebAssembly (WASM) 技术在本地完成。
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 方式 1:使用托管版本
|
||||
|
||||
访问 [bentopdf.com](https://www.bentopdf.com) 即可立即使用 BentoPDF,无需安装。
|
||||
|
||||
### 方式 2:使用 Docker 自托管
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Office 文件转换需要 `SharedArrayBuffer`,这需要同时满足:
|
||||
>
|
||||
> - `Cross-Origin-Opener-Policy: same-origin`
|
||||
> - `Cross-Origin-Embedder-Policy: require-corp`
|
||||
> - 安全上下文
|
||||
>
|
||||
> `http://localhost` 可用于本地测试,因为浏览器将环回地址视为可信。`http://192.168.x.x` 等局域网 IP 通常不被视为可信,因此从网络中的其他设备访问时,Word/Excel/PowerPoint 转换需要使用 HTTPS。
|
||||
|
||||
```bash
|
||||
# Pull and run the Docker image (self-hosted build)
|
||||
docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
|
||||
|
||||
# Or use Docker Compose
|
||||
curl -O https://raw.githubusercontent.com/alam00000/bentopdf/main/docker-compose.yml
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> BentoPDF 提供两种构建版本:**自托管版本**(`bentopdf-simple`,上文使用的版本)适用于内部/团队/组织部署;**商业版本**(`bentopdf:latest`)由 bentopdf.com 自身使用,也供持有商业许可、运行面向公众部署的用户使用。两者的 PDF 工具完全相同,商业版本额外包含 bentopdf.com 的首页横幅、FAQ、用户评价和页脚。如果拿不准,请使用自托管版本。
|
||||
|
||||
然后在浏览器中打开 `http://localhost:3000`。
|
||||
|
||||
> [!NOTE]
|
||||
> 如果您要准备离线隔离(air-gapped)的 OCR 部署,除了 Tesseract worker、核心运行时和 traineddata 文件外,还必须在内部托管 OCR 文本层字体。完整的设置步骤见[自托管](/zh/self-hosting/),其中包括 `VITE_OCR_FONT_BASE_URL` 和随附的 `ocr-fonts/` 目录。
|
||||
|
||||
### 方式 3:从源码构建
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/alam00000/bentopdf.git
|
||||
cd bentopdf
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Start development server
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 功能一览
|
||||
|
||||
| 类别 | 工具 |
|
||||
| --------------- | ------------------------------------------------------ |
|
||||
| **转换为 PDF** | Word、Excel、PowerPoint、图片、Markdown、EPUB、MOBI 等 |
|
||||
| **从 PDF 转换** | JPG、PNG、文本、Excel、SVG 等 |
|
||||
| **编辑与批注** | 签名、高亮、涂黑、填写表单、添加印章 |
|
||||
| **整理** | 合并、拆分、旋转、删除页面、重新排序 |
|
||||
| **优化** | 压缩、修复、扁平化、OCR |
|
||||
| **安全** | 加密、解密、移除限制 |
|
||||
|
||||
## 浏览器支持
|
||||
|
||||
BentoPDF 在现代浏览器上表现最佳:
|
||||
|
||||
- ✅ Chrome/Edge 90+
|
||||
- ✅ Firefox 90+
|
||||
- ✅ Safari 15+
|
||||
|
||||
## 下一步
|
||||
|
||||
- [浏览所有工具](/zh/tools/)
|
||||
- [自托管 BentoPDF](/zh/self-hosting/)
|
||||
- [参与项目贡献](/zh/contributing)
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
# https://vitepress.dev/reference/default-theme-home-page
|
||||
layout: home
|
||||
|
||||
hero:
|
||||
name: 'BentoPDF'
|
||||
text: '免费开源的 PDF 工具'
|
||||
tagline: 完全在浏览器中处理 PDF。无需上传,无需服务器,彻底保护隐私。
|
||||
actions:
|
||||
- theme: brand
|
||||
text: 快速入门
|
||||
link: /zh/getting-started
|
||||
- theme: alt
|
||||
text: 查看工具
|
||||
link: /zh/tools/
|
||||
- theme: alt
|
||||
text: 自托管
|
||||
link: /zh/self-hosting/
|
||||
- theme: alt
|
||||
text: 商业许可
|
||||
link: /zh/licensing
|
||||
|
||||
features:
|
||||
- icon: 🔒
|
||||
title: 100% 私密
|
||||
details: 您的文件不会离开您的设备。所有处理都通过 WebAssembly 在浏览器本地完成。
|
||||
- icon: ⚡
|
||||
title: 快速且免费
|
||||
details: 无需注册,无限制,无水印。永久免费,无限量处理 PDF。
|
||||
- icon: 🛠️
|
||||
title: 50+ 款工具
|
||||
details: 转换、编辑、合并、拆分、压缩、签名、OCR 等,所需功能一应俱全。
|
||||
|
||||
- icon: 🌐
|
||||
title: 可自托管
|
||||
details: 部署在您自己的基础设施上。支持 Docker、Vercel、Netlify、AWS,也可部署在完全离线隔离的环境中,配套自托管的 OCR worker、语言数据和文本层字体。
|
||||
---
|
||||
|
||||
## 离线 OCR
|
||||
|
||||
如果您在离线隔离或无网络的环境中自托管 BentoPDF,OCR 所需的不仅仅是 Tesseract worker 和 traineddata 文件。要输出可搜索的 PDF,还需要在内部提供 OCR 文本层字体。
|
||||
完整设置请参阅[自托管](/zh/self-hosting/),其中包括 `VITE_OCR_FONT_BASE_URL`、随附的 `ocr-fonts/` 目录以及更新后的离线隔离工作流程。
|
||||
@@ -0,0 +1,92 @@
|
||||
# Commercial License
|
||||
|
||||
BentoPDF is dual-licensed under **AGPL-3.0** (for open-source projects) and a **Commercial License** (for proprietary/closed-source applications).
|
||||
|
||||
::: tip Full Details
|
||||
For complete licensing information, delivery details, AGPL component notices, and invoicing, visit our [Licensing Page](https://www.bentopdf.com/licensing).
|
||||
:::
|
||||
|
||||
## Get a Commercial License
|
||||
|
||||
**[Get Lifetime License for $79](https://buy.polar.sh/polar_cl_ThDfffbl733x7oAodcIryCzhlO57ZtcWPq6HJ1qMChd)**. A one-time purchase that includes all future updates forever.
|
||||
|
||||
## When Do You Need a Commercial License?
|
||||
|
||||
| Use Case | License Required |
|
||||
| ------------------------------------------- | ---------------------- |
|
||||
| Open-source project with public source code | AGPL-3.0 (Free) |
|
||||
| Internal company tool (not distributed) | AGPL-3.0 (Free) |
|
||||
| Proprietary/closed-source application | **Commercial License** |
|
||||
| SaaS product without source code disclosure | **Commercial License** |
|
||||
| Redistributing without AGPL compliance | **Commercial License** |
|
||||
|
||||
## Delivery & Licensing Model
|
||||
|
||||
- **No license key is required or provided.** BentoPDF intentionally does not use license keys to streamline deployment and reduce operational friction for users.
|
||||
- Upon purchase, users receive a ZIP archive containing the complete BentoPDF source code and binaries.
|
||||
- The source code provided is identical to the code published in our public open-source repository.
|
||||
|
||||
**GitHub Repository:** [github.com/alam00000/bentopdf](https://github.com/alam00000/bentopdf)
|
||||
|
||||
## Important Notice on Third-Party Components
|
||||
|
||||
::: info AGPL Components — Pre-configured via CDN
|
||||
BentoPDF **does not bundle** AGPL-licensed processing libraries in its source code. These components are loaded at runtime from CDN URLs that are **pre-configured by default** — all features work out of the box with zero setup.
|
||||
|
||||
| Component | License | Status |
|
||||
| --------------- | -------- | ---------------------- |
|
||||
| **PyMuPDF** | AGPL-3.0 | Pre-configured via CDN |
|
||||
| **Ghostscript** | AGPL-3.0 | Pre-configured via CDN |
|
||||
| **CoherentPDF** | AGPL-3.0 | Pre-configured via CDN |
|
||||
|
||||
WASM module URLs are configured via environment variables at build time (`.env.production`). The defaults point to jsDelivr CDN. For custom deployments (air-gapped, self-hosted), you can override via environment variables, Docker build args, or per-user via **Advanced Settings** in the UI.
|
||||
|
||||
See [Self-Hosting > WASM Configuration](/zh/self-hosting/#wasm-配置-agpl-组件) for details.
|
||||
|
||||
This approach ensures:
|
||||
|
||||
- BentoPDF's core code remains under its dual-license (AGPL-3.0 / Commercial)
|
||||
- WASM binaries are loaded at runtime, not included in the source
|
||||
- Clear compliance boundaries for commercial users
|
||||
:::
|
||||
|
||||
::: tip Commercial License & AGPL Features
|
||||
The commercial license covers BentoPDF's own code. If you configure and use AGPL components (PyMuPDF, Ghostscript, CoherentPDF), you must still comply with their respective AGPL-3.0 license terms, which may require source code disclosure if you distribute modified versions.
|
||||
:::
|
||||
|
||||
## Invoicing
|
||||
|
||||
- Payments are handled by [Polar](https://polar.sh), which automatically emails an invoice after purchase.
|
||||
- Polar handles VAT invoices for businesses in applicable regions. Select **"I'm purchasing as a business"** at checkout and enter your billing address and Tax/VAT number.
|
||||
|
||||
**Questions?** Contact [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details.
|
||||
|
||||
## What's Included
|
||||
|
||||
| Feature | Included |
|
||||
| ----------------------------- | -------------- |
|
||||
| Full source code | ✅ |
|
||||
| All 50+ PDF tools | ✅ |
|
||||
| Self-hosting rights | ✅ |
|
||||
| Lifetime updates | ✅ |
|
||||
| Remove branding (Simple Mode) | ✅ |
|
||||
| Commercial support | ✅ (via email) |
|
||||
| Priority feature requests | ✅ |
|
||||
|
||||
## FAQ
|
||||
|
||||
### Do I need a license key to use BentoPDF?
|
||||
|
||||
No. BentoPDF does not use license keys. The commercial license grants you legal rights to use the software in proprietary applications.
|
||||
|
||||
### Can I use BentoPDF in my SaaS product?
|
||||
|
||||
Yes, with a commercial license. Without it, you must comply with AGPL-3.0, which requires you to make your full source code available to users.
|
||||
|
||||
### What about the AGPL components?
|
||||
|
||||
Components like CoherentPDF are licensed under AGPL v3 and remain under that license. The commercial license covers BentoPDF's own code but does not override third-party AGPL obligations.
|
||||
|
||||
### How do I get an invoice?
|
||||
|
||||
Polar emails your invoice automatically after purchase. For a VAT invoice, select "I'm purchasing as a business" at checkout. If you need anything else, email [contact@bentopdf.com](mailto:contact@bentopdf.com) with your purchase details.
|
||||
@@ -0,0 +1,275 @@
|
||||
# 使用 Apache 部署
|
||||
|
||||
使用 Apache HTTP Server 托管 BentoPDF。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- Apache 2.4+
|
||||
- 已启用 mod_rewrite
|
||||
- SSL 证书(推荐)
|
||||
|
||||
## 第 1 步:构建项目
|
||||
|
||||
```bash
|
||||
git clone https://github.com/alam00000/bentopdf.git
|
||||
cd bentopdf
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
如需自定义品牌,请在构建前设置环境变量:
|
||||
|
||||
```bash
|
||||
VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build
|
||||
```
|
||||
|
||||
## 第 2 步:复制文件
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /var/www/bentopdf
|
||||
sudo cp -r dist/* /var/www/bentopdf/
|
||||
sudo chown -R www-data:www-data /var/www/bentopdf
|
||||
```
|
||||
|
||||
## 第 3 步:Apache 配置
|
||||
|
||||
创建 `/etc/apache2/sites-available/bentopdf.conf`:
|
||||
|
||||
```apache
|
||||
<VirtualHost *:80>
|
||||
ServerName your-domain.com
|
||||
Redirect permanent / https://your-domain.com/
|
||||
</VirtualHost>
|
||||
|
||||
<VirtualHost *:443>
|
||||
ServerName your-domain.com
|
||||
DocumentRoot /var/www/bentopdf
|
||||
|
||||
SSLEngine on
|
||||
SSLCertificateFile /etc/letsencrypt/live/your-domain.com/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/your-domain.com/privkey.pem
|
||||
|
||||
<Directory /var/www/bentopdf>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
# WASM MIME type
|
||||
AddType application/wasm .wasm
|
||||
|
||||
# Prevent double-compression of pre-compressed files
|
||||
SetEnvIfNoCase Request_URI "\.gz$" no-gzip
|
||||
|
||||
# Compression
|
||||
<IfModule mod_deflate.c>
|
||||
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript application/json application/wasm
|
||||
</IfModule>
|
||||
|
||||
# Cache headers
|
||||
<IfModule mod_expires.c>
|
||||
ExpiresActive On
|
||||
ExpiresByType application/javascript "access plus 1 year"
|
||||
ExpiresByType text/css "access plus 1 year"
|
||||
ExpiresByType application/wasm "access plus 1 year"
|
||||
ExpiresByType image/png "access plus 1 year"
|
||||
ExpiresByType image/svg+xml "access plus 1 year"
|
||||
</IfModule>
|
||||
|
||||
# Required headers for SharedArrayBuffer (LibreOffice WASM)
|
||||
Header always set Cross-Origin-Embedder-Policy "require-corp"
|
||||
Header always set Cross-Origin-Opener-Policy "same-origin"
|
||||
Header always set Cross-Origin-Resource-Policy "cross-origin"
|
||||
|
||||
# Security headers
|
||||
Header always set X-Frame-Options "SAMEORIGIN"
|
||||
Header always set X-Content-Type-Options "nosniff"
|
||||
|
||||
# Pre-compressed LibreOffice WASM files
|
||||
<FilesMatch "soffice\.wasm\.gz$">
|
||||
ForceType application/wasm
|
||||
Header set Content-Encoding "gzip"
|
||||
</FilesMatch>
|
||||
<FilesMatch "soffice\.data\.gz$">
|
||||
ForceType application/octet-stream
|
||||
Header set Content-Encoding "gzip"
|
||||
</FilesMatch>
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
## 第 4 步:用于路由的 .htaccess
|
||||
|
||||
创建 `/var/www/bentopdf/.htaccess`:
|
||||
|
||||
```apache
|
||||
RewriteEngine On
|
||||
RewriteBase /
|
||||
|
||||
# Existing files/dirs - serve directly
|
||||
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
||||
RewriteCond %{REQUEST_FILENAME} -d
|
||||
RewriteRule ^ - [L]
|
||||
|
||||
# ============================================
|
||||
# LANGUAGE ROUTES
|
||||
# ============================================
|
||||
# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt
|
||||
# English has no prefix - served from root
|
||||
|
||||
# English prefix redirects to root
|
||||
RewriteRule ^en/?$ / [R=301,L]
|
||||
RewriteRule ^en/(.+)$ /$1 [R=301,L]
|
||||
|
||||
# Language prefix root (e.g., /de/ -> /de/index.html)
|
||||
RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L]
|
||||
|
||||
# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html)
|
||||
RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L]
|
||||
|
||||
# ============================================
|
||||
# ADD .HTML EXTENSION (ROOT LEVEL)
|
||||
# ============================================
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME}.html -f
|
||||
RewriteRule ^([^/]+)$ $1.html [L]
|
||||
|
||||
ErrorDocument 404 /404.html
|
||||
```
|
||||
|
||||
## 第 5 步:启用所需模块
|
||||
|
||||
```bash
|
||||
sudo a2enmod rewrite
|
||||
sudo a2enmod ssl
|
||||
sudo a2enmod headers
|
||||
sudo a2enmod expires
|
||||
sudo a2enmod deflate
|
||||
```
|
||||
|
||||
## 第 6 步:启用站点
|
||||
|
||||
```bash
|
||||
sudo a2ensite bentopdf.conf
|
||||
sudo apache2ctl configtest
|
||||
sudo systemctl reload apache2
|
||||
```
|
||||
|
||||
## 子目录部署
|
||||
|
||||
要部署在 `/pdf/` 下:
|
||||
|
||||
1. 使用基础 URL 构建:
|
||||
|
||||
```bash
|
||||
BASE_URL=/pdf/ npm run build
|
||||
```
|
||||
|
||||
2. 更新 `.htaccess`:
|
||||
|
||||
```apache
|
||||
RewriteEngine On
|
||||
RewriteBase /pdf/
|
||||
|
||||
# Existing files/dirs - serve directly
|
||||
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
||||
RewriteCond %{REQUEST_FILENAME} -d
|
||||
RewriteRule ^ - [L]
|
||||
|
||||
# Language routes
|
||||
RewriteRule ^en/?$ /pdf/ [R=301,L]
|
||||
RewriteRule ^en/(.+)$ /pdf/$1 [R=301,L]
|
||||
|
||||
RewriteCond %{DOCUMENT_ROOT}/pdf/$1/index.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf/$1/index.html [L]
|
||||
|
||||
RewriteCond %{DOCUMENT_ROOT}/pdf/$1/$2.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf/$1/$2.html [L]
|
||||
|
||||
# Root level .html extension
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME}.html -f
|
||||
RewriteRule ^([^/]+)$ $1.html [L]
|
||||
|
||||
ErrorDocument 404 /pdf/404.html
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
### WASM 404 错误
|
||||
|
||||
请确认已配置 MIME 类型:
|
||||
|
||||
```apache
|
||||
AddType application/wasm .wasm
|
||||
```
|
||||
|
||||
### 签名 PDF 或表单填写器显示空白查看器(`.mjs` MIME 错误)
|
||||
|
||||
如果浏览器控制台显示:
|
||||
|
||||
```
|
||||
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` 结尾,说明您的 Apache 配置缺少 `.mjs → application/javascript` 的映射。内置的 PDF 查看器使用扩展名为 `.mjs` 的 ES 模块文件,而 Apache 自带的 `mime.types` 默认不包含它们。
|
||||
|
||||
将以下内容添加到您的 VirtualHost 或 `.htaccess`:
|
||||
|
||||
```apache
|
||||
AddType application/javascript .mjs
|
||||
```
|
||||
|
||||
然后重新加载 Apache:
|
||||
|
||||
```bash
|
||||
sudo apache2ctl configtest && sudo systemctl reload apache2
|
||||
```
|
||||
|
||||
验证方法:在浏览器 DevTools 的 Network 标签页中找到失败的 `.mjs` 请求,检查 `Content-Type` 响应头。现在它应为 `application/javascript`,而不是 `application/octet-stream`。
|
||||
|
||||
### Rewrite 不生效
|
||||
|
||||
请检查 mod_rewrite 是否已启用:
|
||||
|
||||
```bash
|
||||
sudo a2enmod rewrite
|
||||
```
|
||||
|
||||
### Word/ODT/Excel 转 PDF 无法使用
|
||||
|
||||
LibreOffice WASM 需要 `SharedArrayBuffer`,这需要以下响应头:
|
||||
|
||||
```apache
|
||||
Header always set Cross-Origin-Embedder-Policy "require-corp"
|
||||
Header always set Cross-Origin-Opener-Policy "same-origin"
|
||||
```
|
||||
|
||||
它还需要安全上下文。`http://localhost` 可用于本地测试,但 `http://192.168.x.x` 等局域网 IP 通常需要 HTTPS。如果响应头已存在,但 `window.crossOriginIsolated` 仍为 `false`,请检查页面是否在非环回来源上通过普通 HTTP 打开。
|
||||
|
||||
预压缩的 `.wasm.gz` 和 `.data.gz` 文件还需要正确的 `Content-Encoding`:
|
||||
|
||||
```apache
|
||||
<FilesMatch "soffice\.wasm\.gz$">
|
||||
ForceType application/wasm
|
||||
Header set Content-Encoding "gzip"
|
||||
</FilesMatch>
|
||||
<FilesMatch "soffice\.data\.gz$">
|
||||
ForceType application/octet-stream
|
||||
Header set Content-Encoding "gzip"
|
||||
</FilesMatch>
|
||||
```
|
||||
|
||||
请确保已启用 `mod_headers`:`sudo a2enmod headers`
|
||||
|
||||
### 权限被拒绝
|
||||
|
||||
```bash
|
||||
sudo chown -R www-data:www-data /var/www/bentopdf
|
||||
sudo chmod -R 755 /var/www/bentopdf
|
||||
```
|
||||
@@ -0,0 +1,200 @@
|
||||
# 部署到 AWS S3 + CloudFront
|
||||
|
||||
在 AWS 上托管 BentoPDF,获得最大的控制力和可扩展性。
|
||||
|
||||
## 架构
|
||||
|
||||
```
|
||||
User → CloudFront (CDN) → S3 (Static Files)
|
||||
```
|
||||
|
||||
## 第 1 步:创建 S3 存储桶
|
||||
|
||||
```bash
|
||||
# Create bucket
|
||||
aws s3 mb s3://your-bentopdf-bucket --region us-east-1
|
||||
|
||||
# Enable static website hosting
|
||||
aws s3 website s3://your-bentopdf-bucket \
|
||||
--index-document index.html \
|
||||
--error-document index.html
|
||||
```
|
||||
|
||||
## 第 2 步:构建并上传
|
||||
|
||||
```bash
|
||||
# Build the project (optionally with custom branding)
|
||||
# VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build
|
||||
npm run build
|
||||
|
||||
# Sync to S3
|
||||
aws s3 sync dist/ s3://your-bentopdf-bucket \
|
||||
--delete \
|
||||
--cache-control "max-age=31536000"
|
||||
|
||||
# Set correct MIME types for WASM
|
||||
aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \
|
||||
--recursive \
|
||||
--exclude "*" \
|
||||
--include "*.wasm" \
|
||||
--content-type "application/wasm" \
|
||||
--metadata-directive REPLACE
|
||||
|
||||
# Set correct MIME type for ES module files (.mjs)
|
||||
# S3 defaults .mjs to application/octet-stream, which browsers refuse to
|
||||
# execute as ES modules. The bundled PDF viewer (Sign PDF, Form Filler)
|
||||
# ships ES modules with .mjs extensions and will fail without this step.
|
||||
aws s3 cp s3://your-bentopdf-bucket/ s3://your-bentopdf-bucket/ \
|
||||
--recursive \
|
||||
--exclude "*" \
|
||||
--include "*.mjs" \
|
||||
--content-type "application/javascript" \
|
||||
--metadata-directive REPLACE
|
||||
```
|
||||
|
||||
## 第 3 步:创建 CloudFront 分配
|
||||
|
||||
```bash
|
||||
aws cloudfront create-distribution \
|
||||
--origin-domain-name your-bentopdf-bucket.s3.amazonaws.com \
|
||||
--default-root-object index.html
|
||||
```
|
||||
|
||||
或者使用 AWS 控制台:
|
||||
|
||||
1. 前往 CloudFront → Create distribution
|
||||
2. Origin domain:选择您的 S3 存储桶
|
||||
3. 启用 "Origin Access Control"
|
||||
4. Default root object:`index.html`
|
||||
5. 创建分配
|
||||
|
||||
## 第 3b 步:响应头策略(LibreOffice WASM 必需)
|
||||
|
||||
基于 LibreOffice 的转换(Word、Excel、PowerPoint 转 PDF)需要 `SharedArrayBuffer`,而这需要特定的响应头。请创建一个 CloudFront 响应头策略(Response Headers Policy):
|
||||
|
||||
1. 前往 CloudFront → Policies → Response headers
|
||||
2. 创建包含以下响应头的自定义策略:
|
||||
|
||||
| 响应头 | 值 |
|
||||
| ------------------------------ | -------------- |
|
||||
| `Cross-Origin-Embedder-Policy` | `require-corp` |
|
||||
| `Cross-Origin-Opener-Policy` | `same-origin` |
|
||||
| `Cross-Origin-Resource-Policy` | `cross-origin` |
|
||||
|
||||
3. 将该策略附加到分配的默认缓存行为
|
||||
|
||||
或者通过 CLI:
|
||||
|
||||
```bash
|
||||
aws cloudfront create-response-headers-policy \
|
||||
--response-headers-policy-config '{
|
||||
"Name": "BentoPDF-COEP-COOP",
|
||||
"CustomHeadersConfig": {
|
||||
"Quantity": 3,
|
||||
"Items": [
|
||||
{"Header": "Cross-Origin-Embedder-Policy", "Value": "require-corp", "Override": true},
|
||||
{"Header": "Cross-Origin-Opener-Policy", "Value": "same-origin", "Override": true},
|
||||
{"Header": "Cross-Origin-Resource-Policy", "Value": "cross-origin", "Override": true}
|
||||
]
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
## 第 3c 步:预压缩 WASM 文件的 S3 元数据
|
||||
|
||||
LibreOffice WASM 文件是预压缩的(`.wasm.gz`、`.data.gz`)。请设置正确的 Content-Type 和 Content-Encoding,让浏览器能够正确解压:
|
||||
|
||||
```bash
|
||||
# Set correct headers for soffice.wasm.gz
|
||||
aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \
|
||||
s3://your-bentopdf-bucket/libreoffice-wasm/soffice.wasm.gz \
|
||||
--content-type "application/wasm" \
|
||||
--content-encoding "gzip" \
|
||||
--metadata-directive REPLACE
|
||||
|
||||
# Set correct headers for soffice.data.gz
|
||||
aws s3 cp s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \
|
||||
s3://your-bentopdf-bucket/libreoffice-wasm/soffice.data.gz \
|
||||
--content-type "application/octet-stream" \
|
||||
--content-encoding "gzip" \
|
||||
--metadata-directive REPLACE
|
||||
```
|
||||
|
||||
::: warning 重要
|
||||
如果没有响应头策略,`SharedArrayBuffer` 将不可用,LibreOffice WASM 转换会卡在约 55%。如果 `.gz` 文件没有正确的 Content-Encoding,浏览器会收到原始的 gzip 字节,WASM 编译将失败。
|
||||
:::
|
||||
|
||||
## 第 4 步:S3 存储桶策略
|
||||
|
||||
允许 CloudFront 访问存储桶:
|
||||
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowCloudFrontAccess",
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"Service": "cloudfront.amazonaws.com"
|
||||
},
|
||||
"Action": "s3:GetObject",
|
||||
"Resource": "arn:aws:s3:::your-bentopdf-bucket/*",
|
||||
"Condition": {
|
||||
"StringEquals": {
|
||||
"AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 第 5 步:自定义错误页面
|
||||
|
||||
将 404 配置为返回 `index.html`,以支持 SPA 路由:
|
||||
|
||||
1. CloudFront → Error pages
|
||||
2. 创建自定义错误响应:
|
||||
- HTTP error code:404
|
||||
- Response page path:`/index.html`
|
||||
- HTTP response code:200
|
||||
|
||||
## 成本估算
|
||||
|
||||
| 资源 | 预估成本 |
|
||||
| ----------------------- | ----------- |
|
||||
| S3 存储(约 500MB) | 约 $0.01/月 |
|
||||
| CloudFront(1TB 流量) | 约 $85/月 |
|
||||
| CloudFront(10GB 流量) | 约 $0.85/月 |
|
||||
|
||||
::: tip
|
||||
对于不常访问的文件,可使用 S3 Intelligent Tiering 来优化成本。
|
||||
:::
|
||||
|
||||
## 使用 Terraform 自动化
|
||||
|
||||
```hcl
|
||||
# main.tf
|
||||
resource "aws_s3_bucket" "bentopdf" {
|
||||
bucket = "your-bentopdf-bucket"
|
||||
}
|
||||
|
||||
resource "aws_cloudfront_distribution" "bentopdf" {
|
||||
origin {
|
||||
domain_name = aws_s3_bucket.bentopdf.bucket_regional_domain_name
|
||||
origin_id = "S3Origin"
|
||||
}
|
||||
|
||||
enabled = true
|
||||
default_root_object = "index.html"
|
||||
|
||||
default_cache_behavior {
|
||||
allowed_methods = ["GET", "HEAD"]
|
||||
cached_methods = ["GET", "HEAD"]
|
||||
target_origin_id = "S3Origin"
|
||||
|
||||
viewer_protocol_policy = "redirect-to-https"
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,154 @@
|
||||
# 部署到 Cloudflare Pages
|
||||
|
||||
[Cloudflare Pages](https://pages.cloudflare.com) 提供快速的全球静态站点托管,带宽不限量。
|
||||
|
||||
## 快速部署
|
||||
|
||||
1. 前往 [Cloudflare Pages](https://dash.cloudflare.com/?to=/:account/pages)
|
||||
2. 点击 "Create a project"
|
||||
3. 连接您的 GitHub 仓库
|
||||
|
||||
## 构建配置
|
||||
|
||||
| 设置 | 值 |
|
||||
| ---------------------- | --------------- |
|
||||
| Framework preset | None |
|
||||
| Build command | `npm run build` |
|
||||
| Build output directory | `dist` |
|
||||
| Root directory | `/` |
|
||||
|
||||
## 环境变量
|
||||
|
||||
在 Settings → Environment variables 中添加以下变量:
|
||||
|
||||
| 变量 | 值 |
|
||||
| ----------------------- | ------------------------------------- |
|
||||
| `NODE_VERSION` | `18` |
|
||||
| `SIMPLE_MODE` | `false`(可选) |
|
||||
| `VITE_BRAND_NAME` | 自定义品牌名称(可选) |
|
||||
| `VITE_BRAND_LOGO` | 相对于 `public/` 的 Logo 路径(可选) |
|
||||
| `VITE_FOOTER_TEXT` | 自定义页脚/版权文本(可选) |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 默认界面语言,例如 `fr`(可选) |
|
||||
|
||||
## 配置文件
|
||||
|
||||
在 `public` 文件夹中创建 `_headers`:
|
||||
|
||||
```
|
||||
# Required security headers for SharedArrayBuffer (used by LibreOffice WASM)
|
||||
/*
|
||||
Cross-Origin-Embedder-Policy: require-corp
|
||||
Cross-Origin-Opener-Policy: same-origin
|
||||
Cross-Origin-Resource-Policy: cross-origin
|
||||
|
||||
# Pre-compressed LibreOffice WASM binary
|
||||
/libreoffice-wasm/soffice.wasm.gz
|
||||
Content-Type: application/wasm
|
||||
Content-Encoding: gzip
|
||||
Cache-Control: public, max-age=31536000, immutable
|
||||
|
||||
# Pre-compressed LibreOffice WASM data
|
||||
/libreoffice-wasm/soffice.data.gz
|
||||
Content-Type: application/octet-stream
|
||||
Content-Encoding: gzip
|
||||
Cache-Control: public, max-age=31536000, immutable
|
||||
|
||||
# Cache WASM files aggressively
|
||||
/*.wasm
|
||||
Cache-Control: public, max-age=31536000, immutable
|
||||
Content-Type: application/wasm
|
||||
|
||||
# Service worker
|
||||
/sw.js
|
||||
Cache-Control: no-cache
|
||||
```
|
||||
|
||||
::: warning 重要
|
||||
Word/ODT/Excel/PowerPoint 转 PDF 需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 响应头。没有它们,`SharedArrayBuffer` 将不可用,LibreOffice WASM 引擎将无法初始化。
|
||||
:::
|
||||
|
||||
创建 `_redirects` 以支持 SPA 路由:
|
||||
|
||||
```
|
||||
/* /index.html 200
|
||||
```
|
||||
|
||||
## 自定义域名
|
||||
|
||||
1. 前往您的 Pages 项目
|
||||
2. 点击 "Custom domains"
|
||||
3. 添加您的域名
|
||||
4. 如果域名托管在 Cloudflare,Cloudflare 会自动配置 DNS
|
||||
|
||||
## 优势
|
||||
|
||||
- **免费且带宽不限量**
|
||||
- **全球 CDN**,拥有 300+ 个边缘节点
|
||||
- **自动 HTTPS**
|
||||
- 为拉取请求提供**预览部署**
|
||||
- **构建速度快**
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 大文件上传
|
||||
|
||||
Cloudflare Pages 支持最大 25 MB 的文件。WASM 模块通常没有问题,但如果遇到限制,可以考虑:
|
||||
|
||||
```bash
|
||||
# Split large files during build
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Worker 大小限制
|
||||
|
||||
如果使用 Cloudflare Workers 进行高级路由,请注意免费计划有 1 MB 的限制。
|
||||
|
||||
## CORS 代理 Worker(用于数字签名)
|
||||
|
||||
数字签名工具需要 CORS 代理来获取证书链。请部署随附的 worker:
|
||||
|
||||
```bash
|
||||
cd cloudflare
|
||||
npx wrangler login
|
||||
npx wrangler deploy
|
||||
```
|
||||
|
||||
### 安全特性
|
||||
|
||||
| 特性 | 说明 |
|
||||
| ---------------- | ----------------------------------- |
|
||||
| **URL 限制** | 仅允许证书 URL |
|
||||
| **文件大小限制** | 每个请求最大 10MB |
|
||||
| **速率限制** | 每个 IP 每分钟 60 次请求(需要 KV) |
|
||||
| **私有 IP 拦截** | 拦截 localhost 和内部 IP |
|
||||
|
||||
### 启用速率限制
|
||||
|
||||
```bash
|
||||
# Create KV namespace
|
||||
npx wrangler kv namespace create "RATE_LIMIT_KV"
|
||||
|
||||
# Add to wrangler.toml with returned ID:
|
||||
# [[kv_namespaces]]
|
||||
# binding = "RATE_LIMIT_KV"
|
||||
# id = "YOUR_ID"
|
||||
|
||||
npx wrangler deploy
|
||||
```
|
||||
|
||||
### 使用代理 URL 构建
|
||||
|
||||
```bash
|
||||
VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build
|
||||
```
|
||||
|
||||
或者使用 Docker:
|
||||
|
||||
```bash
|
||||
export VITE_CORS_PROXY_URL="https://your-worker.workers.dev"
|
||||
DOCKER_BUILDKIT=1 docker build \
|
||||
--secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \
|
||||
-t your-bentopdf .
|
||||
```
|
||||
|
||||
> **注意:** HMAC 签名的设置请参阅 [README](https://github.com/alam00000/bentopdf#digital-signature-cors-proxy-required)。
|
||||
@@ -0,0 +1,180 @@
|
||||
# 用于获取证书的 CORS 代理
|
||||
|
||||
数字签名工具使用 CORS 代理从外部证书颁发机构 (CA) 获取颁发者证书。这是必要的,因为许多 CA 服务器的响应中不包含 CORS 响应头,导致浏览器无法直接获取。
|
||||
|
||||
此外,许多 CA 服务器通过纯 HTTP 提供证书。当您的 BentoPDF 实例通过 HTTPS 托管时,浏览器会阻止这些 HTTP 请求(混合内容策略)。CORS 代理通过 HTTPS 端点并附带正确的响应头转发请求,从而同时解决这两个问题。
|
||||
|
||||
## 工作原理
|
||||
|
||||
使用证书为 PDF 签名时:
|
||||
|
||||
1. `zgapdfsigner` 库会尝试构建完整的证书链
|
||||
2. 它从您证书的 AIA (Authority Information Access) 扩展中嵌入的 URL 获取颁发者证书
|
||||
3. 这些请求会经由 CORS 代理转发,代理会添加必要的 `Access-Control-Allow-Origin` 响应头
|
||||
4. 代理将证书数据返回给浏览器
|
||||
|
||||
## 自托管 CORS 代理
|
||||
|
||||
如果您自托管 BentoPDF,则需要部署自己的 CORS 代理,数字签名才能处理需要获取证书链的证书。
|
||||
|
||||
### 方案 1:Cloudflare Workers(推荐)
|
||||
|
||||
1. **安装 Wrangler CLI**:
|
||||
|
||||
```bash
|
||||
npm install -g wrangler
|
||||
```
|
||||
|
||||
2. **登录 Cloudflare**:
|
||||
|
||||
```bash
|
||||
wrangler login
|
||||
```
|
||||
|
||||
3. **克隆 BentoPDF 并更新允许的来源**:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/alam00000/bentopdf.git
|
||||
cd bentopdf/cloudflare
|
||||
```
|
||||
|
||||
打开 `cors-proxy-worker.js`,将 `ALLOWED_ORIGINS` 数组改为您的域名:
|
||||
|
||||
```js
|
||||
const ALLOWED_ORIGINS = [
|
||||
'https://your-domain.com',
|
||||
'https://www.your-domain.com',
|
||||
];
|
||||
```
|
||||
|
||||
::: warning 重要
|
||||
如果不做此修改,代理会以 **403 Forbidden** 错误拒绝来自您站点的所有请求。默认设置只允许来自 `bentopdf.com` 的请求。
|
||||
:::
|
||||
|
||||
4. **部署代理**:
|
||||
|
||||
```bash
|
||||
wrangler deploy
|
||||
```
|
||||
|
||||
记下您的 worker URL(例如 `https://bentopdf-cors-proxy.your-subdomain.workers.dev`)。
|
||||
|
||||
5. **使用代理 URL 重新构建 BentoPDF**:
|
||||
|
||||
如果使用 Docker:
|
||||
|
||||
```bash
|
||||
export VITE_CORS_PROXY_URL="https://your-worker.workers.dev"
|
||||
DOCKER_BUILDKIT=1 docker build \
|
||||
--secret id=VITE_CORS_PROXY_URL,env=VITE_CORS_PROXY_URL \
|
||||
-t your-bentopdf .
|
||||
```
|
||||
|
||||
如果从源码构建:
|
||||
|
||||
```bash
|
||||
VITE_CORS_PROXY_URL=https://your-worker.workers.dev npm run build
|
||||
```
|
||||
|
||||
### 方案 2:自定义后端代理
|
||||
|
||||
您也可以创建自己的代理端点。要求如下:
|
||||
|
||||
1. 接受带有 `url` 查询参数的 GET 请求
|
||||
2. 从您的服务器获取该 URL(服务端不受 CORS 限制)
|
||||
3. 返回响应时附带以下响应头:
|
||||
- `Access-Control-Allow-Origin: https://your-domain.com`
|
||||
- `Access-Control-Allow-Methods: GET, OPTIONS`
|
||||
- `X-Content-Type-Options: nosniff`
|
||||
|
||||
Express.js 实现示例:
|
||||
|
||||
```javascript
|
||||
app.get('/api/cert-proxy', async (req, res) => {
|
||||
const targetUrl = req.query.url;
|
||||
|
||||
// Validate it's a certificate URL
|
||||
if (!isValidCertUrl(targetUrl)) {
|
||||
return res.status(400).json({ error: 'Invalid URL' });
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(targetUrl);
|
||||
const data = await response.arrayBuffer();
|
||||
|
||||
res.set('Access-Control-Allow-Origin', 'https://your-domain.com');
|
||||
res.set('Content-Type', 'application/octet-stream');
|
||||
res.set('X-Content-Type-Options', 'nosniff');
|
||||
res.send(Buffer.from(data));
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: 'Proxy error' });
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
随附的 Cloudflare Worker 包含多项安全措施:
|
||||
|
||||
| 特性 | 说明 |
|
||||
| --------------------- | --------------------------------------------------------------------- |
|
||||
| **来源验证** | 仅允许来自 `ALLOWED_ORIGINS` 中所列域名的请求 |
|
||||
| **URL 限制** | 仅允许证书 URL(`.crt`、`.cer`、`.pem`、`/certs/`、`/ocsp`、`/crl`) |
|
||||
| **私有 IP 拦截** | 拦截 IPv4/IPv6 私有地址段、链路本地、环回、十进制 IP 以及云元数据地址 |
|
||||
| **Content-Type 安全** | 仅返回安全的证书 MIME 类型,阻止上游 content-type 注入 |
|
||||
| **文件大小限制** | 以流式方式返回响应,限制为 10MB,超出时在下载中途中止 |
|
||||
| **速率限制** | 每个 IP 或 IPv6 /64 每分钟 60 次请求(需要 KV,KV 出错时放行) |
|
||||
| **HMAC 签名** | 可选的客户端签名(可阻止随意滥用) |
|
||||
|
||||
### DNS 重绑定(不在 Cloudflare 上自托管时)
|
||||
|
||||
worker 会拒绝任何解析到私有或内部 IP 的 URL。它无法使用固定的主机白名单,因为证书链 URL 指向的是签发该证书的任意 CA(FNMT、企业 CA 等),所以目标地址事先无法确定。这就留下了一个很小的重绑定窗口:运行自己域名 DNS 的人可以在安全检查时返回公网 IP,稍后在实际请求时返回私有 IP。
|
||||
|
||||
在 Cloudflare 上这无法被利用:Workers 无法访问私有 IP 或 `169.254.169.254` 元数据端点,所以重绑定不会指向任何目标。只需注意不要给 worker 开放入口:不要附加 Tunnel、Service 或私有网络绑定(它只需要 `RATE_LIMIT_KV`)。
|
||||
|
||||
如果您在 VPC 内的 Cloudflare 之外运行它(workerd、Node 等),运行时*可以*访问内部 IP。请在它前面放置出站防火墙,并拦截私有地址段:`10.0.0.0/8`、`172.16.0.0/12`、`192.168.0.0/16`、`127.0.0.0/8`、`169.254.0.0/16`,以及它们对应的 IPv6 地址段。一旦脱离 Cloudflare,应用代码无法强制实现这一点。
|
||||
|
||||
## 禁用代理
|
||||
|
||||
如果不想使用 CORS 代理,请将环境变量设置为空字符串:
|
||||
|
||||
```
|
||||
VITE_CORS_PROXY_URL=
|
||||
```
|
||||
|
||||
**注意**:没有代理时,使用需要获取外部证书链的证书(如 FNMT 或某些企业 CA)进行签名会失败,并报 "Failed to fetch" 错误。
|
||||
|
||||
## 故障排查
|
||||
|
||||
### "Signing error: TypeError: Failed to fetch"
|
||||
|
||||
这通常意味着以下情况之一:
|
||||
|
||||
1. **未配置 CORS 代理**:设置 `VITE_CORS_PROXY_URL` 并重新构建
|
||||
2. **混合内容被阻止**:您的站点使用 HTTPS,但证书的颁发者 URL 是 HTTP。CORS 代理可解决此问题。
|
||||
3. **CORS 代理拒绝了您的来源**:请检查您的域名是否在 `cors-proxy-worker.js` 的 `ALLOWED_ORIGINS` 数组中
|
||||
|
||||
### 代理返回 "403 Forbidden"
|
||||
|
||||
您的域名不在 `ALLOWED_ORIGINS` 列表中。编辑 `cors-proxy-worker.js`:
|
||||
|
||||
```js
|
||||
const ALLOWED_ORIGINS = ['https://your-domain.com'];
|
||||
```
|
||||
|
||||
然后重新部署:`npx wrangler deploy`
|
||||
|
||||
### 测试代理
|
||||
|
||||
```bash
|
||||
curl -H "Origin: https://your-domain.com" \
|
||||
"https://your-proxy.workers.dev?url=http://www.cert.fnmt.es/certs/ACUSU.crt"
|
||||
```
|
||||
|
||||
### 无需代理即可使用的证书
|
||||
|
||||
有些证书在 P12/PFX 文件中包含完整的证书链,不需要获取外部证书:
|
||||
|
||||
- 自签名证书
|
||||
- 某些捆绑了中间证书的商业 CA
|
||||
- 您手动组装了完整证书链的证书
|
||||
@@ -0,0 +1,622 @@
|
||||
# 使用 Docker / Podman 部署
|
||||
|
||||
在生产环境中自托管 BentoPDF 的最简单方式。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Office 文件转换所需的响应头**
|
||||
>
|
||||
> 基于 LibreOffice 的工具(Word、Excel、PowerPoint 转换)需要以下 HTTP 响应头来支持 `SharedArrayBuffer`:
|
||||
>
|
||||
> - `Cross-Origin-Opener-Policy: same-origin`
|
||||
> - `Cross-Origin-Embedder-Policy: require-corp`
|
||||
>
|
||||
> 页面还必须通过安全上下文提供。`http://localhost` 可用于本地测试,但 `http://192.168.x.x` 等局域网 IP 通常不符合要求,因此即使响应头存在,通过纯 HTTP 进行 Office 转换也会失败。
|
||||
>
|
||||
> 官方容器镜像已包含这些响应头。如果使用反向代理(Traefik、Caddy 等),请确保保留或添加这些响应头,并对非环回访问使用 HTTPS。
|
||||
|
||||
> [!TIP]
|
||||
> **Podman 用户:** 将 `docker` 替换为 `podman`、将 `docker-compose` 替换为 `podman-compose`,所有 `docker` 命令都同样适用于 Podman。
|
||||
|
||||
## 快速开始
|
||||
|
||||
> [!TIP]
|
||||
> BentoPDF 提供两种构建版本:
|
||||
>
|
||||
> - **自托管版本**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**营销页面元素(没有首页横幅、FAQ、用户评价和页脚)。适用于内部/团队/组织部署。它**不是**功能精简的 "lite" 版本。
|
||||
> - **商业版本**:`ghcr.io/alam00000/bentopdf:latest`。完整的营销站点,由 bentopdf.com 自身使用,也供持有商业许可、运行面向公众部署的用户使用。
|
||||
>
|
||||
> 如果拿不准,请拉取自托管版本。
|
||||
|
||||
```bash
|
||||
# Docker
|
||||
docker run -d \
|
||||
--name bentopdf \
|
||||
-p 3000:8080 \
|
||||
--restart unless-stopped \
|
||||
ghcr.io/alam00000/bentopdf-simple:latest
|
||||
|
||||
# Podman
|
||||
podman run -d \
|
||||
--name bentopdf \
|
||||
-p 3000:8080 \
|
||||
ghcr.io/alam00000/bentopdf-simple:latest
|
||||
```
|
||||
|
||||
## Docker Compose / Podman Compose
|
||||
|
||||
创建 `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
bentopdf:
|
||||
image: ghcr.io/alam00000/bentopdf-simple:latest
|
||||
container_name: bentopdf
|
||||
ports:
|
||||
- '3000:8080'
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8080']
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
```
|
||||
|
||||
运行:
|
||||
|
||||
```bash
|
||||
# Docker Compose
|
||||
docker compose up -d
|
||||
|
||||
# Podman Compose
|
||||
podman-compose up -d
|
||||
```
|
||||
|
||||
## 构建您自己的镜像
|
||||
|
||||
```dockerfile
|
||||
# Dockerfile
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM nginxinc/nginx-unprivileged:alpine
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
EXPOSE 8080
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
```
|
||||
|
||||
构建并运行:
|
||||
|
||||
```bash
|
||||
docker build -t bentopdf:custom .
|
||||
docker run -d -p 3000:8080 bentopdf:custom
|
||||
```
|
||||
|
||||
## 环境变量
|
||||
|
||||
| 变量 | 说明 | 默认值 |
|
||||
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
|
||||
| `SIMPLE_MODE` | 构建自托管变体(隐藏 bentopdf.com 的营销页面元素:首页横幅、FAQ、用户评价、页脚)。所有 PDF 工具均保留。 | `false` |
|
||||
| `BASE_URL` | 部署到子目录 | `/` |
|
||||
| `VITE_WASM_PYMUPDF_URL` | PyMuPDF WASM 模块 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/` |
|
||||
| `VITE_WASM_GS_URL` | Ghostscript WASM 模块 URL | `https://cdn.jsdelivr.net/npm/@bentopdf/gs-wasm@0.1.1/assets/` |
|
||||
| `VITE_WASM_CPDF_URL` | CoherentPDF WASM 模块 URL | `https://cdn.jsdelivr.net/npm/coherentpdf@2.5.5/dist/` |
|
||||
| `VITE_TESSERACT_WORKER_URL` | OCR worker 脚本 URL | _(空;使用 Tesseract.js 默认 CDN)_ |
|
||||
| `VITE_TESSERACT_CORE_URL` | OCR 核心运行时目录 | _(空;使用 Tesseract.js 默认 CDN)_ |
|
||||
| `VITE_TESSERACT_LANG_URL` | OCR traineddata 目录 | _(空;使用 Tesseract.js 默认 CDN)_ |
|
||||
| `VITE_TESSERACT_AVAILABLE_LANGUAGES` | 在界面中提供的 OCR 语言,以逗号分隔 | _(空;显示完整列表)_ |
|
||||
| `VITE_OCR_FONT_BASE_URL` | OCR 文本层字体目录 | _(空;使用远程 Noto 字体 URL)_ |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 默认界面语言 | `en` |
|
||||
| `VITE_BRAND_NAME` | 自定义品牌名称 | `BentoPDF` |
|
||||
| `VITE_BRAND_LOGO` | 相对于 `public/` 的 Logo 路径 | `images/favicon-no-bg.svg` |
|
||||
| `VITE_FOOTER_TEXT` | 自定义页脚/版权文本 | `© 2026 BentoPDF. All rights reserved.` |
|
||||
| `DISABLE_TOOLS` | 要隐藏的工具 ID,以逗号分隔 | _(空;启用所有工具)_ |
|
||||
| `DISABLE_GITHUB_STARS` | 页面加载时跳过获取 GitHub star 数量,并从 CSP 中移除 `api.github.com`。Simple Mode 构建始终会跳过。 | `false` |
|
||||
| `SITE_URL` | 写入 canonical、hreflang 和站点地图链接的公开 URL。除非您希望搜索引擎将您的部署视为独立站点,否则请保持默认值。 | `https://www.bentopdf.com` |
|
||||
| `ALLOW_INDEXING` | 使用自定义 `SITE_URL` 时,每个页面都会被标记为 `noindex`,以免您的副本在搜索结果中与 bentopdf.com 竞争。设为 `true` 可允许搜索引擎索引。 | `false` |
|
||||
|
||||
WASM 模块 URL 已预先配置了 CDN 默认值,所有高级功能开箱即用。对于离线隔离或自托管部署,请覆盖这些值。
|
||||
|
||||
### 搜索引擎
|
||||
|
||||
默认情况下,每个页面都会让搜索引擎将 bentopdf.com 视为原始来源,因此您的部署不会作为重复内容出现。对于私有或内部实例,您无需做任何更改。
|
||||
|
||||
- **让您的实例完全不出现在搜索结果中:** 使用 `-e ROBOTS_NOINDEX=true` 运行容器。这只需要重启,无需重新构建。
|
||||
- **让您的实例在搜索结果中成为独立站点:** 使用 `--build-arg SITE_URL=https://your-domain.example --build-arg ALLOW_INDEXING=true` 构建。如果没有 `ALLOW_INDEXING=true`,自定义的 `SITE_URL` 会将每个页面标记为 `noindex`。
|
||||
|
||||
### Content-Security-Policy
|
||||
|
||||
nginx 镜像自带强制执行的 `Content-Security-Policy` 响应头。CSP 的 `script-src`、`connect-src` 和 `font-src` 指令会在**构建时**根据上述 `VITE_*` URL 变量生成,您通过 `--build-arg` 传入的任何主机都会自动加入策略。
|
||||
|
||||
因此:
|
||||
|
||||
- 如果在构建时覆盖 `VITE_CORS_PROXY_URL` 或 `VITE_WASM_*_URL`,CSP 会自动允许这些来源,无需额外配置。
|
||||
- 对于 `cdn.jsdelivr.net` 上的 URL,`script-src` 只允许精确到版本的包文件夹,例如 `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`,而不是整个 CDN。jsDelivr 提供任何公开的 npm 包或 GitHub 仓库,允许整个主机会让其中任何内容都能在您的实例上运行。其他主机上的 URL 则按来源允许。
|
||||
- 如果您在*运行时*通过应用内的高级设置页面配置自定义 WASM URL,这些来源**不在** CSP 中,浏览器会阻止对它们的请求。对于 `cdn.jsdelivr.net` 上同一个包的不同版本也是如此,因为只允许构建时设置的版本。运行时配置仅用于试验;要永久使用自定义 URL,请设置对应的 `VITE_*` 构建参数。
|
||||
- 覆盖全部三个 `VITE_WASM_*_URL` 值的离线隔离部署,也会从 CSP 中移除这些 `cdn.jsdelivr.net` 包文件夹(每个默认值都会被替换,而不是追加)。`cdn.jsdelivr.net` 上的 Tesseract OCR 默认值会保留在策略中,直到您同时设置三个 `VITE_TESSERACT_*` 值。同样,设置 `VITE_CORS_PROXY_URL` 会替换公共的 `bentopdf-cors-proxy.bentopdf.workers.dev` 默认值。
|
||||
|
||||
CSP 的 `script-src` 中包含 `'unsafe-eval'`,因为 LibreOffice WASM 运行时(用于 Word/Excel/PowerPoint 转换工具)和 wasm-vips 图像库(用于 PDF 转 TIFF)会在内部动态编译调度代码(通过 `new Function()`)。移除它会导致这些工具无法使用。如果您以 `SIMPLE_MODE`(不含 LibreOffice)构建,且不需要 PDF 转 TIFF,可以手动编辑生成的 `security-headers.conf` 去掉 `'unsafe-eval'`,以获得更严格的策略。
|
||||
|
||||
对于 OCR,将 `VITE_TESSERACT_*` 变量留空即可使用默认的在线资源,或者三个一起设置以用于自托管/离线 OCR。部分覆盖会被拒绝,因为 worker、核心运行时和 traineddata 目录必须相互匹配。要完全离线输出可搜索 PDF,还需设置 `VITE_OCR_FONT_BASE_URL`,让 OCR 文本层字体从您的内部服务器加载,而不是公共的 Noto 字体 URL。
|
||||
|
||||
`VITE_DEFAULT_LANGUAGE` 设置首次访问者的界面语言。支持的值:`en`、`ar`、`be`、`fr`、`de`、`es`、`zh`、`zh-TW`、`vi`、`tr`、`id`、`it`、`pt`、`nl`、`da`。用户仍可切换语言,这只会更改默认值。
|
||||
|
||||
示例:
|
||||
|
||||
```bash
|
||||
# Build with French as the default language
|
||||
docker build --build-arg VITE_DEFAULT_LANGUAGE=fr -t bentopdf .
|
||||
docker run -d -p 3000:8080 bentopdf
|
||||
```
|
||||
|
||||
### 自定义品牌
|
||||
|
||||
将默认的 BentoPDF 标志、名称和页脚文本替换为您自己的。将您的 Logo 文件放入 `public/` 文件夹(或使用现有图片),然后在构建时传入品牌变量:
|
||||
|
||||
```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 下都可使用,并且可以与所有其他构建时选项组合。
|
||||
|
||||
### 禁用特定工具
|
||||
|
||||
出于合规或安全要求,可以在界面中隐藏工具。被禁用的工具会从主页、搜索结果、键盘快捷键和工作流构建器中移除。直接通过 URL 访问会显示"工具不可用"页面。
|
||||
|
||||
工具 ID 是去掉 `.html` 的页面 URL。例如,如果工具位于 `bentopdf.com/edit-pdf.html`,则 ID 为 `edit-pdf`。
|
||||
|
||||
#### 查找工具 ID
|
||||
|
||||
最简单的方法:在 BentoPDF 中打开任意工具并查看 URL。路径的最后一部分(去掉 `.html`)就是工具 ID。
|
||||
|
||||
<details>
|
||||
<summary>完整的工具 ID 列表</summary>
|
||||
|
||||
**编辑与批注:** `edit-pdf`, `bookmark`, `table-of-contents`, `page-numbers`, `add-page-labels`, `bates-numbering`, `add-watermark`, `header-footer`, `invert-colors`, `scanner-effect`, `adjust-colors`, `background-color`, `text-color`, `sign-pdf`, `add-stamps`, `remove-annotations`, `crop-pdf`, `form-filler`, `form-creator`, `remove-blank-pages`
|
||||
|
||||
**转换为 PDF:** `image-to-pdf`, `jpg-to-pdf`, `png-to-pdf`, `webp-to-pdf`, `svg-to-pdf`, `bmp-to-pdf`, `heic-to-pdf`, `tiff-to-pdf`, `txt-to-pdf`, `markdown-to-pdf`, `json-to-pdf`, `csv-to-pdf`, `rtf-to-pdf`, `odt-to-pdf`, `word-to-pdf`, `excel-to-pdf`, `powerpoint-to-pdf`, `xps-to-pdf`, `mobi-to-pdf`, `epub-to-pdf`, `fb2-to-pdf`, `cbz-to-pdf`, `wpd-to-pdf`, `wps-to-pdf`, `xml-to-pdf`, `pages-to-pdf`, `odg-to-pdf`, `ods-to-pdf`, `odp-to-pdf`, `pub-to-pdf`, `vsd-to-pdf`, `psd-to-pdf`, `email-to-pdf`
|
||||
|
||||
**从 PDF 转换:** `pdf-to-jpg`, `pdf-to-png`, `pdf-to-webp`, `pdf-to-bmp`, `pdf-to-tiff`, `pdf-to-cbz`, `pdf-to-svg`, `pdf-to-csv`, `pdf-to-excel`, `pdf-to-greyscale`, `pdf-to-json`, `pdf-to-docx`, `extract-images`, `pdf-to-markdown`, `prepare-pdf-for-ai`, `pdf-to-text`
|
||||
|
||||
**整理与管理:** `ocr-pdf`, `merge-pdf`, `alternate-merge`, `organize-pdf`, `add-attachments`, `extract-attachments`, `edit-attachments`, `pdf-multi-tool`, `pdf-layers`, `extract-tables`, `split-pdf`, `divide-pages`, `extract-pages`, `delete-pages`, `add-blank-page`, `reverse-pages`, `rotate-pdf`, `rotate-custom`, `n-up-pdf`, `pdf-booklet`, `combine-single-page`, `view-metadata`, `edit-metadata`, `pdf-to-zip`, `compare-pdfs`, `posterize-pdf`, `page-dimensions`
|
||||
|
||||
**优化与修复:** `compress-pdf`, `pdf-to-pdfa`, `fix-page-size`, `linearize-pdf`, `remove-restrictions`, `repair-pdf`, `rasterize-pdf`, `deskew-pdf`, `font-to-outline`
|
||||
|
||||
**安全:** `encrypt-pdf`, `sanitize-pdf`, `decrypt-pdf`, `flatten-pdf`, `remove-metadata`, `change-permissions`, `digital-sign-pdf`, `validate-signature-pdf`, `timestamp-pdf`
|
||||
|
||||
</details>
|
||||
|
||||
#### 方式 1:构建时(Docker 构建参数)
|
||||
|
||||
```bash
|
||||
docker build \
|
||||
--build-arg DISABLE_TOOLS="edit-pdf,sign-pdf,encrypt-pdf" \
|
||||
-t bentopdf .
|
||||
```
|
||||
|
||||
这会将禁用列表写入 JavaScript 包中。更改时需要重新构建。
|
||||
|
||||
#### 方式 2:运行时(config.json)
|
||||
|
||||
将 `config.json` 文件挂载到提供服务的目录中,无需重新构建:
|
||||
|
||||
```json
|
||||
{
|
||||
"disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"]
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 3000:8080 \
|
||||
-v ./config.json:/usr/share/nginx/html/config.json:ro \
|
||||
ghcr.io/alam00000/bentopdf-simple:latest
|
||||
```
|
||||
|
||||
或者使用 Docker Compose:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
bentopdf:
|
||||
image: ghcr.io/alam00000/bentopdf-simple:latest
|
||||
ports:
|
||||
- '3000:8080'
|
||||
volumes:
|
||||
- ./config.json:/usr/share/nginx/html/config.json:ro
|
||||
```
|
||||
|
||||
两种方式可以同时使用,列表会被合并。只要工具出现在任一列表中,就会被禁用。
|
||||
|
||||
#### 禁用编辑器功能
|
||||
|
||||
您还可以禁用 PDF 编辑器中的特定功能(例如涂黑、批注、表单),而无需禁用整个编辑器工具。在 `config.json` 中添加 `editorDisabledCategories`:
|
||||
|
||||
```json
|
||||
{
|
||||
"editorDisabledCategories": ["redaction", "annotation-stamp"]
|
||||
}
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>完整的编辑器类别列表</summary>
|
||||
|
||||
**缩放:** `zoom`, `zoom-in`, `zoom-out`, `zoom-fit-page`, `zoom-fit-width`, `zoom-marquee`, `zoom-level`
|
||||
|
||||
**批注:** `annotation`, `annotation-markup`, `annotation-highlight`, `annotation-underline`, `annotation-strikeout`, `annotation-squiggly`, `annotation-ink`, `annotation-text`, `annotation-stamp`
|
||||
|
||||
**形状:** `annotation-shape`, `annotation-rectangle`, `annotation-circle`, `annotation-line`, `annotation-arrow`, `annotation-polygon`, `annotation-polyline`
|
||||
|
||||
**表单:** `form`, `form-textfield`, `form-checkbox`, `form-radio`, `form-select`, `form-listbox`, `form-fill-mode`
|
||||
|
||||
**涂黑:** `redaction`, `redaction-area`, `redaction-text`, `redaction-apply`, `redaction-clear`
|
||||
|
||||
**文档:** `document`, `document-open`, `document-close`, `document-print`, `document-capture`, `document-export`, `document-fullscreen`, `document-protect`
|
||||
|
||||
**页面:** `page`, `spread`, `rotate`, `scroll`, `navigation`
|
||||
|
||||
**面板:** `panel`, `panel-sidebar`, `panel-search`, `panel-comment`
|
||||
|
||||
**工具:** `tools`, `pan`, `pointer`, `capture`
|
||||
|
||||
**选择:** `selection`, `selection-copy`
|
||||
|
||||
**历史记录:** `history`, `history-undo`, `history-redo`
|
||||
|
||||
</details>
|
||||
|
||||
类别是分层级的:禁用父级(例如 `annotation`)会同时禁用它的所有子级。
|
||||
|
||||
### 禁用 GitHub Star 计数器
|
||||
|
||||
导航栏会显示实时的 GitHub star 数量,页面加载时从 `api.github.com` 获取。这是唯一一个不用于 PDF 功能的外部请求。可以在构建时禁用它,从包中移除获取代码,并从 Content-Security-Policy 中移除 `api.github.com`:
|
||||
|
||||
```bash
|
||||
docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf .
|
||||
```
|
||||
|
||||
Simple Mode 构建(`bentopdf-simple`)始终会跳过 star 计数器,此参数只在商业版本或自定义的完整构建中需要。
|
||||
|
||||
### 自定义 WASM URL(离线隔离 / 自托管)
|
||||
|
||||
> [!IMPORTANT]
|
||||
> WASM URL 会在**构建时**写入 JavaScript。WASM 文件由**用户的浏览器**在运行时下载,Docker 在构建期间不会下载它们。对于离线隔离网络,您必须将 WASM 文件托管在浏览器可以访问的内部服务器上。
|
||||
|
||||
**完整的离线隔离工作流程:**
|
||||
|
||||
```bash
|
||||
# 1. On a machine WITH internet — download WASM packages
|
||||
bash scripts/prepare-airgap.sh --list-ocr-languages
|
||||
bash scripts/prepare-airgap.sh --search-ocr-language german
|
||||
|
||||
# 2. Download WASM/OCR packages
|
||||
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
|
||||
|
||||
# 3. Build the image with your internal server URLs
|
||||
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_TESSERACT_AVAILABLE_LANGUAGES=eng,deu \
|
||||
--build-arg VITE_OCR_FONT_BASE_URL=https://internal-server.example.com/wasm/ocr/fonts \
|
||||
-t bentopdf .
|
||||
|
||||
# 4. Export the image
|
||||
docker save bentopdf -o bentopdf.tar
|
||||
|
||||
# 5. Transfer bentopdf.tar + the .tgz packages + tesseract-langdata/ + ocr-fonts/ into the air-gapped network
|
||||
|
||||
# 6. Inside the air-gapped network — load and run
|
||||
docker load -i bentopdf.tar
|
||||
|
||||
# Extract WASM packages to your internal web server
|
||||
mkdir -p /var/www/wasm/pymupdf /var/www/wasm/gs /var/www/wasm/cpdf /var/www/wasm/ocr/core /var/www/wasm/ocr/lang-data /var/www/wasm/ocr/fonts
|
||||
tar xzf bentopdf-pymupdf-wasm-0.11.14.tgz -C /var/www/wasm/pymupdf --strip-components=1
|
||||
tar xzf bentopdf-gs-wasm-*.tgz -C /var/www/wasm/gs --strip-components=1
|
||||
tar xzf coherentpdf-*.tgz -C /var/www/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" /var/www/wasm/ocr/worker.min.js
|
||||
rm -rf "$TEMP_TESS"
|
||||
tar xzf tesseract.js-core-7.0.0.tgz -C /var/www/wasm/ocr/core --strip-components=1
|
||||
cp ./tesseract-langdata/*.traineddata.gz /var/www/wasm/ocr/lang-data/
|
||||
cp ./ocr-fonts/* /var/www/wasm/ocr/fonts/
|
||||
|
||||
# Run BentoPDF
|
||||
docker run -d -p 3000:8080 --restart unless-stopped bentopdf
|
||||
```
|
||||
|
||||
对于 `--ocr-languages`,请使用 `bash scripts/prepare-airgap.sh --list-ocr-languages` 打印出的代码,或使用 `bash scripts/prepare-airgap.sh --search-ocr-language <term>` 按名称搜索。当您使用受限的 OCR 子集构建时,请将相同的代码传给 `VITE_TESSERACT_AVAILABLE_LANGUAGES`,这样应用只会显示已打包的语言。要获得完整的离线 OCR 输出,还需托管随附的 `ocr-fonts/` 目录,并将 `VITE_OCR_FONT_BASE_URL` 指向它。
|
||||
|
||||
将变量设为空字符串即可禁用对应模块(用户必须通过高级设置手动配置)。
|
||||
|
||||
## 自定义端口
|
||||
|
||||
默认情况下,BentoPDF 在容器内监听 `8080` 端口。要更改此设置,请在运行时设置 `PORT` 环境变量:
|
||||
|
||||
```bash
|
||||
docker run -p 3000:9090 -e PORT=9090 ghcr.io/alam00000/bentopdf-simple:latest
|
||||
```
|
||||
|
||||
| 变量 | 说明 | 默认值 |
|
||||
| ------ | --------------------- | ------ |
|
||||
| `PORT` | 容器内 Nginx 监听端口 | `8080` |
|
||||
|
||||
标准 Dockerfile 和 nonroot Dockerfile 都支持此设置。
|
||||
|
||||
## 自定义用户 ID(PUID/PGID)
|
||||
|
||||
对于需要以特定非 root 用户运行的环境(NAS 设备、带安全上下文的 Kubernetes、组织策略),BentoPDF 提供了一个单独的 Dockerfile,支持 LSIO 风格的 PUID/PGID。
|
||||
|
||||
### 构建并运行
|
||||
|
||||
```bash
|
||||
# Build the non-root image
|
||||
docker build -f Dockerfile.nonroot -t bentopdf-nonroot .
|
||||
|
||||
# Run with custom UID/GID
|
||||
docker run -d \
|
||||
--name bentopdf \
|
||||
-p 3000:8080 \
|
||||
-e PUID=1000 \
|
||||
-e PGID=1000 \
|
||||
--restart unless-stopped \
|
||||
bentopdf-nonroot
|
||||
```
|
||||
|
||||
### 环境变量
|
||||
|
||||
| 变量 | 说明 | 默认值 |
|
||||
| -------------- | ------------------- | ------- |
|
||||
| `PUID` | 运行时使用的用户 ID | `1000` |
|
||||
| `PGID` | 运行时使用的组 ID | `1000` |
|
||||
| `PORT` | Nginx 监听端口 | `8080` |
|
||||
| `DISABLE_IPV6` | 禁用 IPv6 监听 | `false` |
|
||||
|
||||
### Docker Compose
|
||||
|
||||
```yaml
|
||||
services:
|
||||
bentopdf:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.nonroot
|
||||
container_name: bentopdf
|
||||
ports:
|
||||
- '3000:8080'
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
### 工作原理
|
||||
|
||||
容器以 root 身份启动,使用指定的 PUID/PGID 创建用户,调整所有可写目录的所有权,然后通过 `su-exec` 降低权限。nginx 进程完全以您指定的用户身份运行。
|
||||
|
||||
> [!NOTE]
|
||||
> 标准 `Dockerfile` 使用 `nginx-unprivileged`(UID 101),推荐用于大多数部署。仅在需要特定 UID/GID 时才使用 `Dockerfile.nonroot`。
|
||||
|
||||
> [!WARNING]
|
||||
> PUID/PGID 不能为 `0`(root)。入口脚本会验证输入,遇到无效值时会报错退出。
|
||||
|
||||
## 配合 Traefik(反向代理)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v2.10
|
||||
command:
|
||||
- '--providers.docker=true'
|
||||
- '--entrypoints.web.address=:80'
|
||||
- '--entrypoints.websecure.address=:443'
|
||||
- '--certificatesresolvers.letsencrypt.acme.email=you@example.com'
|
||||
- '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json'
|
||||
- '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web'
|
||||
ports:
|
||||
- '80:80'
|
||||
- '443:443'
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- ./letsencrypt:/letsencrypt
|
||||
|
||||
bentopdf:
|
||||
image: ghcr.io/alam00000/bentopdf-simple:latest
|
||||
labels:
|
||||
- 'traefik.enable=true'
|
||||
- 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)'
|
||||
- 'traefik.http.routers.bentopdf.entrypoints=websecure'
|
||||
- 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt'
|
||||
- 'traefik.http.services.bentopdf.loadbalancer.server.port=8080'
|
||||
# Required headers for SharedArrayBuffer (LibreOffice WASM)
|
||||
- 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers'
|
||||
- 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin'
|
||||
- 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp'
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
## 配合 Caddy(反向代理)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
caddy:
|
||||
image: caddy:2
|
||||
ports:
|
||||
- '80:80'
|
||||
- '443:443'
|
||||
volumes:
|
||||
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||
- caddy_data:/data
|
||||
|
||||
bentopdf:
|
||||
image: ghcr.io/alam00000/bentopdf-simple:latest
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
caddy_data:
|
||||
```
|
||||
|
||||
Caddyfile:
|
||||
|
||||
```
|
||||
pdf.example.com {
|
||||
reverse_proxy bentopdf:8080
|
||||
header Cross-Origin-Opener-Policy "same-origin"
|
||||
header Cross-Origin-Embedder-Policy "require-corp"
|
||||
}
|
||||
```
|
||||
|
||||
## 资源限制
|
||||
|
||||
```yaml
|
||||
services:
|
||||
bentopdf:
|
||||
image: ghcr.io/alam00000/bentopdf-simple:latest
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '1'
|
||||
memory: 512M
|
||||
reservations:
|
||||
cpus: '0.25'
|
||||
memory: 128M
|
||||
```
|
||||
|
||||
## Podman Quadlet(Systemd 集成)
|
||||
|
||||
[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) 允许您将 Podman 容器作为 systemd 服务运行。这非常适合 Linux 系统上的生产部署。
|
||||
|
||||
### 基本 Quadlet 设置
|
||||
|
||||
在 `~/.config/containers/systemd/bentopdf.container`(用户级)或 `/etc/containers/systemd/bentopdf.container`(系统级)创建容器单元文件:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=BentoPDF - Privacy-first PDF toolkit
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Container]
|
||||
Image=ghcr.io/alam00000/bentopdf-simple:latest
|
||||
ContainerName=bentopdf
|
||||
PublishPort=3000:8080
|
||||
AutoUpdate=registry
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
TimeoutStartSec=300
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
```
|
||||
|
||||
### 启用并启动
|
||||
|
||||
```bash
|
||||
# Reload systemd to detect new unit
|
||||
systemctl --user daemon-reload
|
||||
|
||||
# Start the service
|
||||
systemctl --user start bentopdf
|
||||
|
||||
# Enable on boot
|
||||
systemctl --user enable bentopdf
|
||||
|
||||
# Check status
|
||||
systemctl --user status bentopdf
|
||||
|
||||
# View logs
|
||||
journalctl --user -u bentopdf -f
|
||||
```
|
||||
|
||||
> [!TIP]
|
||||
> 对于系统级部署,请使用不带 `--user` 参数的 `systemctl`,并将文件放在 `/etc/containers/systemd/` 中。
|
||||
|
||||
### 带健康检查的 Quadlet
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=BentoPDF with health monitoring
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Container]
|
||||
Image=ghcr.io/alam00000/bentopdf-simple:latest
|
||||
ContainerName=bentopdf
|
||||
PublishPort=3000:8080
|
||||
AutoUpdate=registry
|
||||
HealthCmd=wget --spider -q http://localhost:8080 || exit 1
|
||||
HealthInterval=30s
|
||||
HealthTimeout=10s
|
||||
HealthRetries=3
|
||||
|
||||
[Service]
|
||||
Restart=always
|
||||
TimeoutStartSec=300
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
```
|
||||
|
||||
### 使用 Quadlet 自动更新
|
||||
|
||||
Podman 可以在有新镜像时自动更新容器:
|
||||
|
||||
```bash
|
||||
# Enable auto-update timer
|
||||
systemctl --user enable --now podman-auto-update.timer
|
||||
|
||||
# Check for updates manually
|
||||
podman auto-update
|
||||
|
||||
# Dry run (check without updating)
|
||||
podman auto-update --dry-run
|
||||
```
|
||||
|
||||
### Quadlet 网络配置
|
||||
|
||||
如需自定义网络配置,请创建网络文件 `bentopdf.network`:
|
||||
|
||||
```ini
|
||||
[Network]
|
||||
Subnet=10.89.0.0/24
|
||||
Gateway=10.89.0.1
|
||||
```
|
||||
|
||||
然后在您的容器文件中引用它:
|
||||
|
||||
```ini
|
||||
[Container]
|
||||
Image=ghcr.io/alam00000/bentopdf-simple:latest
|
||||
ContainerName=bentopdf
|
||||
PublishPort=3000:8080
|
||||
Network=bentopdf.network
|
||||
```
|
||||
|
||||
## 更新
|
||||
|
||||
```bash
|
||||
# Pull latest image
|
||||
docker compose pull
|
||||
|
||||
# Recreate container
|
||||
docker compose up -d
|
||||
```
|
||||
@@ -0,0 +1,266 @@
|
||||
# 部署到 Hostinger
|
||||
|
||||
[Hostinger](https://hostinger.com) 是一家流行的共享主机提供商。本指南介绍如何将 BentoPDF 部署到 Hostinger 的共享主机。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- 带有文件管理器访问权限的 Hostinger 主机套餐
|
||||
- 本地已安装用于构建的 Node.js
|
||||
|
||||
## 第 1 步:构建项目
|
||||
|
||||
```bash
|
||||
git clone https://github.com/alam00000/bentopdf.git
|
||||
cd bentopdf
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
构建产物位于 `dist` 文件夹中。
|
||||
|
||||
## 第 2 步:上传到 Hostinger
|
||||
|
||||
### 根域名部署
|
||||
|
||||
1. 登录您的 Hostinger 账户
|
||||
2. 前往 **File Manager** → **public_html**
|
||||
3. **删除**所有现有文件(如有需要请先备份)
|
||||
4. 将本地 `dist` 文件夹的全部内容**上传**到 `public_html`
|
||||
|
||||
### 子目录部署
|
||||
|
||||
如果部署到子目录(例如 `yourdomain.com/pdf-tools/`):
|
||||
|
||||
1. 使用正确的基础 URL 构建:
|
||||
|
||||
```bash
|
||||
BASE_URL=/pdf-tools/ npm run build
|
||||
```
|
||||
|
||||
2. 在 Hostinger 中创建文件夹:
|
||||
- 前往 **File Manager** → **public_html**
|
||||
- 新建文件夹:`pdf-tools`
|
||||
3. 将 `dist` 的全部内容上传到 `public_html/pdf-tools/`
|
||||
|
||||
## 第 3 步:创建 .htaccess 文件
|
||||
|
||||
在部署文件夹的根目录(`public_html` 或 `public_html/pdf-tools/`)中创建 `.htaccess` 文件:
|
||||
|
||||
::: warning 重要
|
||||
子目录部署时,请将 `RewriteBase /` 改为 `RewriteBase /pdf-tools/`(或您的文件夹名称)。
|
||||
:::
|
||||
|
||||
```apache
|
||||
RewriteEngine On
|
||||
RewriteBase /
|
||||
|
||||
# ============================================
|
||||
# 1. SECURITY HEADERS (CRITICAL FOR WASM)
|
||||
# ============================================
|
||||
<IfModule mod_headers.c>
|
||||
Header always set X-Frame-Options "SAMEORIGIN"
|
||||
Header always set X-Content-Type-Options "nosniff"
|
||||
Header always set X-XSS-Protection "1; mode=block"
|
||||
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
||||
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
|
||||
|
||||
# REQUIRED for soffice.js (SharedArrayBuffer)
|
||||
Header always set Cross-Origin-Opener-Policy "same-origin"
|
||||
Header always set Cross-Origin-Embedder-Policy "require-corp"
|
||||
</IfModule>
|
||||
|
||||
# ============================================
|
||||
# 2. BROWSER CACHING
|
||||
# ============================================
|
||||
<IfModule mod_expires.c>
|
||||
ExpiresActive On
|
||||
ExpiresByType image/jpeg "access plus 1 year"
|
||||
ExpiresByType image/png "access plus 1 year"
|
||||
ExpiresByType image/gif "access plus 1 year"
|
||||
ExpiresByType image/webp "access plus 1 year"
|
||||
ExpiresByType image/svg+xml "access plus 1 year"
|
||||
ExpiresByType image/x-icon "access plus 1 year"
|
||||
ExpiresByType font/woff2 "access plus 1 year"
|
||||
ExpiresByType font/woff "access plus 1 year"
|
||||
ExpiresByType font/ttf "access plus 1 year"
|
||||
ExpiresByType text/css "access plus 1 month"
|
||||
ExpiresByType application/javascript "access plus 1 month"
|
||||
ExpiresByType application/wasm "access plus 1 year"
|
||||
ExpiresByType application/gzip "access plus 1 year"
|
||||
ExpiresByType text/html "access plus 0 seconds"
|
||||
</IfModule>
|
||||
|
||||
# ============================================
|
||||
# 3. COMPRESSION (STANDARD)
|
||||
# ============================================
|
||||
# Prevent server from double-compressing files
|
||||
SetEnvIfNoCase Request_URI "\.gz$" no-gzip
|
||||
SetEnvIfNoCase Request_URI "\.br$" no-gzip
|
||||
SetEnvIfNoCase Request_URI "\.wasm$" no-gzip
|
||||
|
||||
<IfModule mod_deflate.c>
|
||||
AddOutputFilterByType DEFLATE text/plain
|
||||
AddOutputFilterByType DEFLATE text/html
|
||||
AddOutputFilterByType DEFLATE text/xml
|
||||
AddOutputFilterByType DEFLATE text/css
|
||||
AddOutputFilterByType DEFLATE application/xml
|
||||
AddOutputFilterByType DEFLATE application/xhtml+xml
|
||||
AddOutputFilterByType DEFLATE application/rss+xml
|
||||
AddOutputFilterByType DEFLATE application/javascript
|
||||
AddOutputFilterByType DEFLATE application/x-javascript
|
||||
AddOutputFilterByType DEFLATE application/json
|
||||
AddOutputFilterByType DEFLATE image/svg+xml
|
||||
AddOutputFilterByType DEFLATE font/woff
|
||||
AddOutputFilterByType DEFLATE font/ttf
|
||||
</IfModule>
|
||||
|
||||
# ============================================
|
||||
# 4. MIME TYPES & SPECIAL FILE HANDLING
|
||||
# ============================================
|
||||
AddType application/javascript .js .mjs
|
||||
AddType application/wasm .wasm
|
||||
AddType font/woff2 .woff2
|
||||
AddType font/woff .woff
|
||||
AddType image/webp .webp
|
||||
|
||||
# Handle soffice.wasm.gz correctly
|
||||
<FilesMatch "soffice\.wasm\.gz$">
|
||||
ForceType application/wasm
|
||||
Header set Content-Encoding "gzip"
|
||||
Header set Cross-Origin-Resource-Policy "cross-origin"
|
||||
Header append Vary Accept-Encoding
|
||||
</FilesMatch>
|
||||
|
||||
# Handle data.gz
|
||||
<FilesMatch "soffice\.data\.gz$">
|
||||
ForceType application/octet-stream
|
||||
Header set Content-Encoding "gzip"
|
||||
Header append Vary Accept-Encoding
|
||||
</FilesMatch>
|
||||
|
||||
# ============================================
|
||||
# 5. REDIRECTS & ROUTING
|
||||
# ============================================
|
||||
# Canonical WWW (update domain as needed)
|
||||
RewriteCond %{HTTP_HOST} ^bentopdf\.com [NC]
|
||||
RewriteRule ^(.*)$ https://www.bentopdf.com/$1 [L,R=301]
|
||||
|
||||
# Force HTTPS
|
||||
RewriteCond %{HTTPS} off
|
||||
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
|
||||
|
||||
# Remove trailing slash (except for language root directories)
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_URI} !^/(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/$
|
||||
RewriteCond %{REQUEST_URI} (.+)/$
|
||||
RewriteRule ^ %1 [R=301,L]
|
||||
|
||||
# Existing files/dirs - serve directly
|
||||
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
||||
RewriteCond %{REQUEST_FILENAME} -d
|
||||
RewriteRule ^ - [L]
|
||||
|
||||
# ============================================
|
||||
# 5.1. LANGUAGE ROUTES
|
||||
# ============================================
|
||||
# Supported languages: de, es, zh, zh-TW, vi, it, id, tr, fr, pt
|
||||
# English has no prefix - served from root
|
||||
|
||||
# English prefix redirects to root (for SEO consistency)
|
||||
RewriteRule ^en/?$ / [R=301,L]
|
||||
RewriteRule ^en/(.+)$ /$1 [R=301,L]
|
||||
|
||||
# Language prefix root (e.g., /de/ -> /de/index.html)
|
||||
RewriteCond %{DOCUMENT_ROOT}/$1/index.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /$1/index.html [L]
|
||||
|
||||
# Language prefix with path (e.g., /de/merge-pdf -> /de/merge-pdf.html)
|
||||
RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L]
|
||||
|
||||
# ============================================
|
||||
# 5.5. DOCS ROUTING (VitePress)
|
||||
# ============================================
|
||||
RewriteCond %{REQUEST_URI} ^/docs
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME}\.html -f
|
||||
RewriteRule ^(.*)$ $1.html [L]
|
||||
|
||||
# ============================================
|
||||
# 6. ADD .HTML EXTENSION IF FILE EXISTS (ROOT LEVEL ONLY)
|
||||
# ============================================
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME}.html -f
|
||||
RewriteRule ^([^/]+)$ $1.html [L]
|
||||
|
||||
# ============================================
|
||||
# 7. ERROR PAGES
|
||||
# ============================================
|
||||
ErrorDocument 404 /404.html
|
||||
```
|
||||
|
||||
## 子目录 .htaccess 示例
|
||||
|
||||
对于 `yourdomain.com/pdf-tools/`,请更新以下几行:
|
||||
|
||||
```apache
|
||||
RewriteBase /pdf-tools/
|
||||
|
||||
# ... (same content as above, but update paths) ...
|
||||
|
||||
# Language prefix root
|
||||
RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/index.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/?$ /pdf-tools/$1/index.html [L]
|
||||
|
||||
# Language prefix with path
|
||||
RewriteCond %{DOCUMENT_ROOT}/pdf-tools/$1/$2.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /pdf-tools/$1/$2.html [L]
|
||||
|
||||
# Root level .html extension
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME}.html -f
|
||||
RewriteRule ^([^/]+)$ $1.html [L]
|
||||
|
||||
ErrorDocument 404 /pdf-tools/404.html
|
||||
```
|
||||
|
||||
## 故障排查
|
||||
|
||||
### WASM 文件无法加载
|
||||
|
||||
请确认 `.htaccess` 中已正确设置 MIME 类型:
|
||||
|
||||
```apache
|
||||
AddType application/wasm .wasm
|
||||
```
|
||||
|
||||
### LibreOffice 工具无法使用
|
||||
|
||||
安全响应头对 SharedArrayBuffer 至关重要:
|
||||
|
||||
```apache
|
||||
Header always set Cross-Origin-Opener-Policy "same-origin"
|
||||
Header always set Cross-Origin-Embedder-Policy "require-corp"
|
||||
```
|
||||
|
||||
如果响应头没有生效,请联系 Hostinger 支持启用 `mod_headers`。
|
||||
|
||||
### 刷新页面出现 404 错误
|
||||
|
||||
请确保 `.html` 扩展名规则和语言路由配置正确。BentoPDF 使用静态 HTML 文件,而不是 SPA 路由:
|
||||
|
||||
```apache
|
||||
# Language routes serve actual files from language directories
|
||||
RewriteCond %{DOCUMENT_ROOT}/$1/$2.html -f
|
||||
RewriteRule ^(de|es|zh|zh-TW|vi|it|id|tr|fr|pt)/([^/]+)/?$ /$1/$2.html [L]
|
||||
|
||||
# Root level pages
|
||||
RewriteCond %{REQUEST_FILENAME}.html -f
|
||||
RewriteRule ^([^/]+)$ $1.html [L]
|
||||
```
|
||||
|
||||
### 文件上传限制
|
||||
|
||||
Hostinger 可能对文件大小有限制。如果批量上传失败,请单独上传 WASM 文件。
|
||||
@@ -0,0 +1,538 @@
|
||||
# 自托管指南
|
||||
|
||||
BentoPDF 可以部署在您自己的基础设施上。本指南介绍多种部署方式。
|
||||
|
||||
## 使用 Docker / Podman 快速开始
|
||||
|
||||
自托管 BentoPDF 最快的方式:
|
||||
|
||||
> [!TIP]
|
||||
> BentoPDF 提供两种构建版本:
|
||||
>
|
||||
> - **自托管版本**:`ghcr.io/alam00000/bentopdf-simple:latest`。包含所有 PDF 工具,但**不含**营销页面元素(没有首页横幅、FAQ、用户评价和页脚)。适用于内部、团队或组织部署。它**不是**功能精简的“轻量”版本。
|
||||
> - **商业版本**:`ghcr.io/alam00000/bentopdf:latest`。完整的营销网站,bentopdf.com 本身以及运行面向公众部署的商业许可持有者使用该版本。
|
||||
>
|
||||
> 如果拿不准,请拉取自托管版本。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Office 文件转换需要 `SharedArrayBuffer`,这意味着应用必须同时满足跨源隔离,并通过安全上下文提供服务。官方镜像已经发送所需的 COOP/COEP 标头,但浏览器仍会在 `http://192.168.x.x` 这类普通 HTTP 局域网来源上禁用 `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/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 功能):
|
||||
|
||||
- 导航栏、首页横幅、功能介绍区、FAQ、用户评价、页脚
|
||||
- 页面标题更新为“PDF 工具”
|
||||
|
||||
**自托管版本保留的内容**(所有真正处理 PDF 的部分):
|
||||
|
||||
- 所有 PDF 工具(合并、拆分、编辑、签名、OCR、Office 转换等)
|
||||
- 自定义品牌支持,以及所有构建时和运行时配置
|
||||
|
||||
商业版本(`ghcr.io/alam00000/bentopdf:latest`)是 bentopdf.com 本身所用的版本,也供运行面向公众部署的商业许可持有者使用。它额外包含首页横幅、FAQ、用户评价和页脚,这些内容在内部工具中没有意义。
|
||||
|
||||
如果您为团队、组织自托管 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 工具外,它还包含完整的营销网站(首页横幅、功能介绍、FAQ、用户评价、页脚)。当您想以自有品牌**将 BentoPDF 部署为面向公众的 PDF 服务**时,请使用此版本,例如:
|
||||
|
||||
- 您在自己的域名上为最终用户提供托管的 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 即页面 URL 去掉 `.html` 的部分,打开任意工具并查看 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/self-hosting/docker#禁用编辑器功能)。
|
||||
|
||||
## 部署指南
|
||||
|
||||
选择您的平台:
|
||||
|
||||
- [Vercel](/zh/self-hosting/vercel)
|
||||
- [Netlify](/zh/self-hosting/netlify)
|
||||
- [Cloudflare Pages](/zh/self-hosting/cloudflare)
|
||||
- [AWS S3 + CloudFront](/zh/self-hosting/aws)
|
||||
- [Hostinger](/zh/self-hosting/hostinger)
|
||||
- [Nginx](/zh/self-hosting/nginx)
|
||||
- [Apache](/zh/self-hosting/apache)
|
||||
- [Docker](/zh/self-hosting/docker)
|
||||
- [Kubernetes](/zh/self-hosting/kubernetes)
|
||||
- [CORS 代理](/zh/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/self-hosting/nginx#word-odt-excel-转-pdf-无法使用)
|
||||
- [Apache →](/zh/self-hosting/apache#word-odt-excel-转-pdf-无法使用)
|
||||
- [AWS S3 + CloudFront →](/zh/self-hosting/aws#第-3b-步-响应头策略-libreoffice-wasm-必需)
|
||||
- [Cloudflare Pages →](/zh/self-hosting/cloudflare#配置文件)(`_headers` 文件)
|
||||
- [Netlify →](/zh/self-hosting/netlify#word-odt-excel-转-pdf-卡在-55)(`netlify.toml`)
|
||||
- [Vercel →](/zh/self-hosting/vercel#word-odt-excel-转-pdf-无法使用)(`vercel.json`)
|
||||
- [Hostinger →](/zh/self-hosting/hostinger#libreoffice-工具无法使用)(`.htaccess`)
|
||||
- [Kubernetes →](/zh/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、Form Filler 或某些其他工具显示空白查看器或无法加载。浏览器控制台报告:
|
||||
|
||||
> `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.`
|
||||
|
||||
**原因**:您的 Web 服务器或反向代理没有 `.mjs` 文件的 MIME 类型映射(内置的 PDF 查看器使用该扩展名的 ES 模块)。许多默认服务器配置会将无法识别的扩展名归为 `application/octet-stream`,浏览器拒绝将其作为 ES 模块执行。
|
||||
|
||||
**解决方法**:请参阅对应平台的部署指南以获取确切的配置片段:
|
||||
|
||||
- [Nginx →](/zh/self-hosting/nginx#签署-pdf-或-form-filler-显示空白查看器-mjs-mime-错误)
|
||||
- [Apache →](/zh/self-hosting/apache#签名-pdf-或表单填写器显示空白查看器-mjs-mime-错误)
|
||||
- [AWS S3 + CloudFront →](/zh/self-hosting/aws#第-2-步-构建并上传)(参见 `aws s3 cp ... --include "*.mjs"`)
|
||||
- [Kubernetes →](/zh/self-hosting/kubernetes#mjs-mime-类型错误-签署-pdf-form-filler-iframe-空白)
|
||||
- **Docker、Vercel、Netlify、Cloudflare Pages、Hostinger**:自动处理,无需任何操作。
|
||||
|
||||
**验证**:打开开发者工具的 Network 标签,找到失败的 `.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 字体的内部目录。
|
||||
|
||||
用户也可以随时通过界面中的**高级设置**覆盖这些默认值,浏览器中保存的用户覆盖设置优先于环境默认值。
|
||||
|
||||
### 离线隔离(Air-Gapped)部署
|
||||
|
||||
适用于没有互联网访问的网络(政府、医疗、金融等)。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>` | 子目录基础 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 基础 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 模块的核心) |
|
||||
| 内存 | 512 MB |
|
||||
| CPU | 任意现代处理器 |
|
||||
|
||||
::: tip
|
||||
BentoPDF 是静态站点,不需要数据库或后端服务器!
|
||||
:::
|
||||
@@ -0,0 +1,211 @@
|
||||
# 使用 Kubernetes 部署
|
||||
|
||||
对于静态站点来说,Kubernetes 可能有些大材小用,但如果您已经统一采用 Helm + GitOps,它会非常合适。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Office 文件转换所需的标头**
|
||||
>
|
||||
> 基于 LibreOffice 的工具(Word、Excel、PowerPoint 转换)需要以下 HTTP 标头来支持 `SharedArrayBuffer`:
|
||||
>
|
||||
> - `Cross-Origin-Opener-Policy: same-origin`
|
||||
> - `Cross-Origin-Embedder-Policy: require-corp`
|
||||
>
|
||||
> 官方 BentoPDF nginx 镜像已包含这些标头。在 Kubernetes 中,**Ingress/Gateway 控制器同样是反向代理**,因此请确保这些标头被保留(或在边缘层添加)。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- Kubernetes 集群
|
||||
- Helm v3
|
||||
- 一个 BentoPDF nginx 镜像(例如 `ghcr.io/alam00000/bentopdf:<tag>`),监听 **8080 端口**
|
||||
|
||||
## 使用 Helm 部署
|
||||
|
||||
### 从本仓库安装(本地 chart)
|
||||
|
||||
```bash
|
||||
kubectl create namespace bentopdf
|
||||
|
||||
helm upgrade --install bentopdf /path/to/bentopdf/chart \
|
||||
--namespace bentopdf \
|
||||
--set image.repository=ghcr.io/alam00000/bentopdf \
|
||||
--set image.tag=latest
|
||||
```
|
||||
|
||||
### 从 GHCR 安装(OCI chart)
|
||||
|
||||
如果 chart 已作为 OCI 制品发布到 GHCR:
|
||||
|
||||
```bash
|
||||
export GHCR_USERNAME="<github-org-or-user>"
|
||||
|
||||
helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \
|
||||
--namespace bentopdf \
|
||||
--create-namespace \
|
||||
--version 0.1.0 \
|
||||
--set image.repository=ghcr.io/alam00000/bentopdf \
|
||||
--set image.tag=latest
|
||||
```
|
||||
|
||||
## 对外暴露
|
||||
|
||||
### Port-forward(快速测试)
|
||||
|
||||
```bash
|
||||
kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080
|
||||
```
|
||||
|
||||
### Ingress(可选)
|
||||
|
||||
启用 Ingress(以 nginx-ingress 为例):
|
||||
|
||||
```yaml
|
||||
ingress:
|
||||
enabled: true
|
||||
className: nginx
|
||||
hosts:
|
||||
- host: pdf.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
```
|
||||
|
||||
### Gateway API(可选)
|
||||
|
||||
此 chart 支持 Gateway API 的 `Gateway` 和 `HTTPRoute`。
|
||||
|
||||
示例(Cloudflare Gateway API operator):
|
||||
|
||||
```yaml
|
||||
gateway:
|
||||
enabled: true
|
||||
name: bento-tunnel
|
||||
namespace: bentopdf
|
||||
gatewayClassName: cloudflare
|
||||
|
||||
httpRoute:
|
||||
enabled: true
|
||||
parentRefs:
|
||||
- name: bento-tunnel
|
||||
namespace: bentopdf
|
||||
sectionName: http
|
||||
hostnames:
|
||||
- pdfs.example.com
|
||||
```
|
||||
|
||||
## 确保 SharedArrayBuffer 标头仍然有效(Ingress/Gateway)
|
||||
|
||||
### 正常情况下会发生什么
|
||||
|
||||
BentoPDF 的 nginx 配置会设置所需的响应标头。大多数 Ingress/Gateway 控制器会**原样透传上游响应标头**。
|
||||
|
||||
### 什么情况会导致失效
|
||||
|
||||
- 控制器或边缘策略**覆盖**或**移除**了响应标头
|
||||
- “安全标头”中间件设置了不同的 COOP/COEP 值
|
||||
|
||||
### 如何验证
|
||||
|
||||
针对您的公开端点运行:
|
||||
|
||||
```bash
|
||||
curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy'
|
||||
```
|
||||
|
||||
您应该看到:
|
||||
|
||||
- `Cross-Origin-Opener-Policy: same-origin`
|
||||
- `Cross-Origin-Embedder-Policy: require-corp`
|
||||
|
||||
### 如果您的 Ingress 控制器没有保留这些标头
|
||||
|
||||
在边缘层添加标头(具体做法取决于控制器)。**nginx-ingress** 示例:
|
||||
|
||||
```yaml
|
||||
ingress:
|
||||
enabled: true
|
||||
className: nginx
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
```
|
||||
|
||||
## `.mjs` MIME 类型错误(签署 PDF / Form Filler iframe 空白)
|
||||
|
||||
如果浏览器控制台在 `.mjs` 请求上显示 `Failed to load module script: ... non-JavaScript MIME type "application/octet-stream"`,说明 BentoPDF nginx 前面的 Ingress/Gateway 控制器把上游的 `Content-Type` 标头替换成了 `application/octet-stream`。
|
||||
|
||||
BentoPDF 镜像中的 nginx 本身已将 `.mjs` 作为 `application/javascript` 提供。解决方法是阻止控制器移除或替换它。对于 nginx-ingress:
|
||||
|
||||
```yaml
|
||||
ingress:
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||
location ~* \.mjs$ {
|
||||
types {} default_type application/javascript;
|
||||
}
|
||||
```
|
||||
|
||||
或者在 Gateway API 中使用 `ResponseHeaderModifier` 过滤器,为 `.mjs` 路径设置 `Content-Type: application/javascript`。使用开发者工具的 Network 标签验证:失败的 `.mjs` 请求现在应显示 `content-type: application/javascript`。
|
||||
|
||||
### 如果您使用 Gateway API 并想强制添加标头
|
||||
|
||||
Gateway API 支持 `ResponseHeaderModifier` 过滤器。您可以将其附加到 `httpRoute.rules[*].filters`:
|
||||
|
||||
```yaml
|
||||
httpRoute:
|
||||
enabled: true
|
||||
hostnames: [pdf.example.com]
|
||||
parentRefs:
|
||||
- name: bento-tunnel
|
||||
namespace: misc
|
||||
sectionName: http
|
||||
rules:
|
||||
- matches:
|
||||
- path: { type: PathPrefix, value: / }
|
||||
filters:
|
||||
- type: ResponseHeaderModifier
|
||||
responseHeaderModifier:
|
||||
set:
|
||||
- name: Cross-Origin-Opener-Policy
|
||||
value: same-origin
|
||||
- name: Cross-Origin-Embedder-Policy
|
||||
value: require-corp
|
||||
```
|
||||
|
||||
对特定过滤器的支持取决于您的 Gateway 控制器;如果某个过滤器被忽略,请改为在边缘或控制器层添加标头。
|
||||
|
||||
## 禁用特定工具
|
||||
|
||||
使用 ConfigMap 在运行时禁用工具,无需重新构建镜像:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: bentopdf-config
|
||||
namespace: bentopdf
|
||||
data:
|
||||
config.json: |
|
||||
{
|
||||
"disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"]
|
||||
}
|
||||
```
|
||||
|
||||
将其挂载到提供服务的目录中:
|
||||
|
||||
```yaml
|
||||
spec:
|
||||
containers:
|
||||
- name: bentopdf
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /usr/share/nginx/html/config.json
|
||||
subPath: config.json
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: config
|
||||
configMap:
|
||||
name: bentopdf-config
|
||||
```
|
||||
|
||||
工具 ID 即页面 URL 去掉 `.html` 的部分,打开任意工具并查看 URL 即可(例如 `edit-pdf`、`merge-pdf`、`compress-pdf`)。被禁用的工具会从首页、搜索、快捷键、工作流构建器以及直接 URL 访问中隐藏。完整选项请参阅 [Docker 指南](/zh/self-hosting/docker#禁用特定工具)。
|
||||
@@ -0,0 +1,139 @@
|
||||
# 部署到 Netlify
|
||||
|
||||
[Netlify](https://netlify.com) 提供出色的静态站点托管,并有慷慨的免费额度。
|
||||
|
||||
## 一键部署
|
||||
|
||||
[](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf)
|
||||
|
||||
## 手动部署
|
||||
|
||||
### 步骤 1:连接仓库
|
||||
|
||||
1. 登录 [Netlify](https://app.netlify.com)
|
||||
2. 点击 "Add new site" → "Import an existing project"
|
||||
3. 连接您的 GitHub 账户
|
||||
4. 选择您的 BentoPDF 分支
|
||||
|
||||
### 步骤 2:配置构建设置
|
||||
|
||||
| 设置 | 值 |
|
||||
| --------- | --------------- |
|
||||
| 构建命令 | `npm run build` |
|
||||
| 发布目录 | `dist` |
|
||||
| Node 版本 | 18+ |
|
||||
|
||||
### 步骤 3:部署
|
||||
|
||||
点击 "Deploy site" 并等待构建完成。
|
||||
|
||||
## 配置文件
|
||||
|
||||
在项目根目录创建 `netlify.toml`:
|
||||
|
||||
```toml
|
||||
[build]
|
||||
command = "npm run build"
|
||||
publish = "dist"
|
||||
|
||||
[build.environment]
|
||||
NODE_VERSION = "18"
|
||||
|
||||
# Required security headers for SharedArrayBuffer (used by LibreOffice WASM)
|
||||
[[headers]]
|
||||
for = "/*"
|
||||
[headers.values]
|
||||
Cross-Origin-Embedder-Policy = "require-corp"
|
||||
Cross-Origin-Opener-Policy = "same-origin"
|
||||
Cross-Origin-Resource-Policy = "cross-origin"
|
||||
|
||||
# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding
|
||||
[[headers]]
|
||||
for = "/libreoffice-wasm/soffice.wasm.gz"
|
||||
[headers.values]
|
||||
Content-Type = "application/wasm"
|
||||
Content-Encoding = "gzip"
|
||||
Cache-Control = "public, max-age=31536000, immutable"
|
||||
|
||||
# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding
|
||||
[[headers]]
|
||||
for = "/libreoffice-wasm/soffice.data.gz"
|
||||
[headers.values]
|
||||
Content-Type = "application/octet-stream"
|
||||
Content-Encoding = "gzip"
|
||||
Cache-Control = "public, max-age=31536000, immutable"
|
||||
|
||||
# Cache other WASM files
|
||||
[[headers]]
|
||||
for = "*.wasm"
|
||||
[headers.values]
|
||||
Cache-Control = "public, max-age=31536000, immutable"
|
||||
Content-Type = "application/wasm"
|
||||
|
||||
# SPA routing
|
||||
[[redirects]]
|
||||
from = "/*"
|
||||
to = "/index.html"
|
||||
status = 200
|
||||
```
|
||||
|
||||
::: warning 重要
|
||||
Word/ODT/Excel/PowerPoint 转 PDF 需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 标头。缺少它们时,`SharedArrayBuffer` 不可用,LibreOffice WASM 引擎将无法初始化。
|
||||
|
||||
`.wasm.gz` 和 `.data.gz` 文件上的 `Content-Encoding: gzip` 标头会告诉浏览器自动解压。缺少这些标头时,浏览器收到的是原始 gzip 字节,WASM 编译会失败。
|
||||
:::
|
||||
|
||||
## 环境变量
|
||||
|
||||
在 Site settings → Environment variables 中设置:
|
||||
|
||||
| 变量 | 说明 |
|
||||
| ----------------------- | -------------------------------------------------------- |
|
||||
| `SIMPLE_MODE` | 设为 `true` 以使用精简构建 |
|
||||
| `VITE_BRAND_NAME` | 自定义品牌名称(替换 "BentoPDF") |
|
||||
| `VITE_BRAND_LOGO` | 相对于 `public/` 的标志路径(例如 `images/my-logo.svg`) |
|
||||
| `VITE_FOOTER_TEXT` | 自定义页脚/版权文字 |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 默认界面语言(例如 `fr`、`de`、`es`) |
|
||||
|
||||
## 自定义域名
|
||||
|
||||
1. 前往 Site settings → Domain management
|
||||
2. 点击 "Add custom domain"
|
||||
3. 按照说明配置 DNS
|
||||
|
||||
## 大型媒体文件
|
||||
|
||||
对于较大的 WASM 文件,可以考虑启用 [Netlify Large Media](https://docs.netlify.com/large-media/overview/):
|
||||
|
||||
```bash
|
||||
netlify lm:setup
|
||||
git lfs track "*.wasm"
|
||||
```
|
||||
|
||||
## 故障排除
|
||||
|
||||
### Word/ODT/Excel 转 PDF 卡在 55%
|
||||
|
||||
如果文档转换卡在 55%,请打开开发者工具控制台并检查:
|
||||
|
||||
```js
|
||||
console.log(window.crossOriginIsolated); // should be true
|
||||
console.log(typeof SharedArrayBuffer); // should be "function"
|
||||
```
|
||||
|
||||
如果 `crossOriginIsolated` 为 `false`,说明 `netlify.toml` 中的 COEP/COOP 标头没有生效。请确认该文件位于项目根目录,然后重新部署。
|
||||
|
||||
如果您在控制台看到 `expected magic word 00 61 73 6d, found 1f 8b 08 08`,说明 `.wasm.gz` 文件缺少 `Content-Encoding: gzip` 标头。请确保 `netlify.toml` 中包含 `soffice.wasm.gz` 和 `soffice.data.gz` 的 `[[headers]]` 块。
|
||||
|
||||
### 构建失败
|
||||
|
||||
检查 Node 版本兼容性:
|
||||
|
||||
```toml
|
||||
[build.environment]
|
||||
NODE_VERSION = "20"
|
||||
```
|
||||
|
||||
### 首次加载缓慢
|
||||
|
||||
在 Site settings → Build & deploy → Asset optimization 中启用资源优化。
|
||||
@@ -0,0 +1,232 @@
|
||||
# 使用 Nginx 部署
|
||||
|
||||
使用 Nginx 在您自己的服务器上托管 BentoPDF。
|
||||
|
||||
## 前置条件
|
||||
|
||||
- Ubuntu/Debian 服务器
|
||||
- 已安装 Nginx
|
||||
- SSL 证书(推荐:Let's Encrypt)
|
||||
|
||||
## 步骤 1:构建项目
|
||||
|
||||
```bash
|
||||
git clone https://github.com/alam00000/bentopdf.git
|
||||
cd bentopdf
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
如需自定义品牌,请在构建前设置环境变量:
|
||||
|
||||
```bash
|
||||
VITE_BRAND_NAME="AcmePDF" VITE_BRAND_LOGO="images/acme-logo.svg" npm run build
|
||||
```
|
||||
|
||||
## 步骤 2:复制文件
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /var/www/bentopdf
|
||||
sudo cp -r dist/* /var/www/bentopdf/
|
||||
sudo chown -R www-data:www-data /var/www/bentopdf
|
||||
```
|
||||
|
||||
## 步骤 3:Nginx 配置
|
||||
|
||||
创建 `/etc/nginx/sites-available/bentopdf`:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name your-domain.com;
|
||||
|
||||
# SSL Configuration
|
||||
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
|
||||
|
||||
root /var/www/bentopdf;
|
||||
index index.html;
|
||||
|
||||
# Gzip compression
|
||||
gzip on;
|
||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/wasm;
|
||||
gzip_min_length 1000;
|
||||
|
||||
# WASM MIME type
|
||||
types {
|
||||
application/wasm wasm;
|
||||
}
|
||||
|
||||
# Required headers for SharedArrayBuffer (LibreOffice WASM)
|
||||
# These must be on every response - especially HTML pages
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
add_header Cross-Origin-Resource-Policy "cross-origin" always;
|
||||
|
||||
# Security headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
|
||||
# Pre-compressed LibreOffice WASM binary
|
||||
location ~* /libreoffice-wasm/soffice\.wasm\.gz$ {
|
||||
gzip off;
|
||||
types {} default_type application/wasm;
|
||||
add_header Content-Encoding gzip;
|
||||
add_header Cache-Control "public, immutable";
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
}
|
||||
|
||||
# Pre-compressed LibreOffice WASM data
|
||||
location ~* /libreoffice-wasm/soffice\.data\.gz$ {
|
||||
gzip off;
|
||||
types {} default_type application/octet-stream;
|
||||
add_header Content-Encoding gzip;
|
||||
add_header Cache-Control "public, immutable";
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
}
|
||||
|
||||
# Cache static assets
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|wasm)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
}
|
||||
|
||||
# SPA routing - serve index.html for all routes
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 步骤 4:启用站点
|
||||
|
||||
```bash
|
||||
sudo ln -s /etc/nginx/sites-available/bentopdf /etc/nginx/sites-enabled/
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
## 步骤 5:使用 Let's Encrypt 配置 SSL
|
||||
|
||||
```bash
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
sudo certbot --nginx -d your-domain.com
|
||||
```
|
||||
|
||||
## 子目录部署
|
||||
|
||||
要托管在 `/pdf/`:
|
||||
|
||||
```nginx
|
||||
location /pdf/ {
|
||||
alias /var/www/bentopdf/;
|
||||
try_files $uri $uri/ /pdf/index.html;
|
||||
}
|
||||
```
|
||||
|
||||
构建命令:
|
||||
|
||||
```bash
|
||||
BASE_URL=/pdf/ npm run build
|
||||
```
|
||||
|
||||
## 性能调优
|
||||
|
||||
添加到 `nginx.conf`:
|
||||
|
||||
```nginx
|
||||
http {
|
||||
# Enable sendfile
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
|
||||
# Increase buffer sizes
|
||||
client_max_body_size 100M;
|
||||
|
||||
# Worker connections
|
||||
worker_connections 2048;
|
||||
}
|
||||
```
|
||||
|
||||
## 故障排除
|
||||
|
||||
### WASM 无法加载
|
||||
|
||||
确保已设置 MIME 类型:
|
||||
|
||||
```nginx
|
||||
types {
|
||||
application/wasm wasm;
|
||||
}
|
||||
```
|
||||
|
||||
### 签署 PDF 或 Form Filler 显示空白查看器(`.mjs` MIME 错误)
|
||||
|
||||
如果浏览器控制台显示:
|
||||
|
||||
```
|
||||
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` 结尾,说明您的 nginx 缺少 `.mjs → application/javascript` 的映射。内置的 PDF 查看器(签署 PDF、Form Filler 和其他一些工具使用)附带扩展名为 `.mjs` 的 ES 模块文件,而 nginx 默认的 `mime.types` 不包含它们。
|
||||
|
||||
解决方法:在 `/etc/nginx/mime.types` 中,将 `mjs` 加到现有的 `application/javascript` 行:
|
||||
|
||||
```nginx
|
||||
application/javascript js mjs;
|
||||
```
|
||||
|
||||
> 请勿再追加*第二行* `application/javascript`。nginx 逐行解析 `mime.types`,每种类型只有一个扩展名映射生效,因此在某些版本中第二行会被静默忽略。请编辑现有的行,把 `mjs` 与 `js` 放在一起。
|
||||
|
||||
或者在您的 server 块内局部覆盖(无需修改全局文件):
|
||||
|
||||
```nginx
|
||||
types {
|
||||
application/javascript js mjs;
|
||||
application/wasm wasm;
|
||||
}
|
||||
```
|
||||
|
||||
修改后重新加载 nginx:
|
||||
|
||||
```bash
|
||||
sudo nginx -t && sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
确认方法:在浏览器开发者工具的 Network 标签中,找到失败的 `.mjs` 请求并检查 `Content-Type` 响应标头。它现在应为 `application/javascript`,而不是 `application/octet-stream`。
|
||||
|
||||
### Word/ODT/Excel 转 PDF 无法使用
|
||||
|
||||
LibreOffice WASM 需要 `SharedArrayBuffer`,而这需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 标头。它还需要安全上下文,因此 `http://localhost` 可用于本地测试,但 `http://192.168.x.x` 或其他局域网 IP 通常需要 HTTPS。请注意,`location` 块中的 nginx `add_header` 指令会**覆盖**server 级别的 `add_header` 指令,而不是合并。每个带有自己 `add_header` 的 `location` 块都必须包含 COEP/COOP 标头。
|
||||
|
||||
验证方法:
|
||||
|
||||
```bash
|
||||
curl -I https://your-domain.com/ | grep -i cross-origin
|
||||
```
|
||||
|
||||
如果 nginx 前面有反向代理,请确保它保留这些标头。
|
||||
|
||||
### 502 Bad Gateway
|
||||
|
||||
查看 Nginx 错误日志:
|
||||
|
||||
```bash
|
||||
sudo tail -f /var/log/nginx/error.log
|
||||
```
|
||||
@@ -0,0 +1,122 @@
|
||||
# 部署到 Vercel
|
||||
|
||||
[Vercel](https://vercel.com) 为静态站点提供最简单的部署体验。
|
||||
|
||||
## 一键部署
|
||||
|
||||
[](https://vercel.com/new/clone?repository-url=https://github.com/alam00000/bentopdf)
|
||||
|
||||
## 手动部署
|
||||
|
||||
### 步骤 1:Fork 仓库
|
||||
|
||||
将 [bentopdf/bentopdf](https://github.com/alam00000/bentopdf) Fork 到您的 GitHub 账户。
|
||||
|
||||
### 步骤 2:导入到 Vercel
|
||||
|
||||
1. 前往 [vercel.com/new](https://vercel.com/new)
|
||||
2. 选择您 Fork 的仓库
|
||||
3. 配置项目:
|
||||
|
||||
| 设置 | 值 |
|
||||
| ---------------- | --------------- |
|
||||
| Framework Preset | Vite |
|
||||
| Build Command | `npm run build` |
|
||||
| Output Directory | `dist` |
|
||||
| Install Command | `npm install` |
|
||||
|
||||
### 步骤 3:环境变量(可选)
|
||||
|
||||
如有需要,添加以下变量:
|
||||
|
||||
| 变量 | 说明 |
|
||||
| ----------------------- | -------------------------------------------------------- |
|
||||
| `SIMPLE_MODE` | 设为 `true` 以使用精简界面 |
|
||||
| `VITE_BRAND_NAME` | 自定义品牌名称(替换 "BentoPDF") |
|
||||
| `VITE_BRAND_LOGO` | 相对于 `public/` 的标志路径(例如 `images/my-logo.svg`) |
|
||||
| `VITE_FOOTER_TEXT` | 自定义页脚/版权文字 |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 默认界面语言(例如 `fr`、`de`、`es`) |
|
||||
|
||||
### 步骤 4:部署
|
||||
|
||||
点击 "Deploy" 并等待构建完成。
|
||||
|
||||
## 自定义域名
|
||||
|
||||
1. 前往项目设置
|
||||
2. 进入 "Domains"
|
||||
3. 添加您的自定义域名
|
||||
4. 按说明配置 DNS
|
||||
|
||||
## 限制
|
||||
|
||||
::: warning 大文件
|
||||
Vercel 的 serverless 函数有 50MB 的限制。由于 BentoPDF 是静态站点,这通常不会影响您,但 WASM 模块很大(总计约 100MB)。请确保它们从 `/public` 文件夹提供。
|
||||
:::
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 构建超时
|
||||
|
||||
如果构建超时,请尝试:
|
||||
|
||||
```json
|
||||
// vercel.json
|
||||
{
|
||||
"buildCommand": "npm run build",
|
||||
"outputDirectory": "dist"
|
||||
}
|
||||
```
|
||||
|
||||
### 刷新后出现 404
|
||||
|
||||
添加 `vercel.json` 以支持 SPA 路由:
|
||||
|
||||
```json
|
||||
{
|
||||
"rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
|
||||
}
|
||||
```
|
||||
|
||||
### Word/ODT/Excel 转 PDF 无法使用
|
||||
|
||||
LibreOffice WASM 转换需要 `SharedArrayBuffer`,这要求所有页面都带有以下响应标头:
|
||||
|
||||
- `Cross-Origin-Embedder-Policy: require-corp`
|
||||
- `Cross-Origin-Opener-Policy: same-origin`
|
||||
|
||||
预压缩的 `.wasm.gz` 和 `.data.gz` 文件还需要 `Content-Encoding: gzip`,浏览器才会对其解压。
|
||||
|
||||
将以下内容添加到您的 `vercel.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"rewrites": [{ "source": "/(.*)", "destination": "/index.html" }],
|
||||
"headers": [
|
||||
{
|
||||
"source": "/(.*)",
|
||||
"headers": [
|
||||
{ "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" },
|
||||
{ "key": "Cross-Origin-Opener-Policy", "value": "same-origin" },
|
||||
{ "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "/libreoffice-wasm/soffice.wasm.gz",
|
||||
"headers": [
|
||||
{ "key": "Content-Type", "value": "application/wasm" },
|
||||
{ "key": "Content-Encoding", "value": "gzip" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "/libreoffice-wasm/soffice.data.gz",
|
||||
"headers": [
|
||||
{ "key": "Content-Type", "value": "application/octet-stream" },
|
||||
{ "key": "Content-Encoding", "value": "gzip" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
要验证,请打开开发者工具控制台并运行 `console.log(window.crossOriginIsolated)`,它应返回 `true`。
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: 添加附件
|
||||
description: 将任意类型的文件嵌入 PDF,可附加到整个文档或特定页面。
|
||||
---
|
||||
|
||||
# 添加附件
|
||||
|
||||
将一个或多个文件直接嵌入 PDF 文档。附件可以添加到文档级别(在任何 PDF 阅读器的附件面板中可见),也可以绑定到特定页面。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传要添加附件的 PDF。
|
||||
2. 使用附件拖放区选择要嵌入的文件(任意文件类型)。
|
||||
3. 选择附件级别:**文档**(默认)或**页面**。
|
||||
4. 如果选择页面级别,请输入页面范围(例如 `1-3` 或 `5`)。
|
||||
5. 点击处理按钮。嵌入了您的文件的 PDF 会自动下载。
|
||||
|
||||
## 功能
|
||||
|
||||
- 可附加任意文件类型:图片、电子表格、压缩包、可执行文件等
|
||||
- 支持文档级或页面级附件位置
|
||||
- 一次操作可附加多个文件
|
||||
- 显示所有已选附件的文件名和大小
|
||||
- 输出保留原始 PDF 内容,并加入嵌入的文件
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 说明 |
|
||||
| ------------ | ------------------------------------------ |
|
||||
| **文档级别** | 将文件附加到整个 PDF,可从附件面板访问 |
|
||||
| **页面级别** | 将文件附加到特定页面,通过页面范围输入指定 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将源数据(Excel 文件、CSV)与 PDF 报告打包在一起
|
||||
- 将原始图片文件附加到摄影作品集 PDF
|
||||
- 在合同或提案中嵌入支持文档
|
||||
- 为培训手册的特定页面添加补充材料
|
||||
|
||||
## 提示
|
||||
|
||||
- 文档级附件在各 PDF 阅读器中的支持最广泛。页面级附件可能无法在所有查看器中显示。
|
||||
- 附件没有文件大小限制,但嵌入非常大的文件会使 PDF 按比例增大。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [提取附件](./extract-attachments)
|
||||
- [编辑附件](./edit-attachments)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
title: 添加空白页
|
||||
description: 在 PDF 文档的任意位置插入一个或多个空白页。
|
||||
---
|
||||
|
||||
# 添加空白页
|
||||
|
||||
在您指定的位置向 PDF 插入空白页。您可以控制空白页的插入位置和数量。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传 PDF 文件。工具会显示页数。
|
||||
2. 输入要插入空白页的**位置**。使用 `0` 在最开头插入,或使用总页数在末尾追加。
|
||||
3. 输入要添加的空白页**数量**(默认为 1)。
|
||||
4. 点击处理按钮。插入了空白页的 PDF 会自动下载。
|
||||
|
||||
## 功能
|
||||
|
||||
- 可在任意位置插入:文档开头、中间或末尾
|
||||
- 一次操作添加多个空白页
|
||||
- 位置提示会根据上传 PDF 的页数动态更新
|
||||
- 标准 A4 尺寸的空白页
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在合编文档的各部分之间添加空白分隔页
|
||||
- 插入空白页以对齐双面打印
|
||||
- 为打印的学习指南添加手写笔记空间
|
||||
- 补页以满足最低页数要求
|
||||
|
||||
## 提示
|
||||
|
||||
- 位置 `0` 表示插入到第一页之前。位置等于总页数表示追加到最后一页之后。
|
||||
- 如果需要在特定位置插入内容(而不只是空白页),请使用 [PDF 多功能工具](./pdf-multi-tool)在指定页后插入另一个 PDF。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [整理与复制](./organize-pdf)
|
||||
- [PDF 多功能工具](./pdf-multi-tool)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: 添加页面标签
|
||||
description: 添加 PDF 页面标签,支持罗马数字、字母前缀、自定义编号,以及每个文档多条规则。
|
||||
---
|
||||
|
||||
# 添加页面标签
|
||||
|
||||
页面标签控制页码在 PDF 查看器中的显示方式(显示在工具栏中的数字,而不是印在页面上的数字)。此工具可以为不同的页面范围分配不同的标签方案:前言使用罗马数字,正文使用十进制数字,附录使用字母等。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传您的 PDF 文件。
|
||||
2. 出现选项面板,默认带有一条标签规则。
|
||||
3. 为每条规则配置页面范围、样式、可选前缀和起始值。
|
||||
4. 点击**添加规则**为不同部分创建更多规则。
|
||||
5. 点击**添加页面标签**应用所有规则并下载结果。
|
||||
|
||||
## 选项
|
||||
|
||||
每条标签规则有以下设置:
|
||||
|
||||
- **页面范围**:规则适用的页面。留空表示所有页面。支持 `1-4`、`7`、`odd` 或 `1-9,30-40` 等范围。
|
||||
- **标签样式**:十进制阿拉伯数字、小写罗马数字(i, ii, iii)、大写罗马数字(I, II, III)、小写字母(a, b, c)、大写字母(A, B, C),或无标签(仅前缀)。
|
||||
- **标签前缀**:添加在每个标签前的可选文本,例如 "A-" 可生成 A-1、A-2、A-3 这样的标签。
|
||||
- **起始值**:开始计数的数字。默认为 1。设为 0 可使用从零开始的编号。
|
||||
- **跨不连续范围继续编号**:当规则针对不连续的页面(如 `1-9,30-40` 或 `odd`)并且希望编号顺序延续时启用。
|
||||
- **移除现有页面标签**:默认勾选。在应用新规则之前清除之前的所有标签。
|
||||
|
||||
## 功能
|
||||
|
||||
- 每个文档可设置多条标签规则,适应复杂的编号方案
|
||||
- 六种标签样式,涵盖所有标准编号系统
|
||||
- 支持自定义前缀,用于按章节标注
|
||||
- 支持不连续范围并可连续编号
|
||||
- 可选择保留或移除现有标签
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为书籍的前言设置罗马数字标签(i, ii, iii),正文使用十进制标签
|
||||
- 使用 "A-1"、"A-2"、"B-1"、"B-2" 等字母前缀标注附录页
|
||||
- 修正扫描文档中实体页码与 PDF 页面顺序不一致的页面标签
|
||||
- 为技术文档添加从零开始的编号
|
||||
|
||||
## 提示
|
||||
|
||||
- 页面标签是元数据,PDF 查看器会在导航工具栏中显示,它们不会打印在实际页面上。如需可见的页码,请使用[页码](./page-numbers)。
|
||||
- 此工具需要在 WASM 设置中配置 CoherentPDF (CPDF)。如果尚未设置,系统会提示您进行配置。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [页码](./page-numbers)
|
||||
- [Bates 编号](./bates-numbering)
|
||||
- [编辑书签](./bookmark)
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: 添加印章
|
||||
description: 使用集成的注释工具栏为 PDF 页面添加图片印章,并附带用户名署名。
|
||||
---
|
||||
|
||||
# 添加印章
|
||||
|
||||
使用带有印章注释工具栏的内嵌查看器,在 PDF 页面上放置图片印章。印章可以包含您的姓名以便署名,适用于审批流程、审阅流程和文档标记。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 在**印章用户名**字段中输入您的姓名。此名称会显示在您创建的印章上。
|
||||
2. 点击或将 PDF 文件拖入拖放区进行上传。
|
||||
3. 印章编辑器打开,文档加载到查看器中。
|
||||
4. 使用工具栏中的图片印章工具,在任意页面选择并放置印章。
|
||||
5. 根据需要调整印章的位置和大小。
|
||||
6. 点击**保存已盖章的 PDF** 下载结果。
|
||||
|
||||
## 功能
|
||||
|
||||
- 集成的 PDF 查看器,带有印章专用注释工具栏
|
||||
- 为创建的印章署名用户名
|
||||
- 可在任意页面放置图片印章
|
||||
- 拖放定位和调整大小
|
||||
- 根据页面宽高比自动调整查看器尺寸
|
||||
- 显示文件名称和大小信息
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在审阅流程中为文档添加 "APPROVED" 或 "REVIEWED" 图片印章
|
||||
- 在正式文件上放置公司公章或公证印章图片
|
||||
- 为页面添加包含审阅者姓名的 "RECEIVED" 印章
|
||||
- 为检验报告添加质量控制印章
|
||||
|
||||
## 提示
|
||||
|
||||
- 请在上传 PDF 之前设置印章用户名。用户名会嵌入印章元数据中。
|
||||
- 查看器会根据 PDF 第一页的宽高比调整高度,以获得最佳查看效果。
|
||||
- 如需基于文本的水印而不是图片印章,请使用[添加水印](./add-watermark)工具。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [签署 PDF](./sign-pdf)
|
||||
- [添加水印](./add-watermark)
|
||||
- [PDF 编辑器](./edit-pdf)
|
||||
@@ -0,0 +1,79 @@
|
||||
---
|
||||
title: 添加水印
|
||||
description: 通过可视化拖放编辑器和实时预览,在 PDF 页面上添加文字或图片水印。
|
||||
---
|
||||
|
||||
# 添加水印
|
||||
|
||||
使用可视化编辑器为 PDF 页面添加文字或图片水印。您可以直接在预览中拖动水印来定位,使用角点手柄调整大小,并配置不透明度、旋转、字体和颜色。每个页面可以有各自的水印位置,也可以一次性对所有页面应用相同的水印。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传您的 PDF 文件。
|
||||
2. 编辑器打开,显示第一页的实时预览和可拖动的水印叠层。
|
||||
3. 使用切换按钮在**文字**或**图片**水印模式之间选择。
|
||||
4. 在侧边栏面板中配置水印设置。
|
||||
5. 在预览中拖动水印到您想要的位置。使用角点手柄调整大小。
|
||||
6. 在页面之间切换以设置每页的水印,或保持勾选**应用到所有页面**。
|
||||
7. 点击**添加水印**进行处理并下载。
|
||||
|
||||
## 选项
|
||||
|
||||
**文字水印设置:**
|
||||
|
||||
- **文字**:水印文字(例如“机密”、“草稿”)。
|
||||
- **字号**:10 到 200 点。默认为 72。
|
||||
- **颜色**:通过取色器选择任意颜色。
|
||||
- **不透明度**:控制透明度,从完全透明到完全不透明。
|
||||
- **旋转**:将水印文字旋转 -180 到 180 度。
|
||||
|
||||
**图片水印设置:**
|
||||
|
||||
- **图片上传**:上传 PNG、JPG 或其他图片文件用作水印。
|
||||
- **不透明度**:控制图片透明度。
|
||||
- **缩放**:调整图片水印的大小。
|
||||
|
||||
**布局设置:**
|
||||
|
||||
- **单个**:每页一个水印,通过拖动或位置预设来定位。
|
||||
- **平铺**:沿着旋转角度以对角网格在整页重复水印,使水印从边缘到边缘覆盖整个文档。
|
||||
- **水平间距**:沿文字方向的平铺间距,以水印宽度的百分比表示(仅平铺模式)。
|
||||
- **垂直间距**:平铺行之间的间距,以水印高度的百分比表示(仅平铺模式)。
|
||||
|
||||
**通用设置:**
|
||||
|
||||
- **应用到所有页面**:勾选后,同一水印应用于每一页。取消勾选可为每页单独设置水印。
|
||||
- **页面范围**:指定哪些页面添加水印(例如 "1-3, 5, 7-9" 或 "all")。
|
||||
|
||||
## 功能
|
||||
|
||||
- 在实时 PDF 预览上进行可视化拖放定位
|
||||
- 水印可通过角点手柄调整大小
|
||||
- 文字和图片水印模式
|
||||
- 单个或整页平铺(重复)布局,间距可调
|
||||
- 按页或全局应用水印
|
||||
- 在预览中逐页浏览
|
||||
- 不透明度和旋转控制
|
||||
- 页面范围筛选
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在分发审阅前为草稿文档标记“草稿”
|
||||
- 为敏感财务报告添加“机密”水印
|
||||
- 使用公司标志图片水印为文档添加品牌标识
|
||||
- 在向潜在客户分享的产品文档上加盖 "SAMPLE"
|
||||
- 为分发的 PDF 资料添加版权声明
|
||||
|
||||
## 提示
|
||||
|
||||
- 若要在页面上添加对角水印,请将旋转设为约 45 度并增大字号。
|
||||
- 平铺模式让文档裁剪后更难被重复使用,因为去掉一个水印仍会留下几十个。平铺时请降低不透明度,以保持底层文字清晰可读。
|
||||
- 带透明背景的图片水印(PNG 格式)与文档内容的融合更自然。
|
||||
- 如果需要在不同页面使用不同的水印文字,请取消勾选"应用到所有页面",然后逐页操作。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [页眉和页脚](./header-footer)
|
||||
- [添加印章](./add-stamps)
|
||||
- [Bates 编号](./bates-numbering)
|
||||
- [签署 PDF](./sign-pdf)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: 调整颜色
|
||||
description: 精细调整 PDF 的亮度、对比度、饱和度、色相、色温、色调、伽马和棕褐色。
|
||||
---
|
||||
|
||||
# 调整颜色
|
||||
|
||||
面向 PDF 的完整调色工具集。可调整八个独立参数:亮度、对比度、饱和度、色相偏移、色温、色调、伽马和棕褐色,拖动每个滑块时实时预览都会更新。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传您的 PDF 文件。
|
||||
2. 编辑器打开,显示第一页的预览和颜色设置面板。
|
||||
3. 移动滑块调整各项颜色参数。预览会实时更新。
|
||||
4. 点击**重置**将所有滑块恢复到默认位置。
|
||||
5. 点击**应用**处理所有页面并下载调整后的 PDF。
|
||||
|
||||
## 选项
|
||||
|
||||
- **亮度**:使整个页面变亮或变暗(-100 到 +100)。
|
||||
- **对比度**:增大或减小明暗区域之间的差异(-100 到 +100)。
|
||||
- **饱和度**:增强或降低颜色强度(-100 到 +100)。设为 -100 会得到灰度效果。
|
||||
- **色相偏移**:旋转色轮,统一改变所有颜色。
|
||||
- **色温**:使颜色偏暖(黄/橙)或偏冷(蓝)。
|
||||
- **色调**:添加绿色或洋红色偏色。
|
||||
- **伽马**:使用伽马曲线调整中间调亮度。小于 1.0 的值会使中间调变暗,大于 1.0 的值会使其变亮。
|
||||
- **棕褐色**:应用经典的棕褐色调效果。数值越高,棕色色调越强。
|
||||
|
||||
## 功能
|
||||
|
||||
- 八个可独立调整的颜色参数
|
||||
- 实时预览,对滑块变化立即响应
|
||||
- 重置按钮可快速恢复默认值
|
||||
- 处理文档中的所有页面
|
||||
- 适用于任何 PDF 内容(文字、图片、图形)
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 提亮较暗的扫描件或校正曝光过度的页面
|
||||
- 在打印前降低彩色文档的饱和度以节省墨水
|
||||
- 应用棕褐色调,为证书或奖状营造复古外观
|
||||
- 校正 PDF 中嵌入照片的色温
|
||||
- 增强褪色或低质量扫描文档的对比度
|
||||
|
||||
## 提示
|
||||
|
||||
- 若要快速转换为灰度,请将饱和度滑块一直拖到 -100。
|
||||
- 对于中间调过暗或过亮的扫描文档,伽马滑块对提升可读性特别有用。
|
||||
- 与其他图像效果工具一样,此工具会将每一页栅格化。输出将基于图像,因此文字无法选中。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [反转颜色](./invert-colors)
|
||||
- [扫描效果](./scanner-effect)
|
||||
- [背景颜色](./background-color)
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 交替混合页面
|
||||
description: 通过按交替顺序穿插各文件的页面来合并 PDF,并保留书签。
|
||||
---
|
||||
|
||||
# 交替混合页面
|
||||
|
||||
将多个 PDF 文件的页面交错排列,使页面在各文档之间交替出现。标准合并只会把文件首尾相接,而当您需要文件 A 的第 1 页、文件 B 的第 1 页、文件 A 的第 2 页,依此类推时,就该使用此工具。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 使用拖放区上传至少两个 PDF 文件。
|
||||
2. 工具会显示每个文件的页数和文件大小。
|
||||
3. 拖动抓取手柄,调整交错顺序中哪个文件的页面排在前面。
|
||||
4. 点击**混合页面**生成交错后的输出。
|
||||
5. 结果会以 `alternated-mixed.pdf` 下载。
|
||||
|
||||
## 功能
|
||||
|
||||
- 可对任意数量的 PDF 交错页面(至少两个)
|
||||
- 拖放重新排序文件,以控制交错优先级
|
||||
- 保留源文档中的书签
|
||||
- 显示每个已上传文件的页数和文件大小
|
||||
- 通过专用的 Web Worker 处理,界面保持流畅
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 重新组合奇数页和偶数页分别扫描的双面扫描件
|
||||
- 将试题与答案合并,使每道题后面紧跟答案
|
||||
- 逐页合并双语文档(例如一面英文,下一面译文)
|
||||
- 交错合并单面扫描仪扫出的正面和背面
|
||||
|
||||
## 提示
|
||||
|
||||
- 如果源 PDF 的页数不同,较短文档的页面会先用完,较长文档剩余的页面会出现在末尾。
|
||||
- 文件顺序很重要:列表中的第一个文件提供输出的第一页。如有需要,请拖动重新排列。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [整理与复制](./organize-pdf)
|
||||
- [分割 PDF](./split-pdf)
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: 背景颜色
|
||||
description: 更改 PDF 每一页的背景颜色,同时保留其上的所有内容。
|
||||
---
|
||||
|
||||
# 背景颜色
|
||||
|
||||
在 PDF 所有现有内容后面设置纯色背景。工具会在每页创建一个彩色矩形,并将原始内容叠放在其上,因此文字、图片和图形在新背景上仍然完全可见。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传您的 PDF 文件。
|
||||
2. 使用颜色选择器选取背景颜色。默认为浅黄色 (#FFFFCC)。
|
||||
3. 点击**更改背景颜色**进行处理。
|
||||
4. 更新后的 PDF 会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
- **背景颜色**:标准取色器,可选择任意纯色。默认为浅黄色。
|
||||
|
||||
## 功能
|
||||
|
||||
- 为每一页应用统一的背景颜色
|
||||
- 将所有原始内容(文字、图片、矢量图形)完整保留在彩色图层之上
|
||||
- 保持原始页面尺寸
|
||||
- 适用于任意页数的文档
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 添加浅奶油色或象牙色背景,使文档呈现更柔和的纸质外观
|
||||
- 为不同类别应用不同的背景颜色,对文档集进行颜色编码
|
||||
- 为不同受众创建同一文档的视觉区分版本
|
||||
- 添加浅色背景色调,提升文档在屏幕上投影时的可读性
|
||||
|
||||
## 提示
|
||||
|
||||
- 浅色、柔和的颜色效果最佳。除非文字本身是浅色,否则很深的背景会使文字难以阅读。
|
||||
- 如果想同时更改背景和文字颜色,请先应用背景颜色,然后对结果使用[更改文字颜色](./text-color)。
|
||||
- 此工具在 PDF 结构层面工作(不进行栅格化),因此输出中的文字仍可选中和搜索。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [更改文字颜色](./text-color)
|
||||
- [反转颜色](./invert-colors)
|
||||
- [调整颜色](./adjust-colors)
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
title: Bates 编号
|
||||
description: 为一个或多个 PDF 添加 Bates 编号,支持自定义模板、补零位数、字体和位置。
|
||||
---
|
||||
|
||||
# Bates 编号
|
||||
|
||||
Bates 编号会在 PDF 的每一页上加盖顺序标识符。它是法律程序、审计和合规工作流中标注文档的标准方法。此工具支持多个文件和自定义模板,可输出分别编号的 PDF 或单个 ZIP 压缩包。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传一个或多个 PDF 文件。可以一次拖入多个文件。
|
||||
2. 选择样式预设或创建自定义模板。
|
||||
3. 配置位置、字体、大小、颜色和起始编号。
|
||||
4. 点击**应用 Bates 编号**进行处理。
|
||||
5. 单个文件直接下载。多个文件会作为 ZIP 压缩包下载。
|
||||
|
||||
## 选项
|
||||
|
||||
- **样式预设**:从内置格式中选择:
|
||||
- 证据 + 案件 + Bates + 页码(例如“Exhibit 1 Case XYZ 000001 Page 1”)
|
||||
- 证据 + 案件 + Bates(无页码)
|
||||
- 案件 + Bates
|
||||
- 仅 Bates 编号(例如 "000001")
|
||||
- 自定义(编写您自己的模板)
|
||||
- **自定义样式**:使用占位符的模板字符串:`[BATES]`、`[PAGE]`、`[FILE]`、`[FILENAME]`。
|
||||
- **Bates 补零位数**:补零的 Bates 编号的位数(3 到 6)。仅在自定义模式下可见。
|
||||
- **位置**:页眉或页脚,左、中或右。
|
||||
- **Bates 起始编号**:第一个 Bates 编号。默认为 1。编号会在各文件之间延续。
|
||||
- **文件计数器起始值**:`[FILE]` 占位符的起始数字。
|
||||
- **字体**:Helvetica、Times New Roman 或 Courier。
|
||||
- **字号**:加盖文字的大小。
|
||||
- **颜色**:Bates 编号文字的取色器。
|
||||
|
||||
## 功能
|
||||
|
||||
- 实时预览,显示 Bates 编号在所有已上传文件中的显示效果
|
||||
- 支持多个文件,编号在各文档之间连续
|
||||
- 拖放重新排序文件,以控制编号顺序
|
||||
- 六种位置选项(页眉/页脚,左/中/右)
|
||||
- 自适应页边距计算,适应不同的页面尺寸
|
||||
- 多文件批量处理时输出 ZIP
|
||||
- 模板占位符提供最大灵活性
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为诉讼的证据开示文档加盖顺序证据编号
|
||||
- 为跨越数十个文件的审计证据包编号
|
||||
- 为合规文档应用监管参考编号
|
||||
- 使用案件专属标识符标注专利申请的附件
|
||||
|
||||
## 提示
|
||||
|
||||
- 处理前,在文件列表中拖动文件可重新排序。Bates 编号顺序遵循此排列。
|
||||
- 使用 `[FILENAME]` 占位符可在印章中包含原始文件名,有助于将页面追溯到源文档。
|
||||
- 更改设置时,预览框会实时更新,因此您可以在处理前核对格式。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [页码](./page-numbers)
|
||||
- [添加页面标签](./add-page-labels)
|
||||
- [页眉和页脚](./header-footer)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: BMP 转 PDF
|
||||
description: 直接在浏览器中将 BMP 位图图像转换为 PDF 格式,无需上传到任何服务器。
|
||||
---
|
||||
|
||||
# BMP 转 PDF
|
||||
|
||||
将 Windows 位图 (BMP) 文件转换为 PDF。BMP 是一种未压缩的图像格式,至今仍见于旧系统、医学影像和工业扫描仪中。此工具无需安装任何软件即可将它们转换为 PDF。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :--- | :----- |
|
||||
| BMP | `.bmp` |
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 点击上传区域或拖放您的 BMP 文件。
|
||||
2. 查看文件列表。可以添加更多文件或移除不需要的文件。
|
||||
3. 点击**转换为 PDF**。输出会以 `from_bmps.pdf` 下载。
|
||||
|
||||
每个 BMP 会被绘制到画布上,导出为 PNG,然后使用 pdf-lib 嵌入 PDF。页面尺寸与原始图像尺寸一致。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具不提供额外的质量设置。图像以原始分辨率作为无损 PNG 嵌入 PDF。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将以 BMP 存储的旧扫描文档转换为存档 PDF
|
||||
- 将旧版 Windows 应用程序的 BMP 截图转为便于分享的文档
|
||||
- 处理默认输出 BMP 的医学或工业扫描仪结果
|
||||
- 将旧的图像档案迁移到更便于移植的格式
|
||||
|
||||
## 提示
|
||||
|
||||
- BMP 文件未经压缩,因此通常很大。由于图像在内部重新编码为 PNG,生成的 PDF 会小得多。
|
||||
- 如果您的 BMP 文件与其他图像格式混在一起,请使用[图片转 PDF](./image-to-pdf)工具一次性批量转换。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
- [PNG 转 PDF](./png-to-pdf)
|
||||
- [TIFF 转 PDF](./tiff-to-pdf)
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: 编辑书签
|
||||
description: 通过可视化编辑器添加、编辑、导入、导出和删除 PDF 书签,支持 CSV/JSON。
|
||||
---
|
||||
|
||||
# 编辑书签
|
||||
|
||||
书签编辑器让您完全掌控 PDF 的导航书签(也称为大纲)。您可以添加新书签、编辑现有书签、调整层级结构,并以 CSV 和 JSON 格式导入或导出书签数据。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击或将文件拖入上传区域,上传您的 PDF。
|
||||
2. 可选:勾选 **自动提取现有书签**,载入文档当前的书签树。
|
||||
3. 编辑器会以分屏视图打开:左侧是 PDF 查看器,右侧是书签面板。
|
||||
4. 输入书签标题并点击 **添加到页面**,即可创建指向当前页面的新书签。
|
||||
5. 使用工具栏按钮重新排列、设置样式或删除书签。
|
||||
6. 点击 **保存带书签的 PDF** 下载更新后的文件。
|
||||
|
||||
## 功能
|
||||
|
||||
- 可视化 PDF 查看器,支持页面导航、缩放控制和跳转到指定页码
|
||||
- 一键为任意页面添加书签
|
||||
- 直接在 PDF 上点击以设置精确的书签目标位置(拾取模式)
|
||||
- 支持嵌套书签层级,可拖放排序
|
||||
- 批量操作:选择多个书签,一次性更改颜色、样式或删除
|
||||
- 书签搜索,可在大型书签树中快速找到条目
|
||||
- 所有更改均支持撤销和重做
|
||||
- 从 CSV(标题、页码、层级)或 JSON 文件导入书签
|
||||
- 将书签导出为 CSV 或 JSON,便于在外部编辑
|
||||
- 书签样式:颜色(红、蓝、绿、黄、紫)和字体样式(粗体、斜体、粗斜体)
|
||||
- 快速导航:使用 Page Up/Page Down 键滚动页面
|
||||
|
||||
## 选项
|
||||
|
||||
- **自动提取现有书签**:勾选后,工具会在加载时读取并显示 PDF 当前的书签。
|
||||
- **批量模式**:切换后可选择多个书签,并批量应用颜色、样式或删除操作。
|
||||
- **全部展开/折叠**:快速显示或隐藏嵌套的子书签。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为缺少书签的教材或手册添加目录
|
||||
- 在 OCR 处理后重新整理扫描文档的书签结构
|
||||
- 将书签导出为 CSV,在电子表格中编辑后再重新导入
|
||||
- 清理页码引用错误的自动生成书签
|
||||
- 在法律文书中添加彩色书签来标记重要章节
|
||||
|
||||
## 小提示
|
||||
|
||||
- 批量创建书签时请使用 CSV 导入。格式很简单:`title,page,level`,其中 level 1 表示顶层。
|
||||
- 拾取模式可以让您点击 PDF 页面上的确切位置来设置书签目标,比只指定页码更精确。
|
||||
- 在进行大幅修改之前先导出书签,作为备份。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [目录](./table-of-contents)
|
||||
- [PDF 编辑器](./edit-pdf)
|
||||
- [添加页面标签](./add-page-labels)
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: CBZ 转 PDF
|
||||
description: 在浏览器中将 CBZ 和 CBR 漫画压缩包转换为 PDF。免费、私密,无需上传。
|
||||
---
|
||||
|
||||
# CBZ 转 PDF
|
||||
|
||||
将漫画压缩包文件转换为 PDF。CBZ 和 CBR 是数字漫画的标准格式,本质上就是装满图片的 ZIP 或 RAR 压缩包。此工具会提取每一页,保留阅读顺序,并生成干净的 PDF,每张图片都会变成一个全尺寸页面。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 说明 |
|
||||
| :--- | :----- | :----------------------------------------------- |
|
||||
| CBZ | `.cbz` | 基于 ZIP 的漫画压缩包(使用 pdf-lib 在本地处理) |
|
||||
| CBR | `.cbr` | 基于 RAR 的漫画压缩包(通过 PyMuPDF 引擎处理) |
|
||||
|
||||
CBZ 转换器可识别压缩包内的 JPEG、PNG、GIF、BMP、WebP、AVIF、TIFF、HEIC 和 JXL 图片。非标准格式会在嵌入前自动转换为 PNG。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域,或拖放您的 CBZ 或 CBR 文件。可以在同一批次中混用两种格式。
|
||||
2. 查看文件列表。移除不需要的文件,或点击 **添加更多文件** 继续添加。
|
||||
3. 点击 **转换为 PDF**。对于 CBZ 文件,工具会解压压缩包,按自然顺序按名称排序图片文件,检测每张图片的实际格式,并使用 pdf-lib 将它们嵌入 PDF。CBR 文件则改由 PyMuPDF 引擎处理。
|
||||
4. 单个文件会直接下载为 PDF。多个文件会生成名为 `comic-converted.zip` 的 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
无需任何配置。每张图片都会成为与其原始尺寸一致的页面,因此跨页大图保持宽幅,单页保持窄幅。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在支持 PDF 但不支持 CBZ/CBR 的平板或手机应用中阅读漫画
|
||||
- 打印数字漫画中的特定页面
|
||||
- 将漫画收藏归档为任何文件查看器都能打开的格式
|
||||
- 与没有专用漫画阅读器的人分享漫画
|
||||
|
||||
## 小提示
|
||||
|
||||
- 压缩包内的图片按自然顺序排序(因此 `page2.jpg` 会排在 `page10.jpg` 之前)。请使用编号一致的文件名,以确保页面顺序正确。
|
||||
- 转换器通过二进制签名而不是文件扩展名来检测图片格式。即使 PNG 被误命名为 `.jpg`,也能正确嵌入。
|
||||
- CBZ 文件完全在浏览器中处理,无需加载 PyMuPDF 引擎,因此转换速度比 CBR 文件更快。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [EPUB 转 PDF](./epub-to-pdf)
|
||||
- [MOBI 转 PDF](./mobi-to-pdf)
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
@@ -0,0 +1,61 @@
|
||||
---
|
||||
title: 更改权限
|
||||
description: 设置或修改 PDF 的打印、复制、编辑和批注使用权限。使用 256 位 AES 加密。
|
||||
---
|
||||
|
||||
# 更改权限
|
||||
|
||||
精细控制接收者可以对您的 PDF 执行哪些操作。与仅用密码锁定文件的基本加密不同,此工具允许您有选择地允许或禁止打印、复制、编辑、批注、填写表单、文档组装和页面提取,所有这些都通过 256 位 AES 加密强制执行。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 如果 PDF 已加密,请输入 **当前密码**。
|
||||
3. 设置 **新用户密码**(打开文件所需)和/或 **新所有者密码**(控制权限)。
|
||||
4. 使用复选框逐项开启或关闭权限。
|
||||
5. 点击 **更改权限**。
|
||||
6. 下载更新后的 PDF。
|
||||
|
||||
如果两个新密码字段都留空,工具会完全解密 PDF,移除所有加密和限制。
|
||||
|
||||
## 权限控制
|
||||
|
||||
| 权限 | 控制内容 |
|
||||
| ---------------- | ------------------------------ |
|
||||
| **允许打印** | 文档是否可以打印 |
|
||||
| **允许复制** | 文本和图片是否可以被选择和复制 |
|
||||
| **允许修改** | 文档内容是否可以编辑 |
|
||||
| **允许批注** | 是否可以添加评论、高亮和印章 |
|
||||
| **允许填写表单** | 交互式表单字段是否可以填写 |
|
||||
| **允许文档组装** | 页面是否可以插入、删除或旋转 |
|
||||
| **允许提取页面** | 单个页面是否可以被提取 |
|
||||
|
||||
所有权限都需要设置所有者密码才能生效。没有所有者密码时,大多数 PDF 阅读器会忽略权限标志。
|
||||
|
||||
## PDF 中的权限机制
|
||||
|
||||
PDF 权限是加密规范的一部分。它们以位标志的形式存储在加密字典中,并由合规的 PDF 阅读器强制执行。关键区别如下:
|
||||
|
||||
- **用户密码**:打开文件所必需。
|
||||
- **所有者密码**:更改权限或移除限制所必需。没有它时,权限标志决定用户可以执行哪些操作。
|
||||
|
||||
如果只设置所有者密码(不设置用户密码),任何人都可以打开文件,但只能执行被允许的操作。如果两者都设置,则打开文件需要密码,且验证之后仍受限制。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 分发可查看和打印但不能编辑或复制的报告
|
||||
- 分享接收者可以填写但不能修改的合同模板
|
||||
- 发布禁止复制图片的 PDF 目录
|
||||
- 允许在审阅草稿上添加批注,同时防止结构性更改
|
||||
|
||||
## 小提示
|
||||
|
||||
- 为了确保有效,请始终设置所有者密码。没有所有者密码的权限无法强制执行。
|
||||
- 某些第三方 PDF 工具会忽略权限标志。如需更强的保护,可以考虑将 PDF 栅格化或使用 DRM。
|
||||
- 使用此工具可将旧的 RC4 加密 PDF 升级为 AES-256。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [加密 PDF](./protect-pdf):简单的密码保护,没有细粒度权限
|
||||
- [解密 PDF](./unlock-pdf):完全移除加密
|
||||
- [移除限制](./remove-restrictions):在拥有所有者密码时,去除所有限制
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: 合并为单页
|
||||
description: 将 PDF 的所有页面拼接成一个连续的垂直或水平长页面。
|
||||
---
|
||||
|
||||
# 合并为单页
|
||||
|
||||
将 PDF 的每一页合并成一个长页面。页面会垂直拼接(像卷轴一样)或水平拼接(并排放置),输出为一个连续的单页。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 选择排列方向:**垂直**(页面从上到下堆叠)或 **水平**(页面并排放置)。
|
||||
3. 以点为单位设置页面之间的间距。
|
||||
4. 为页面之间的间隙选择背景颜色。
|
||||
5. 可选:启用分隔线(页面之间的细线),并配置其粗细和颜色。
|
||||
6. 点击处理按钮。输出为单页 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 垂直或水平拼接页面
|
||||
- 可配置页面间距
|
||||
- 为间隙区域提供背景颜色选择器
|
||||
- 可选分隔线,粗细和颜色可调
|
||||
- 将每个原始页面以完整分辨率渲染到合并后的画布上
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 说明 |
|
||||
| -------------- | -------------------------- |
|
||||
| **方向** | 垂直(堆叠)或水平(并排) |
|
||||
| **页面间距** | 页面之间的间隙,单位为点 |
|
||||
| **背景颜色** | 页面之间区域的颜色 |
|
||||
| **添加分隔线** | 切换页面之间的细线 |
|
||||
| **分隔线粗细** | 线条粗细,单位为点 |
|
||||
| **分隔线颜色** | 分隔线的颜色 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将多页线框图或设计稿制作成一张长图
|
||||
- 生成可连续滚动的文档视图,用于网页嵌入
|
||||
- 将多页漫画或分镜拼接成一条长带
|
||||
- 生成连续页面的全景视图,便于审阅
|
||||
|
||||
## 小提示
|
||||
|
||||
- 垂直方向最适合纵向页面的文档。横向内容则更适合水平方向。
|
||||
- 页数很多的大型文档会生成非常高或非常宽的输出。某些 PDF 查看器可能无法处理特别大的单页。
|
||||
- 使用对比色的分隔线,可以轻松看出一个原始页面在哪里结束、下一页从哪里开始。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [N-Up PDF](./n-up-pdf)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [分割页面](./divide-pages)
|
||||
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: 比较 PDF
|
||||
description: 以并排或叠加模式比较两个 PDF 文档,提供详细的变更检测和分类。
|
||||
---
|
||||
|
||||
# 比较 PDF
|
||||
|
||||
上传两个 PDF,准确查看它们之间发生了哪些变化。工具会智能配对页面,检测文本、图片、批注、页眉和格式的差异,并以并排或叠加视图呈现。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传两个 PDF 文件:原始版本(左)和修订版本(右)。
|
||||
2. 工具使用内容签名在两个文档之间配对页面。
|
||||
3. 选择视图模式:**并排** 或 **叠加**。
|
||||
4. 使用分页控件在页面对之间切换。
|
||||
5. 差异会被高亮并分类。使用筛选面板专注于特定的变更类型。
|
||||
6. 可选:将比较结果导出为 PDF 报告。
|
||||
|
||||
## 功能
|
||||
|
||||
- 基于内容相似度自动配对页面
|
||||
- 并排和叠加两种比较视图
|
||||
- 变更分类:文本、图片、页眉/页脚、批注、格式、背景
|
||||
- 按类别切换筛选,显示或隐藏特定类型的变更
|
||||
- 支持带查询过滤的文本变更搜索
|
||||
- 支持 OCR,可比较扫描文档
|
||||
- 缩放控制,便于详细检查
|
||||
- 并排模式下两个面板同步滚动
|
||||
- 将比较结果导出为 PDF
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 说明 |
|
||||
| ------------ | ------------------------------------------------------- |
|
||||
| **视图模式** | 并排或叠加 |
|
||||
| **OCR** | 启用/禁用 OCR 以比较扫描文档 |
|
||||
| **OCR 语言** | OCR 文本提取所用的语言 |
|
||||
| **类别筛选** | 切换文本、图片、页眉/页脚、批注、格式和背景变更的可见性 |
|
||||
| **变更范围** | 在叠加模式下,在全部变更或仅内容变更之间筛选 |
|
||||
| **缩放** | 调整放大级别以便详细检查 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 审阅合同修订,准确找出不同版本之间的变化
|
||||
- 比较设计稿,验证 PDF 导出结果是否符合预期
|
||||
- 在受监管行业中审计文档变更,确保每次编辑都可追溯
|
||||
- 验证 PDF 转换流程是否准确保留了原始内容
|
||||
- 对照原文检查翻译文档的版面变化
|
||||
|
||||
## 小提示
|
||||
|
||||
- 叠加视图会将两个文档相互重叠,使空间上的差异(元素位移、图片尺寸变化)一目了然。
|
||||
- 比较没有文本层的扫描文档时请启用 OCR。比较引擎会从页面图像中提取文本。
|
||||
- 使用类别筛选专注于重要内容。例如,只关心文本内容差异时,可以隐藏格式变更。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [查看元数据](./view-metadata)
|
||||
- [OCR PDF](./ocr-pdf)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: 压缩 PDF
|
||||
description: 使用 Hyper Compress 引擎将 PDF 文件体积减小多达 90%。支持目标文件大小、批量处理和自定义质量设置。
|
||||
---
|
||||
|
||||
# 压缩 PDF
|
||||
|
||||
在不破坏文件的前提下缩小 PDF。压缩 PDF 由 [Hyper Compress](https://www.bentopdf.com/hyper-compress) 驱动,这是 BentoPDF 自研的压缩引擎。它会重新压缩图片,对字体进行子集化和合并,并清除嵌入缩略图和私有应用数据等冗余内容。PDF 仍然功能完整:文本依然可选,链接和表单字段继续可用。
|
||||
|
||||
Hyper Compress 已编译为 WebAssembly 并随 BentoPDF 一同发布,因此压缩可离线运行,在隔离网络的部署中也无需额外设置。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖入,上传一个或多个 PDF。
|
||||
2. 选择 **压缩级别**:低、中、高或无损。
|
||||
3. 可选:输入 **目标文件大小**,或展开 **自定义设置** 进行精细控制,包括 **转换为灰度**。
|
||||
4. 点击 **压缩 PDF**。处理多个文件时,您会得到一个 ZIP 下载。
|
||||
|
||||
## 特殊文档
|
||||
|
||||
- **带数字签名的 PDF** 会原样返回,因为任何更改都会使签名失效。在自定义设置中开启 **覆盖内容保护**,即可移除签名并进行压缩;可见的签名仍会留在页面上,但文件不再处于签名状态。
|
||||
- **PDF/A 文件** 在压缩后会失去 PDF/A 标记,这样文件就不会声称自己符合已不再满足的一致性要求。在自定义设置中开启 **保留 PDF/A**,可让文件保持合规。
|
||||
- **受密码保护的 PDF** 的文件卡片上会显示密码字段。在此输入密码,Hyper Compress 会自行打开文件,无需单独的解锁步骤。如果有两个或更多锁定的文件,一个共用的字段即可解锁所有使用相同密码的文件。压缩后的副本没有密码;可使用 [加密 PDF](./protect-pdf) 重新添加。
|
||||
- **没有文本层的扫描件** 可以通过自定义设置中的 **栅格化页面** 进一步缩小,它会将每一页替换为一张优化后的图片。对于任何含有可选文本的文档(包括经过 OCR 的扫描件),此项会被跳过,除非开启了 **覆盖内容保护**。开启后,文本页面也会变成图片,因此文本将无法选择,链接也会失效。
|
||||
|
||||
## 压缩级别
|
||||
|
||||
| 级别 | 图片质量 | 最大分辨率 | 适用场景 |
|
||||
| -------- | -------- | ---------- | ------------------ |
|
||||
| **低** | 80 | 200 DPI | 保持视觉质量 |
|
||||
| **中** | 50 | 150 DPI | 日常文档 |
|
||||
| **高** | 20 | 72 DPI | 邮件附件、网页上传 |
|
||||
| **无损** | 图片不变 | 不变 | 归档副本 |
|
||||
|
||||
高级别还会取消嵌入 14 种标准 PDF 字体,以及在安全时取消嵌入 Arial 等相似字体。
|
||||
|
||||
## 目标文件大小
|
||||
|
||||
以 KB 或 MB 输入大小,Hyper Compress 会从您选择的级别开始,搜索仍能满足该大小的最佳图片质量。如果文档无法缩小到该大小,您会得到它能生成的最小版本,并看到相应提示。诸如 [压缩 PDF 至 1MB](https://www.bentopdf.com/compress-pdf-to-1mb) 之类的专用页面打开时,目标大小已预先填好。
|
||||
|
||||
## 自定义设置
|
||||
|
||||
展开自定义设置面板,可直接调整 Hyper Compress。选择压缩级别会将这些设置重置为该级别的值,而修改其中任何一项都会将级别切换为自定义。
|
||||
|
||||
- **覆盖内容保护**:默认情况下,Hyper Compress 不会改动已签名的 PDF,也不会栅格化含有文本的页面。开启后将绕过这两项限制。更改级别时它会保持开启。
|
||||
|
||||
- **图片**:图片质量、最大分辨率、强制重采样、颜色缩减、裁剪不可见的图片区域、移除备用图片、简化颜色配置文件、JPEG 2000 和无损模式
|
||||
- **字体**:子集化、合并重复字体,以及取消嵌入标准字体及其相似字体
|
||||
- **内容**:拼合批注、表单字段或链接
|
||||
- **清理**:移除缩略图、应用数据、文章线程、网页抓取信息、结构树或输出意图
|
||||
- **栅格化**:将页面替换为图片,适用于纯图像扫描件;文档含有可选文本时会跳过
|
||||
- **输出**:保留 PDF/A,以及面向支持 Brotli 的 PDF 2.0 阅读器的 Brotli 压缩
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 50 MB 的报告压缩到邮件附件限制以内
|
||||
- 通过目标文件大小,让扫描件满足门户网站严格的上传限制
|
||||
- 优化营销 PDF,加快网站下载速度
|
||||
- 归档大量文档,节省存储成本
|
||||
- 通过即时通讯应用分享 PDF 时减少移动数据用量
|
||||
|
||||
## 小提示
|
||||
|
||||
- 先从中级别开始。如果结果仍然太大,可设置目标文件大小或升级到高级别。
|
||||
- 对于没有文本层的扫描件,请在自定义设置中开启栅格化页面。
|
||||
- 自定义设置中的转换为灰度,可以显著减小以彩色内容为主的文档体积。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [线性化 PDF](./linearize-pdf):优化压缩后的 PDF,便于快速网页浏览
|
||||
- [栅格化 PDF](./rasterize-pdf):以指定 DPI 将页面(包括含文本的页面)转换为图片
|
||||
- [修复 PDF](./repair-pdf):修复在其他地方压缩时损坏的 PDF
|
||||
- [移除元数据](./remove-metadata):清除隐藏数据以保护隐私
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: 裁剪 PDF
|
||||
description: 使用基于 Cropper.js 的编辑器,在每个页面上绘制裁剪区域,直观地裁剪 PDF 页面。
|
||||
---
|
||||
|
||||
# 裁剪 PDF
|
||||
|
||||
通过可视化裁剪界面修剪 PDF 页面的边距。直接在每个页面上绘制裁剪矩形,预览结果并应用裁剪。您可以为不同页面设置不同的裁剪区域,也可以对整个文档应用相同的裁剪。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传您的 PDF 文件。
|
||||
2. 裁剪编辑器打开,显示第一页和可拖动的裁剪叠加层。
|
||||
3. 拖动边缘或角点来调整裁剪矩形。
|
||||
4. 使用页面导航按钮在页面之间切换,并为每页设置裁剪区域。
|
||||
5. 点击 **裁剪** 应用裁剪并下载结果。
|
||||
|
||||
## 功能
|
||||
|
||||
- 基于 Cropper.js 的可视化裁剪编辑器,带有用于精确调整的手柄
|
||||
- 逐页导航,可设置各自的裁剪区域
|
||||
- 按页面保存裁剪设置,因此可以为不同页面定义不同的裁剪
|
||||
- 实时预览所选裁剪区域
|
||||
- 支持任意页面尺寸或方向的 PDF
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 去除扫描文档的宽边距,聚焦内容区域
|
||||
- 从印前 PDF 中修剪打印裁切标记或套准标记
|
||||
- 裁剪讲义幻灯片,去除演讲者备注区域
|
||||
- 在分享文档节选前,去除每页的页眉或页脚
|
||||
- 调整页面大小,以适应特定的显示或打印版式
|
||||
|
||||
## 小提示
|
||||
|
||||
- 裁剪叠加层可以自由调整大小和位置。拖动角点可按比例缩放,拖动边缘可沿单个轴调整。
|
||||
- 如果每页都需要相同的裁剪,请在第一页上设置,工具会在您切换页面时记住裁剪区域。
|
||||
- 如果您需要统一页面尺寸而不是可视化裁剪,修正页面尺寸工具可能更合适。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 编辑器](./edit-pdf)
|
||||
- [页码](./page-numbers)
|
||||
- [移除空白页](./remove-blank-pages)
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: CSV 转 PDF
|
||||
description: 直接在浏览器中将 CSV 电子表格文件转换为格式化的 PDF 表格。
|
||||
---
|
||||
|
||||
# CSV 转 PDF
|
||||
|
||||
将 CSV 文件转换为整洁、格式化的 PDF 文档。每个 CSV 都会被解析并在输出的 PDF 中渲染为表格。当您需要打印或分享表格数据,而接收者没有电子表格软件时,这会很有用。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :--- | :----- |
|
||||
| CSV | `.csv` |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域,或拖放一个或多个 CSV 文件。
|
||||
2. 查看文件列表。可添加更多文件或移除不需要的文件。
|
||||
3. 点击 **转换为 PDF**。进度指示器会显示转换状态。
|
||||
4. 单个文件会直接下载为 PDF。多个文件会打包成 `csv-converted.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有额外配置。CSV 会被自动解析并格式化为表格。
|
||||
|
||||
## 输出
|
||||
|
||||
| 输入数量 | 输出 |
|
||||
| :------- | :------------------------------------------------------ |
|
||||
| 1 个文件 | 下载单个 PDF(例如 `data.pdf`) |
|
||||
| 2 个以上 | ZIP 压缩包(`csv-converted.zip`),每个文件对应一个 PDF |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将导出的数据库报表转换为可打印的 PDF 表格
|
||||
- 与没有 Excel 的人分享财务数据或库存清单
|
||||
- 为合规文档创建 CSV 日志文件的 PDF 版本
|
||||
- 打印地址列表、成绩单,或任何以 CSV 存储的表格数据
|
||||
|
||||
## 小提示
|
||||
|
||||
- 为获得最佳效果,请确保您的 CSV 使用标准的逗号分隔符。工具遵循常见的 CSV 解析约定。
|
||||
- 如果 CSV 列数很多,表格可能会被压缩以适应页面宽度。可考虑将过宽的数据集拆分为多个文件。
|
||||
- 对于 Excel 文件(`.xls`、`.xlsx`),请使用 [Excel 转 PDF](./excel-to-pdf) 工具,它会保留电子表格格式和多个工作表。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [Excel 转 PDF](./excel-to-pdf)
|
||||
- [文本转 PDF](./txt-to-pdf)
|
||||
- [JSON 转 PDF](./json-to-pdf)
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 删除页面
|
||||
description: 按页码、范围或可视化缩略图选择,从 PDF 中移除指定页面。
|
||||
---
|
||||
|
||||
# 删除页面
|
||||
|
||||
从 PDF 文档中移除不需要的页面。您可以输入页码或范围来指定要删除的页面,也可以直接点击页面缩略图将其标记为删除。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。工具会渲染每一页的缩略图预览。
|
||||
2. 在文本框中使用范围语法(例如 `2, 5-8`)输入要删除的页面,或点击缩略图进行切换。
|
||||
3. 被标记的页面会高亮显示,方便您确认选择。
|
||||
4. 点击处理按钮。系统会创建一个已移除所选页面的新 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 基于文本的页面选择,支持范围语法(`2, 5-8, 12`)
|
||||
- 可视化缩略图网格,点击即可选择要删除的页面
|
||||
- 实时预览高亮显示被标记删除的页面
|
||||
- 根据实际页数验证输入
|
||||
- 未删除的页面保持原有顺序
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从扫描文档中移除空白页或填充页
|
||||
- 在分享文档前去除封面页或附录
|
||||
- 清理不小心留在最终 PDF 中的草稿页
|
||||
- 在分发前移除含有敏感信息的页面
|
||||
|
||||
## 小提示
|
||||
|
||||
- 删除页面不会影响其余页面的内容或格式。输出是原始文档去掉被移除页面后的忠实副本。
|
||||
- 如果您想只保留特定页面,而不是移除特定页面,[提取页面](./extract-pages) 更合适。
|
||||
- 缩略图视图采用延迟加载,因此大型文档也能保持流畅响应。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [提取页面](./extract-pages)
|
||||
- [整理与复制](./organize-pdf)
|
||||
- [分割 PDF](./split-pdf)
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: 校正 PDF
|
||||
description: 使用 OpenCV 倾斜检测自动校正扫描 PDF 中的倾斜页面。阈值和 DPI 设置可调。
|
||||
---
|
||||
|
||||
# 校正 PDF
|
||||
|
||||
扫描文档很少是完全端正的。即使轻微的倾斜也会降低 OCR 的准确性,并让打印效果显得草率。此工具使用 OpenCV 的图像处理算法检测每页的倾斜角度,并将其旋转回水平。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个或多个扫描 PDF。
|
||||
2. 设置 **倾斜阈值**:检测到的倾斜低于该值的页面不会被改动。
|
||||
3. 选择 **处理质量 (DPI)**:DPI 越高,检测越准确,但耗时更长。
|
||||
4. 点击 **校正 PDF**。
|
||||
5. 处理完成后,结果面板会显示每页检测到的角度以及是否已校正。
|
||||
|
||||
## 选项
|
||||
|
||||
| 设置 | 取值 | 默认值 |
|
||||
| ------------ | --------------------- | ------ |
|
||||
| **倾斜阈值** | 0.1、0.5、1.0、2.0 度 | 0.5 |
|
||||
| **处理 DPI** | 100、150、200、300 | 150 |
|
||||
|
||||
## 倾斜检测原理
|
||||
|
||||
工具会以所选 DPI 将每页渲染为图像,然后使用 OpenCV 检测内容中的主要线条角度。如果检测到的倾斜超过阈值,页面会按相反角度旋转以摆正。低于阈值的页面保持不变。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 整理批量扫描的合同或法律文件
|
||||
- 为 OCR 处理准备扫描的收据或发票
|
||||
- 校正平板扫描仪上纸张放置不一致的页面
|
||||
- 提升数字化档案资料的视觉质量
|
||||
|
||||
## 小提示
|
||||
|
||||
- 如果需要为 OCR 实现像素级对齐,请将阈值降低到 0.1 度。
|
||||
- 对大多数文档来说,150 DPI 速度快且准确。对于文字非常小或细节丰富的页面,请使用 300 DPI。
|
||||
- 校正功能最适合带有清晰水平文本行的文档。对于以图片为主或带有斜向设计元素的页面,效果可能不佳。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [栅格化 PDF](./rasterize-pdf):将校正后的输出转换为扁平的图像型 PDF
|
||||
- [压缩 PDF](./compress-pdf):校正后减小文件大小
|
||||
- [修复 PDF](./repair-pdf):修复扫描 PDF 中的结构问题
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: 数字签名
|
||||
description: 使用 X.509 证书为 PDF 添加加密数字签名。支持 PKCS#12 和 PEM 格式,并提供可见签名选项。
|
||||
---
|
||||
|
||||
# 数字签名
|
||||
|
||||
数字签名是加密证明:特定的人签署了文档,且文档自签署以来未被更改。与手绘签名(只是一张图片)不同,数字签名使用 X.509 证书和 PKCS#7 标准,提供可验证的真实性和完整性。
|
||||
|
||||
BentoPDF 完全在您的浏览器中应用数字签名。您的私钥不会离开您的设备。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 上传您的证书文件(.pfx、.p12 或 .pem)。
|
||||
3. 输入证书密码以解锁。工具会显示证书主体、颁发者和有效期。
|
||||
4. 可选:配置签名元数据(原因、地点、联系信息)。
|
||||
5. 可选:启用 **可见签名**,并自定义位置、大小、图片和文本。
|
||||
6. 点击 **签署 PDF**。
|
||||
|
||||
## 支持的证书格式
|
||||
|
||||
| 格式 | 扩展名 | 说明 |
|
||||
| ----------- | ---------- | -------------------------------------------------------------------- |
|
||||
| **PKCS#12** | .pfx, .p12 | 包含私钥和证书链的行业标准捆绑包。最常见的格式。 |
|
||||
| **PEM** | .pem | 基于文本的格式。必须在同一文件中同时包含证书和私钥。支持加密的私钥。 |
|
||||
|
||||
## 可见签名选项
|
||||
|
||||
启用后,PDF 页面上会渲染一个可见的签名块:
|
||||
|
||||
- **位置**:X/Y 坐标以及宽度/高度,单位为点
|
||||
- **页面**:第一页、最后一页、所有页面或指定页码
|
||||
- **图片**:上传 PNG、JPG 或 WebP 图片(您的手写签名、公司印章等)
|
||||
- **文本**:自定义文本,颜色和字号可配置。如果未提供图片或文本,工具会根据证书的通用名称和当前日期自动生成文本。
|
||||
|
||||
## 签名元数据
|
||||
|
||||
- **原因**:签署文档的原因(例如“已批准”“已审阅”)
|
||||
- **地点**:签署发生的地点(例如“New York, NY”)
|
||||
- **联系信息**:联系签署人的方式(例如电子邮件地址)
|
||||
|
||||
## 网络连接说明
|
||||
|
||||
签署可能需要网络连接。签名库会从证书的颁发机构信息访问 (AIA) 扩展中嵌入的 URL 获取证书链。如果这些服务器无法访问,需要证书链验证的证书将无法签署。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 使用具有法律效力的数字签名签署合同、提案和协议
|
||||
- 在需要基于 PKI 认证的工作流程中认证官方文件
|
||||
- 为满足监管要求而签署 PDF 发票(许多欧盟国家要求电子发票带有数字签名)
|
||||
- 为工程图纸或质量文件添加组织批准
|
||||
|
||||
## 小提示
|
||||
|
||||
- 自签名证书可用于测试,但在 Adobe Reader 中会显示警告。正式文档请使用受信任证书颁发机构签发的证书。
|
||||
- 可见签名纯粹是视觉效果。无论是否启用可见签名块,加密签名都会被嵌入。
|
||||
- 使用验证签名工具检查已签署的 PDF,确认签名完好无损。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [验证签名](./validate-signature-pdf):验证已签署 PDF 中的数字签名
|
||||
- [拼合 PDF](./flatten-pdf):在签署前拼合表单,防止被修改
|
||||
- [加密 PDF](./protect-pdf):在数字签名之上添加密码保护
|
||||
- [移除元数据](./remove-metadata):在签署前清除元数据
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 分割页面
|
||||
description: 将 PDF 页面水平或垂直分割为更小的子页面。
|
||||
---
|
||||
|
||||
# 分割页面
|
||||
|
||||
通过水平或垂直分割,将单个 PDF 页面切成两半。当一个页面包含应分开成独立页面的内容时,这会很有用,例如被扫描成一张宽页的双栏版式。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 选择分割方向:**垂直**(左/右两半)或 **水平**(上/下两半)。
|
||||
3. 可选:指定页面范围,限定要分割的页面。留空则分割所有页面。
|
||||
4. 点击处理按钮,生成分割后的 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 垂直分割:将每页分成左右两半
|
||||
- 水平分割:将每页分成上下两半
|
||||
- 页面范围过滤,可有选择地分割特定页面
|
||||
- 未选中的页面保持不变
|
||||
- 无需重新渲染,保持内容质量
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 分开双页扫描件(例如一张纸上同时包含左右两页的书籍扫描)
|
||||
- 将带有并排内容的横向 PDF 拆分为单独的纵向页面
|
||||
- 将较高的信息图或海报分成上下两个独立部分
|
||||
- 为标准纸张打印准备宽幅文档
|
||||
|
||||
## 小提示
|
||||
|
||||
- 如果页面内容分布不均,分割仍会在精确的中点进行。如需非对称分割,可考虑改用 [裁剪 PDF](./crop-pdf)。
|
||||
- 如果页面在分割前或分割后需要旋转,可将此工具与 [旋转 PDF](./rotate-pdf) 结合使用。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [分割 PDF](./split-pdf)
|
||||
- [裁剪 PDF](./crop-pdf)
|
||||
- [N-Up PDF](./n-up-pdf)
|
||||
- [海报化 PDF](./posterize-pdf)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: 双面扫描整理
|
||||
description: 将正面页和背面页分成两个区块的双面扫描 PDF,重新排列为正确的正反面页序。
|
||||
---
|
||||
|
||||
# 双面扫描整理
|
||||
|
||||
双面扫描整理专为 ADF 扫描流程设计,适用于一个 PDF 包含两个页面区块的情况:
|
||||
|
||||
- 先是所有正面
|
||||
- 然后是所有背面
|
||||
|
||||
无需手动拆分再重新组装,此工具会将两个区块交错排列成自然的阅读顺序:正面 1、背面 1、正面 2、背面 2,依此类推。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个由双面纸堆扫描生成的 PDF。
|
||||
2. 设置正面区块结束的分割点。
|
||||
3. 选择背面区块的处理方式:
|
||||
- **反转背面区块**(扫描背面前翻转了纸堆时常用)
|
||||
- **保持背面区块原样**
|
||||
4. 点击 **整理 PDF**,下载重新排序后的结果。
|
||||
|
||||
## 选项
|
||||
|
||||
- **自动检测分割点(一半)**:将分割点设置为 `ceil(totalPages / 2)`。
|
||||
- **奇数页警告**:总页数为奇数时发出警告(通常意味着扫描不匹配)。
|
||||
- **区块不均等确认**:正面和背面区块大小不同时,要求确认。
|
||||
- **分组导出**:根据原始文档页数,将整理后的输出拆分为多个 PDF,并以 ZIP 下载。
|
||||
|
||||
## 输出行为
|
||||
|
||||
- **默认**:输出一个 PDF(输入单个 PDF,输出单个 PDF)。
|
||||
- **分组模式**:输出按您设置的每文档页数分块;如果产生多个分块,会作为一个 ZIP 下载,否则下载单个 PDF。
|
||||
|
||||
如果区块大小不均等,会先整理成对的页面,剩余未配对的页面则追加在末尾。
|
||||
|
||||
## 常见使用场景
|
||||
|
||||
- 分两次扫描一堆双面表格后恢复页面顺序。
|
||||
- 为先输出所有正面再输出所有背面的办公扫描仪重建正反面文档包。
|
||||
- 在拆分为单个文档文件之前,对归档扫描件进行后期处理。
|
||||
|
||||
## 小提示
|
||||
|
||||
- 大多数双面批次的总页数应为偶数。
|
||||
- 如果背面看起来是颠倒的,请在 **反转背面区块** 和 **保持背面区块原样** 之间切换。
|
||||
- 对于 2 页的原件(正面加背面),请使用分组导出,并将每文档页数设为 `2`。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [交替与混合页面](./alternate-merge)
|
||||
- [分割 PDF](./split-pdf)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [整理与复制](./organize-pdf)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: 编辑附件
|
||||
description: 查看并有选择地移除嵌入在 PDF 文档中的文件附件。
|
||||
---
|
||||
|
||||
# 编辑附件
|
||||
|
||||
检查并管理 PDF 内部的文件附件。工具会列出每个嵌入文件的名称和附件级别,然后让您将单个附件标记为移除,或一次性清除全部附件。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 工具会自动扫描附件并以列表显示。
|
||||
3. 每个附件都会显示其文件名,以及它是文档级还是页面级附件。
|
||||
4. 点击附件旁的垃圾桶图标将其标记为移除(再次点击可取消标记)。
|
||||
5. 使用 **移除所有附件** 按钮一次性全选,或使用 **取消全选** 清除选择。
|
||||
6. 点击处理按钮,保存已移除所选附件的新 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 列出所有文档级和页面级附件
|
||||
- 单个或批量移除附件
|
||||
- 在提交更改前可开关选择状态
|
||||
- 标记为移除的项目会显示删除线并降低不透明度
|
||||
- 下载已清除所选附件的修改后 PDF
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在重新分发之前,移除嵌入文档中的过时或错误文件
|
||||
- 在分享前,从 PDF 中清除敏感附件(财务数据、个人信息)
|
||||
- 通过移除不再需要的大型嵌入文件来减小 PDF 体积
|
||||
- 在归档前审查嵌入内容并清理文档
|
||||
|
||||
## 小提示
|
||||
|
||||
- 标记为移除的附件会以删除线显示。如果您改变主意,可以在处理前将其切换回来。
|
||||
- 如果没有找到附件,工具会显示明确的“未找到附件”消息,说明该 PDF 不包含嵌入文件。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [添加附件](./add-attachments)
|
||||
- [提取附件](./extract-attachments)
|
||||
- [查看元数据](./view-metadata)
|
||||
@@ -0,0 +1,58 @@
|
||||
---
|
||||
title: 编辑元数据
|
||||
description: 查看并修改 PDF 元数据字段,包括标题、作者、关键词、日期和自定义属性。
|
||||
---
|
||||
|
||||
# 编辑元数据
|
||||
|
||||
编辑嵌入在 PDF 文件中的元数据。工具会用文档现有的元数据预先填充表单,让您修改任何字段,并将更改保存到新的 PDF 中。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。工具会读取其当前元数据并填充表单。
|
||||
2. 编辑任意标准字段:标题、作者、主题、关键词、创建者、生成器。
|
||||
3. 使用日期时间选择器调整创建日期和修改日期。
|
||||
4. 点击添加按钮并输入键值对,即可添加自定义元数据字段。
|
||||
5. 点击处理按钮保存修改后的 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 预先填入上传 PDF 的所有现有元数据
|
||||
- 标准字段:标题、作者、主题、关键词、创建者、生成器
|
||||
- 创建日期和修改日期的日期时间选择器
|
||||
- 自定义键值元数据字段,可用于任意属性
|
||||
- 将更改直接保存到 PDF 的文档信息字典中
|
||||
|
||||
## 可编辑字段
|
||||
|
||||
| 字段 | 说明 |
|
||||
| -------------- | -------------------------------- |
|
||||
| **标题** | PDF 阅读器中显示的文档标题 |
|
||||
| **作者** | 创建文档的个人或组织 |
|
||||
| **主题** | 对文档主题的简要描述 |
|
||||
| **关键词** | 以逗号分隔的词语,用于搜索和分类 |
|
||||
| **创建者** | 最初创建内容的应用程序 |
|
||||
| **生成器** | 生成该 PDF 的应用程序 |
|
||||
| **创建日期** | 文档最初创建的时间 |
|
||||
| **修改日期** | 文档最后修改的时间 |
|
||||
| **自定义字段** | 您定义的任何其他键值对 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在发布文档前设置恰当的标题和作者
|
||||
- 添加关键词,以提高文档管理系统中的可搜索性
|
||||
- 更新修改日期以反映当前修订版本
|
||||
- 添加部门、项目 ID 或密级等自定义元数据字段
|
||||
- 清理原始创作软件留下的元数据
|
||||
|
||||
## 小提示
|
||||
|
||||
- 自定义字段会直接写入 PDF 的信息字典。某些 PDF 阅读器可能不会显示自定义字段,但它们会保留在文件中。
|
||||
- 将字段留空即可从元数据中清除它。处理按钮会保存表单中的所有内容。
|
||||
- 如果只想查看元数据而不编辑,请使用 [查看元数据](./view-metadata)。如需完全移除所有元数据,请使用移除元数据。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [查看元数据](./view-metadata)
|
||||
- [PDF 图层 (OCG)](./pdf-layers)
|
||||
- [压缩 PDF](./compress-pdf)
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: PDF 编辑器
|
||||
description: 直接在浏览器中批注、高亮、涂黑、添加形状和图片、搜索并查看 PDF。
|
||||
---
|
||||
|
||||
# PDF 编辑器
|
||||
|
||||
BentoPDF 的 PDF 编辑器让您可以批注、高亮、涂黑、评论、添加形状和图片,并在 PDF 中搜索。它直接在浏览器中加载功能齐全的编辑器,无需上传到服务器。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上,上传您的 PDF。
|
||||
2. 内嵌的 PDF 编辑器会自动打开并载入您的文档。
|
||||
3. 使用工具栏进行批注、高亮、涂黑、添加文本、绘制形状或插入图片。
|
||||
4. 点击 **下载已编辑的 PDF** 保存您的更改。
|
||||
|
||||
## 功能
|
||||
|
||||
- 完整的批注工具栏,支持高亮、下划线、删除线和手绘
|
||||
- 文本插入和评论
|
||||
- 涂黑工具,在应用涂黑后会永久移除被标记的内容。如果点击 **下载已编辑的 PDF** 时仍有标记尚未应用,编辑器会提示先应用它们。
|
||||
- 矩形、圆形、直线和箭头等形状工具
|
||||
- 在 PDF 页面上插入图片
|
||||
- 内置的全文档文本搜索
|
||||
- 支持多文档标签页(最多同时打开 10 个文档)
|
||||
- 支持拖放加载文件
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 审阅合同,并用高亮和评论标记修改
|
||||
- 在分享前涂黑社会安全号码或财务数据等机密信息
|
||||
- 为建筑平面图或工程图纸添加批注
|
||||
- 在文档页面上插入公司标志或印章
|
||||
- 在冗长的法律文件中搜索特定术语
|
||||
|
||||
## 小提示
|
||||
|
||||
- 您可以同时打开多个 PDF,并使用编辑器顶部的标签栏在它们之间切换。
|
||||
- 编辑器会保留原始 PDF 的结构,因此字体、版面和表单字段保持完好。
|
||||
- 标记文本或区域用于涂黑,在应用涂黑之前不会移除任何内容。涂黑所选文本时,文件属性、书签、评论和附件中的副本也会从下载文件中一并移除,除非文件已加密。
|
||||
- 对于批量水印或页码,请改用专用工具,以便更好地控制格式。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [添加水印](./add-watermark)
|
||||
- [签署 PDF](./sign-pdf)
|
||||
- [添加印章](./add-stamps)
|
||||
- [移除批注](./remove-annotations)
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: 邮件转 PDF
|
||||
description: 在浏览器中将 EML 和 MSG 邮件文件转换为 PDF。保留邮件头、正文和附件列表。
|
||||
---
|
||||
|
||||
# 邮件转 PDF
|
||||
|
||||
将保存的邮件文件转换为整洁、可打印的 PDF。工具会解析 EML 和 MSG 文件,提取完整的邮件内容(邮件头、正文和附件元数据),并将所有内容渲染成结构化的 PDF。适用于法律取证、记录保存,或只是打印一封重要邮件。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 说明 |
|
||||
| :--- | :----- | :--------------------------------------------- |
|
||||
| EML | `.eml` | 标准 MIME 邮件格式(大多数邮件客户端均可导出) |
|
||||
| MSG | `.msg` | Microsoft Outlook 专有格式 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域,或拖放您的 EML 或 MSG 文件。可以在同一批次中混用两种格式。
|
||||
2. 查看文件列表。使用垃圾桶图标移除不需要的条目,或点击 **添加更多文件** 加入更多邮件。
|
||||
3. 配置转换选项(见下文)。
|
||||
4. 点击 **转换为 PDF**。工具会解析每封邮件,将内容渲染为带样式的 HTML,并通过 PyMuPDF 引擎转换为 PDF。
|
||||
5. 单封邮件会直接下载为 PDF。多封邮件会打包成 `emails-converted.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 默认值 | 说明 |
|
||||
| :----------------- | :----- | :------------------------------------------------------------ |
|
||||
| **页面大小** | A4 | 在 A4、Letter 或 Legal 页面尺寸之间选择。 |
|
||||
| **包含抄送和密送** | 开启 | 启用后,抄送和密送收件人列表会显示在 PDF 的邮件头部分。 |
|
||||
| **包含附件列表** | 开启 | 启用后,邮件的文件附件列表(含文件名和大小)会显示在 PDF 中。 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将重要的商务往来邮件归档为 PDF,用于合规或审计
|
||||
- 为法律程序或取证请求打印邮件往来
|
||||
- 为通过邮件收到的订单确认、收据或合同创建永久记录
|
||||
- 以无需 Outlook 即可阅读的格式备份 Outlook MSG 文件
|
||||
- 根据导出的 EML 文件记录客户支持沟通
|
||||
|
||||
## 小提示
|
||||
|
||||
- 同时支持 EML(Thunderbird、Apple Mail 和大多数邮件客户端使用)和 Outlook MSG 文件。从邮件客户端导出邮件,然后直接拖入工具即可。
|
||||
- HTML 格式的邮件会在 PDF 中保留其样式。纯文本邮件则以整洁易读的格式渲染。
|
||||
- 附件列表会显示文件名和大小,但不会将实际的附件文件嵌入 PDF。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [XML 转 PDF](./xml-to-pdf)
|
||||
- [XPS 转 PDF](./xps-to-pdf)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: EPUB 转 PDF
|
||||
description: 在浏览器中将 EPUB 电子书转换为 PDF。免费,无需上传,隐私优先的转换。
|
||||
---
|
||||
|
||||
# EPUB 转 PDF
|
||||
|
||||
无需离开浏览器,即可将 EPUB 电子书转换为 PDF 文件。EPUB 是数字图书的开放标准,但有时您需要固定版式的 PDF,用于打印、批注,或分享给没有电子书阅读器的人。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 说明 |
|
||||
| :--- | :------ | :-------------------- |
|
||||
| EPUB | `.epub` | EPUB 2 和 EPUB 3 文件 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域,或拖放您的 EPUB 文件。支持多选。
|
||||
2. 查看已上传的文件。使用垃圾桶图标移除不需要的条目,或点击 **添加更多文件** 扩充批次。
|
||||
3. 点击 **转换为 PDF**。PyMuPDF 引擎会将 EPUB 内容(文本、图片和格式)渲染为分页的 PDF 输出。
|
||||
4. 单个 EPUB 会直接下载为 PDF。多个文件会打包成名为 `epub-converted.zip` 的 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
转换使用合理的默认值运行,无需任何配置。文本会重排为标准页面尺寸,嵌入的字体和图片会带入 PDF。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 打印无 DRM 的电子书,以便离开屏幕阅读
|
||||
- 将 EPUB 稿件以固定版式 PDF 提交审阅
|
||||
- 以每个操作系统都能原生打开的格式归档数字图书
|
||||
- 与没有 EPUB 阅读器的同事分享某一章节
|
||||
- 将以 EPUB 分发的技术文档转换为可批注的 PDF
|
||||
|
||||
## 小提示
|
||||
|
||||
- 嵌入的音频和视频等 EPUB 3 功能无法带入 PDF,但所有文本、图片和表格都能干净地转换。
|
||||
- 对于样式繁多的 EPUB,为获得最佳效果,请检查输出的前几页,确认版式是否还原。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [MOBI 转 PDF](./mobi-to-pdf)
|
||||
- [FB2 转 PDF](./fb2-to-pdf)
|
||||
- [CBZ 转 PDF](./cbz-to-pdf)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Excel 转 PDF
|
||||
description: 将 Excel 电子表格(XLS、XLSX)、ODS 和 CSV 文件转换为 PDF,并保留格式。
|
||||
---
|
||||
|
||||
# Excel 转 PDF
|
||||
|
||||
将电子表格文件转换为 PDF。此工具可处理现代 Excel 文件、旧版 XLS 格式、OpenDocument 电子表格,甚至 CSV,全部通过基于浏览器的 LibreOffice 引擎渲染,保留单元格格式、公式(以计算值呈现)、图表和多工作表版式。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :-------------------- | :------ |
|
||||
| Excel(新版) | `.xlsx` |
|
||||
| Excel(旧版) | `.xls` |
|
||||
| OpenDocument 电子表格 | `.ods` |
|
||||
| CSV | `.csv` |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域,或拖放您的电子表格文件。
|
||||
2. 查看文件列表。可添加更多文件或移除不需要的文件。
|
||||
3. 点击 **转换为 PDF**。LibreOffice 引擎会在首次使用时初始化,然后处理每个文件。
|
||||
4. 单个文件会直接下载为 PDF。多个文件会以 `excel-converted.zip` 提供。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有额外配置。LibreOffice 引擎根据电子表格的内置设置确定页面布局、缩放和打印区域。
|
||||
|
||||
## 输出
|
||||
|
||||
| 输入数量 | 输出 |
|
||||
| :------- | :-------------------------------------------------------- |
|
||||
| 1 个文件 | 下载单个 PDF(原文件名,扩展名为 `.pdf`) |
|
||||
| 2 个以上 | ZIP 压缩包(`excel-converted.zip`),每个文件对应一个 PDF |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将财务报告或预算从 Excel 转换为 PDF 以便分发
|
||||
- 根据库存或产品目录电子表格创建可直接打印的 PDF
|
||||
- 与未安装 Excel 的相关方分享数据分析结果
|
||||
- 以不可编辑的格式归档季度报告
|
||||
- 将 LibreOffice Calc 的 ODS 文件转换为 PDF
|
||||
|
||||
## 小提示
|
||||
|
||||
- 电子表格中嵌入的图表会在 PDF 中渲染。转换前请确保它们在源文件中显示正确。
|
||||
- 如果电子表格有多个工作表,所有工作表都会包含在 PDF 输出中。
|
||||
- 对于没有格式的简单 CSV 数据,[CSV 转 PDF](./csv-to-pdf) 工具提供更轻量的转换。当您需要保留格式、图表或多个工作表时,请使用 Excel 转 PDF。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [CSV 转 PDF](./csv-to-pdf)
|
||||
- [Word 转 PDF](./word-to-pdf)
|
||||
- [PowerPoint 转 PDF](./powerpoint-to-pdf)
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 提取附件
|
||||
description: 从一个或多个 PDF 中提取所有嵌入的文件附件,并以 ZIP 压缩包下载。
|
||||
---
|
||||
|
||||
# 提取附件
|
||||
|
||||
从一个或多个 PDF 文件中取出所有嵌入的附件。所有提取的文件会打包成单个 ZIP 压缩包供下载。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个或多个包含嵌入附件的 PDF 文件。
|
||||
2. 点击 **提取附件**。
|
||||
3. 工具会扫描每个 PDF 中的文档级和页面级附件。
|
||||
4. 找到的所有文件会被打包成 ZIP 压缩包并自动下载。
|
||||
5. 状态消息会确认找到了多少个附件及其总大小。
|
||||
|
||||
## 功能
|
||||
|
||||
- 一次性从多个 PDF 批量提取
|
||||
- 同时提取文档级和页面级附件
|
||||
- 输出包含所有提取文件的单个 ZIP 文件
|
||||
- 显示附件总数和合计文件大小
|
||||
- 未找到附件时给出明确的状态消息
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 恢复嵌入在报告 PDF 中的数据文件
|
||||
- 从作品集或规格文档中取出图片素材
|
||||
- 从培训或合规 PDF 中提取补充材料
|
||||
- 审查一批 PDF 中嵌入了哪些文件
|
||||
|
||||
## 小提示
|
||||
|
||||
- 如果工具提示没有附件,PDF 中可能包含的是嵌入图片或表单数据,它们不属于文件附件。嵌入的图片请使用 [提取图片](./extract-images)。
|
||||
- 处理多个 PDF 时,所有文件的附件都会汇集到一个 ZIP 中。文件名会保留原始嵌入时的名称。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [添加附件](./add-attachments)
|
||||
- [编辑附件](./edit-attachments)
|
||||
- [提取图片](./extract-images)
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: 提取图片
|
||||
description: 提取 PDF 文件中所有嵌入的图片。在网格中预览,可单独下载或打包为 ZIP 压缩包下载。
|
||||
---
|
||||
|
||||
# 提取图片
|
||||
|
||||
从一个或多个 PDF 文件中取出所有嵌入的图片。提取的图片会显示在预览网格中,您可以逐个下载,也可以一次性打包为 ZIP 下载。由 PyMuPDF 提供支持。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上,上传一个或多个 PDF。可根据需要添加更多文件或移除单个文件。
|
||||
2. 点击 **提取** 开始处理。
|
||||
3. 工具会扫描每个已上传 PDF 的每一页,查找并提取嵌入的图片。
|
||||
4. 提取的图片以缩略图形式显示在网格中。每张图片都有下载按钮。
|
||||
5. 点击 **全部下载**,将所有内容保存为 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。所有嵌入的图片都会以其原生格式提取(通常是 PNG、JPEG,或图片嵌入 PDF 时使用的任何格式)。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- 图片在预览网格中以 `image_1.png`、`image_2.jpg` 等名称显示。
|
||||
- **全部下载** 会生成包含所有图片的 `extracted-images.zip`。
|
||||
- 可以从网格中逐个下载单张图片。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从 PDF 中恢复照片或图形,以便在其他项目中重复使用。
|
||||
- 从产品目录 PDF 中提取产品图片,用于电商商品列表。
|
||||
- 从技术文档中取出图表,用于演示文稿。
|
||||
- 在分享文档前,审查其中嵌入了哪些图片。
|
||||
|
||||
## 小提示
|
||||
|
||||
- 此工具会按图片在 PDF 中的存储方式原样提取。它不会将页面重新渲染为图片。如需那样做,请使用 [PDF 转 PNG](./pdf-to-png) 或 [PDF 转 JPG](./pdf-to-jpg)。
|
||||
- 如果工具提示“未找到图片”,则 PDF 可能使用的是矢量图形而非嵌入的光栅图片,或者它是整页为一张大图的扫描文档。
|
||||
- 批量处理可跨多个 PDF 进行。所有文件的全部图片会合并到同一个网格和 ZIP 中。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
- [PDF 工作流构建器](./pdf-workflow)
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: 提取页面
|
||||
description: 将 PDF 中指定范围的页面保存为新文档。
|
||||
---
|
||||
|
||||
# 提取页面
|
||||
|
||||
从 PDF 中取出一组页面并保存为新文件。使用范围语法准确指定所需页面,工具会创建仅包含这些页面的干净 PDF。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。工具会显示文件名、大小和总页数。
|
||||
2. 使用范围语法输入要提取的页面(例如 `1-5`、`3, 7, 10-12`)。
|
||||
3. 可选:选择将每个范围作为单独的 PDF 放入 ZIP 压缩包下载。
|
||||
4. 点击处理按钮。提取的页面会下载为新的 PDF(或 ZIP)。
|
||||
|
||||
## 功能
|
||||
|
||||
- 灵活的页面范围语法:单个页面、范围或以逗号分隔的组合
|
||||
- 上传后显示总页数,方便参考
|
||||
- 可选择输出为单个合并 PDF,或 ZIP 中的多个独立文件
|
||||
- 保留原始页面内容和格式
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从冗长的报告中取出执行摘要(前几页)
|
||||
- 从教科书 PDF 中提取单个章节
|
||||
- 将表单包中的特定页面保存为独立文档
|
||||
- 从较大文件的选定页面创建示例文档
|
||||
|
||||
## 小提示
|
||||
|
||||
- 页码从 1 开始。第一页请使用 `1`,而不是 `0`。
|
||||
- 如果要移除页面而不是提取页面,请使用 [删除页面](./delete-pages),它是相反的操作。
|
||||
- 如果您需要带缩略图的可视化页面选择,请在可视化选择模式下使用 [分割 PDF](./split-pdf)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [分割 PDF](./split-pdf)
|
||||
- [删除页面](./delete-pages)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: 提取 PDF 表格
|
||||
description: 检测并提取 PDF 文档中的表格。可按单个表格导出为 CSV、JSON 或 Markdown。
|
||||
---
|
||||
|
||||
# 提取 PDF 表格
|
||||
|
||||
检测 PDF 中的所有表格,并让您选择导出格式:CSV、JSON 或 Markdown。每个表格都会被单独提取,并附带页面和位置元数据。由 PyMuPDF 的表格检测引擎提供支持。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上,上传 PDF。
|
||||
2. 选择您偏好的 **导出格式**:CSV、JSON 或 Markdown。
|
||||
3. 点击 **提取** 开始处理。
|
||||
4. 如果找到一个表格,它会作为单个文件下载。找到多个表格时,会生成每个表格一个文件的 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
- **导出格式**:可在以下选项中选择:
|
||||
- **CSV**:以逗号分隔的值,对包含逗号、引号或换行符的字段进行了正确的引用处理。适用于电子表格和数据库。
|
||||
- **JSON**:数组的数组结构,以 2 个空格缩进格式化输出。适用于程序化使用。
|
||||
- **Markdown**:由 PyMuPDF 渲染的竖线分隔表格格式。适用于文档和 README 文件。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单个表格**:`filename_table.csv`(或 `.json` / `.md`)
|
||||
- **多个表格**:`filename_tables.zip`,其中包含名为 `table_1_page3.csv`、`table_2_page5.csv` 等的文件
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从冗长的 PDF 报告中提取特定表格,而无需取出整个文档的数据。
|
||||
- 获取 Markdown 格式的表格,直接粘贴到 GitHub issue、wiki 或文档中。
|
||||
- 从 PDF 表格中提取结构化的 JSON 数据,用于 API 集成或脚本。
|
||||
- 将不同版本的 PDF 表格导出为 CSV 后进行差异比对,从而比较表格。
|
||||
|
||||
## 小提示
|
||||
|
||||
- 此工具让您按表格逐个控制。如果您只想将所有表格导出到单个 CSV,请使用 [PDF 转 CSV](./pdf-to-csv)。如需完整的 Excel 工作簿,请使用 [PDF 转 Excel](./pdf-to-excel)。
|
||||
- 跨多页的表格可能会被检测为每页一个独立的表格。您可能需要手动将它们拼接起来。
|
||||
- 如果没有检测到表格,PDF 可能是扫描图像。请先运行 OCR 以添加文本层。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 CSV](./pdf-to-csv)
|
||||
- [PDF 转 Excel](./pdf-to-excel)
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: FB2 转 PDF
|
||||
description: 在浏览器中将 FictionBook (FB2) 电子书文件转换为 PDF。免费、私密,无需上传到服务器。
|
||||
---
|
||||
|
||||
# FB2 转 PDF
|
||||
|
||||
将 FictionBook 2 (FB2) 文件转换为 PDF 文档。FB2 是一种基于 XML 的电子书格式,在俄罗斯和东欧很流行。它在某些平台上支持良好,在其他平台上却几乎无人知晓,转换为 PDF 后,您的书籍就可以在任何地方阅读。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 备注 |
|
||||
| :------------ | :----- | :-------------------- |
|
||||
| FictionBook 2 | `.fb2` | 基于 XML 的电子书格式 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或将 FB2 文件拖放进来。支持批量选择多个文件。
|
||||
2. 查看文件列表。使用垃圾桶图标移除单个文件,或点击 **添加更多文件** 加入更多文件。
|
||||
3. 点击 **转换为 PDF**。PyMuPDF 引擎会解析 FB2 的 XML 结构,并将其渲染为分页的 PDF 内容。
|
||||
4. 单个文件会直接下载为 PDF。转换多个文件时,会打包为 `fb2-converted.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
无需任何配置。转换器会自动处理 FB2 的 XML 结构,并保留章节分隔、格式和所有嵌入的图片。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在只支持 PDF 的设备或应用上阅读 FB2 电子书
|
||||
- 打印以 FB2 格式发布的俄语文学作品
|
||||
- 将 FB2 藏书归档为通用支持的格式
|
||||
- 与阅读器不支持 FictionBook 的人分享一本书
|
||||
|
||||
## 小贴士
|
||||
|
||||
- FB2 文件是纯 XML,因此通常体积很小,即使在浏览器中也能快速转换。
|
||||
- 如果您的 FB2 文件被压缩为 `.fb2.zip`,请先解压再上传。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [EPUB 转 PDF](./epub-to-pdf)
|
||||
- [MOBI 转 PDF](./mobi-to-pdf)
|
||||
- [XML 转 PDF](./xml-to-pdf)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: 修复页面尺寸
|
||||
description: 将 PDF 中的所有页面统一为相同尺寸。可选择标准纸张尺寸或设置自定义尺寸。
|
||||
---
|
||||
|
||||
# 修复页面尺寸
|
||||
|
||||
由多个来源拼合而成的 PDF,页面尺寸往往不一致:有的是 Letter,有的是 A4,有的完全是非标准尺寸。此工具会将每一页统一为同一个目标尺寸,并按需缩放内容以适应或填满页面。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个 PDF 文件。
|
||||
2. 从下拉菜单中选择 **目标页面尺寸**(A4、Letter、Legal、A3、A5、Tabloid 或自定义)。
|
||||
3. 选择 **方向**:自动会保留每页原有的方向,也可以强制设为纵向或横向。
|
||||
4. 选择 **内容缩放** 模式:适应(保留全部内容,可能添加边距)或填充(铺满页面,可能裁掉边缘)。
|
||||
5. 可选:为新增的边距设置 **背景颜色**。
|
||||
6. 点击 **修正页面尺寸**。
|
||||
|
||||
## 选项
|
||||
|
||||
- **标准尺寸**:A4、Letter、Legal、A3、A5、Tabloid
|
||||
- **自定义尺寸**:以英寸或毫米输入宽度和高度
|
||||
- **方向**:自动、纵向、横向
|
||||
- **缩放模式**:适应或填充(裁剪)
|
||||
- **背景颜色**:用于填充边距的任意颜色
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 统一来自不同扫描仪的页面合并而成的 PDF
|
||||
- 将美国 Letter 文档转换为 A4,便于国际分发
|
||||
- 准备要求裁切尺寸一致的可印刷 PDF
|
||||
- 修正略微偏离标准的页面(例如 8.49 x 11.02 英寸而不是 8.5 x 11)
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 使用适应模式可确保不丢失任何内容。填充模式看起来更整洁,但可能裁掉边缘。
|
||||
- 使用页面尺寸工具检查输出结果,确认每一页都与目标尺寸一致。
|
||||
- 默认背景色为白色;如果文档带有深色边距,请改用深色。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [页面尺寸](./page-dimensions):修正前后检查页面尺寸
|
||||
- [压缩 PDF](./compress-pdf):统一尺寸后减小文件体积
|
||||
- [裁剪 PDF](./crop-pdf):手动裁剪页面,而不是自动缩放
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: 扁平化 PDF
|
||||
description: 将交互式表单和注释展平为静态内容。使表单字段不可编辑,并将注释烧录到页面中。
|
||||
---
|
||||
|
||||
# 扁平化 PDF
|
||||
|
||||
展平会将交互元素(表单字段、下拉菜单、复选框、注释、高亮、便签)直接合并到页面内容中。外观保持不变,但内容不再可编辑或可提取。这相当于把填好的表单打印出来再扫描回去,只不过质量依然完美。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个或多个 PDF 文件。
|
||||
2. 点击 **展平 PDF**。
|
||||
3. 单个文件会直接下载,多个文件会生成 ZIP 压缩包。
|
||||
|
||||
该工具使用 pdf-lib 展平表单字段(通过 `form.flatten()`),并使用专用的注释展平器将注释烧录到页面流中。两项操作在一次处理中完成。
|
||||
|
||||
## 会被展平的内容
|
||||
|
||||
- **表单字段**:文本输入框、复选框、单选按钮、下拉菜单、签名字段
|
||||
- **注释**:批注、高亮、删除线、下划线、便签、图章、墨迹注释
|
||||
- **交互元素**:按钮、动作触发器
|
||||
|
||||
## 保持不变的内容
|
||||
|
||||
- 文本内容(仍可选择和搜索)
|
||||
- 图片和图形
|
||||
- 页面布局和尺寸
|
||||
- 书签和目录
|
||||
- 超链接(基于注释的除外)
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 锁定已填写的表单,使收件人无法更改已提交的答案
|
||||
- 为归档准备 PDF,此时不需要交互元素
|
||||
- 修复因注释在不同查看器中渲染不一致而导致的显示问题
|
||||
- 确保已签名的文档在签名后无法被修改
|
||||
- 通过去除表单字段定义和注释对象来减小文件体积
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 请在所有编辑完成后再展平。PDF 无法取消展平。
|
||||
- 如果您需要在展平的同时清除元数据、JavaScript 和附件,请改用清理 PDF 工具,它的选项中包含展平。
|
||||
- 有些 PDF 会提示“未找到表单”,如果文档只有注释而没有表单字段,这是正常现象。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [清理 PDF](./sanitize-pdf):展平表单,同时移除元数据、脚本等
|
||||
- [栅格化 PDF](./rasterize-pdf):转换为基于图像的 PDF,实现最彻底的展平
|
||||
- [字体转轮廓](./font-to-outline):将字体展平为矢量路径
|
||||
- [加密 PDF](./protect-pdf):用密码锁定展平后的 PDF
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: 字体转轮廓
|
||||
description: 将 PDF 中的所有字体转换为矢量轮廓,使其在各种设备上渲染一致,彻底消除字体依赖问题。
|
||||
---
|
||||
|
||||
# 字体转轮廓
|
||||
|
||||
将字体转换为轮廓,会把每个文字字符从基于字体的字形变为矢量路径。PDF 不再依赖任何已安装的字体,在每台设备、每种操作系统和每台打印机上的呈现都完全相同。这是印前工作流程中的标准步骤。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个或多个 PDF 文件。
|
||||
2. 点击 **转换为轮廓**。
|
||||
3. Ghostscript 会将所有文字转换为矢量路径。
|
||||
4. 下载结果。多个文件会生成 ZIP 压缩包。
|
||||
|
||||
无需任何设置。该工具使用 Ghostscript (WebAssembly),在一次处理中将所有字体引用转换为轮廓路径。
|
||||
|
||||
## 会发生的变化
|
||||
|
||||
- 文字字符变为矢量曲线(贝塞尔路径)
|
||||
- 不再需要嵌入字体,PDF 在字形层面是自包含的
|
||||
- 文件体积可能增大,因为矢量路径通常比字体引用更大
|
||||
- 视觉外观完全保持不变
|
||||
|
||||
## 会失去的功能
|
||||
|
||||
- 文本选择和复制粘贴
|
||||
- 文本可搜索性(Ctrl+F 将失效)
|
||||
- 编辑文本内容的能力
|
||||
- 屏幕阅读器的无障碍访问
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 PDF 发送给要求字体转曲的印刷厂
|
||||
- 与没有相应字体的人分享使用自定义或授权字体的文档
|
||||
- 防止字体替换导致文档在其他系统上外观改变
|
||||
- 为需要矢量输入的激光雕刻或 CNC 切割流程准备 PDF
|
||||
- 确保含有大量徽标的 PDF 在所有平台上正确显示
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 请保留原始 PDF。转轮廓不可逆,无法将路径转换回可编辑的文本。
|
||||
- 如果您需要文本仍可搜索,可以考虑改用栅格化 PDF 工具,之后再进行 OCR。
|
||||
- 转轮廓后的 PDF 往往更大。如果文件体积很重要,请随后运行压缩 PDF。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [展平 PDF](./flatten-pdf):展平表单和注释,不触及字体
|
||||
- [栅格化 PDF](./rasterize-pdf):转换为基于图像的 PDF,而不是矢量轮廓
|
||||
- [压缩 PDF](./compress-pdf):转轮廓后减小文件体积
|
||||
- [PDF 转 PDF/A](./pdf-to-pdfa):确保字体独立后转换为归档格式
|
||||
@@ -0,0 +1,76 @@
|
||||
---
|
||||
title: 创建 PDF 表单
|
||||
description: 通过拖放文本字段、复选框、下拉菜单、单选按钮等,构建可填写的 PDF 表单。
|
||||
---
|
||||
|
||||
# 创建 PDF 表单
|
||||
|
||||
从零开始,或在现有 PDF 上添加字段,设计专业的可填写 PDF 表单。可视化编辑器让您将文本字段、复选框、下拉菜单、单选按钮、签名字段等表单元素直接拖放到页面预览上。配置字段属性,设置条件显示规则,并导出完全交互式的 PDF 表单。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传现有 PDF,**或** 点击 **创建空白 PDF** 从头开始。
|
||||
2. 如果创建空白 PDF,请选择页面尺寸(Letter、A4、A5、Legal、Tabloid、A3 或自定义尺寸)。
|
||||
3. 表单编辑器打开后,会显示字段类型工具栏和页面预览区域。
|
||||
4. 从工具栏选择字段类型,然后在页面上点击以放置。
|
||||
5. 拖动字段以调整位置,使用缩放手柄调整大小。
|
||||
6. 点击字段打开属性面板,可设置字段名称、默认值、字体大小、对齐方式等。
|
||||
7. 使用页面控件在各页之间切换。
|
||||
8. 点击 **保存** 下载完成的可填写 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 拖放放置字段,带有可视化的缩放手柄
|
||||
- 字段类型:文本输入、多行文本、复选框、下拉菜单、单选按钮、签名、日期、数字和条形码
|
||||
- 属性面板,用于配置每个字段的名称、标签、默认值、字体大小、颜色、对齐方式和验证
|
||||
- 字段动作和条件显示规则(根据其他字段的值显示或隐藏字段)
|
||||
- 多页表单的页面导航
|
||||
- 现有字段提取:自动检测并导入上传 PDF 中的表单字段
|
||||
- 支持将上传的 PDF 和空白页面作为表单画布
|
||||
- 多种页面尺寸预设,以及自定义尺寸
|
||||
- 由 bwip-js 提供支持的条形码生成
|
||||
- 单选按钮组管理
|
||||
|
||||
## 选项
|
||||
|
||||
**页面尺寸预设(适用于空白 PDF):**
|
||||
|
||||
- Letter (8.5" x 11")
|
||||
- A4 (210mm x 297mm)
|
||||
- A5 (148mm x 210mm)
|
||||
- Legal (8.5" x 14")
|
||||
- Tabloid (11" x 17")
|
||||
- A3 (297mm x 420mm)
|
||||
- 自定义(指定宽度和高度)
|
||||
|
||||
**字段属性(因字段类型而异):**
|
||||
|
||||
- 名称、标签和占位文本
|
||||
- 默认值
|
||||
- 字体、大小和颜色
|
||||
- 文本对齐(左、中、右)
|
||||
- 必填字段开关
|
||||
- 只读开关
|
||||
- 文本字段的最大长度
|
||||
- 下拉菜单和单选按钮的选项列表
|
||||
- 条件显示动作
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 构建员工入职表单,包含个人信息文本字段和政策确认复选框
|
||||
- 创建客户登记问卷,使用下拉菜单选择服务
|
||||
- 设计带有计算字段和条形码标识的订单表
|
||||
- 构建使用单选按钮进行合格或不合格评级的检查清单
|
||||
- 创建调查表单,根据回答显示条件式的后续问题
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 如果您上传了现有 PDF,工具会尝试提取其中已有的表单字段,让您可以编辑或补充它们。
|
||||
- 使用单选按钮组功能创建互斥选项。同一单选组中的字段共享一个组名。
|
||||
- 下载表单后在 [PDF 表单填写](./form-filler) 中打开测试,以验证字段行为。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 表单填写](./form-filler)
|
||||
- [签署 PDF](./sign-pdf)
|
||||
- [PDF 编辑器](./edit-pdf)
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: PDF 表单填写器
|
||||
description: 在浏览器中通过内嵌查看器填写 PDF 表单,包括 XFA 表单。
|
||||
---
|
||||
|
||||
# PDF 表单填写器
|
||||
|
||||
打开带有表单字段的 PDF,并在内嵌查看器中直接填写。该工具同时支持标准 AcroForm 字段和旧版 XFA (XML Forms Architecture) 表单。填写完成后,一键下载已填写的版本。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传包含表单字段的 PDF。
|
||||
2. 文档会在集成的 PDF 查看器中打开,表单字段呈现为可交互的输入控件。
|
||||
3. 点击文本字段、复选框、下拉菜单和单选按钮进行填写。
|
||||
4. 点击 **保存并下载已填写表单** 获取完成的 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 内嵌 PDF.js 查看器,支持完整的表单字段交互
|
||||
- 支持标准 AcroForm 字段(文本输入、复选框、下拉菜单、单选按钮)
|
||||
- 支持基于 XML 的旧版 XFA 表单
|
||||
- 根据页面尺寸自动调整查看器大小
|
||||
- 显示文件名称和大小信息
|
||||
|
||||
## 选项
|
||||
|
||||
没有其他配置选项。上传表单,填写,然后下载即可。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 填写税务表格、保险申请表或政府文书
|
||||
- 填写以 PDF 附件形式收到的求职申请表
|
||||
- 填写供应商入驻表单或供应商问卷
|
||||
- 通过复选框字段签署合规检查清单
|
||||
- 就诊前填写医疗登记表
|
||||
|
||||
## 小贴士
|
||||
|
||||
- XFA 表单是仅被部分 PDF 查看器支持的旧版格式。如果您在 Chrome 或大多数其他工具中打开 XFA PDF 后看到空白页,说明这些查看器不支持 XFA。BentoPDF 的表单填写工具和 Firefox 都能正确处理 XFA。
|
||||
- 对于没有现成表单字段的 PDF,请先使用 [创建 PDF 表单](./form-creator) 工具添加字段,再在此处填写。
|
||||
- 查看器会自动调整大小以匹配 PDF 的页面尺寸。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [创建 PDF 表单](./form-creator)
|
||||
- [签署 PDF](./sign-pdf)
|
||||
- [PDF 编辑器](./edit-pdf)
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: 页眉和页脚
|
||||
description: 为 PDF 页面添加可自定义的页眉和页脚文本,支持动态页码变量。
|
||||
---
|
||||
|
||||
# 页眉和页脚
|
||||
|
||||
在 PDF 页面的六个位置添加文本:页眉左、页眉中、页眉右、页脚左、页脚中和页脚右。该工具支持页码和总页数的动态变量,因此您可以创建类似“第 3 页,共 10 页”的模板,并按页自动更新。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 出现选项面板,显示格式控件和六个文本输入框。
|
||||
3. 在任意页眉或页脚位置输入所需文本。
|
||||
4. 使用 `{page}` 和 `{total}` 占位符实现动态页码。
|
||||
5. 调整字体大小、字体颜色,也可以选择限制在特定页面范围内。
|
||||
6. 点击 **添加页眉和页脚** 进行处理并下载。
|
||||
|
||||
## 选项
|
||||
|
||||
- **页面范围**:可选,限制哪些页面添加页眉和页脚。留空则应用于所有页面。格式:"1-3, 5"(以逗号分隔的范围)。
|
||||
- **字体大小**:6 到 24 磅之间。默认为 10。
|
||||
- **字体颜色**:使用颜色选择器选取任意颜色。
|
||||
- **页眉左 / 中 / 右**:每页顶部的文本字段。
|
||||
- **页脚左 / 中 / 右**:每页底部的文本字段。
|
||||
|
||||
## 功能
|
||||
|
||||
- 每页六个独立的文本位置
|
||||
- 动态 `{page}` 变量,插入当前页码
|
||||
- 动态 `{total}` 变量,插入总页数
|
||||
- 页面范围过滤,针对特定页面
|
||||
- 可自定义字体大小和颜色
|
||||
- 使用 Helvetica 字体,输出整洁专业
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在报告的页脚中间添加“第 {page} 页,共 {total} 页”
|
||||
- 在页眉左侧放置公司名称,在页眉右侧放置文档日期
|
||||
- 在法律文件的页脚添加保密声明
|
||||
- 在特定页面范围上标注文档修订编号
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 可以在同一个字段中组合 `{page}` 和 `{total}`,例如“第 {page} 页,共 {total} 页”或“{page}/{total}”。
|
||||
- 大多数字段可以留空,只填写需要的位置。空字段会被直接跳过。
|
||||
- 对于包含图片或徽标的更复杂页眉,可以考虑使用 [添加水印](./add-watermark) 工具,并将其放置在页面顶部。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [页码](./page-numbers)
|
||||
- [添加水印](./add-watermark)
|
||||
- [Bates 编号](./bates-numbering)
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: HEIC 转 PDF
|
||||
description: 在浏览器中将 iPhone 和 iPad 的 HEIC 和 HEIF 图片转换为 PDF 格式。
|
||||
---
|
||||
|
||||
# HEIC 转 PDF
|
||||
|
||||
将 HEIC/HEIF 图片转换为 PDF。自 iOS 11 起,HEIC 就是 iPhone 和 iPad 的默认照片格式。借助此工具,您无需安装任何桌面软件,也无需将文件上传到服务器,就能把这些照片变成 PDF。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :--- | :------ |
|
||||
| HEIC | `.heic` |
|
||||
| HEIF | `.heif` |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或将 HEIC/HEIF 文件拖放进来。
|
||||
2. 查看文件列表,移除不需要的文件。
|
||||
3. 点击 **转换为 PDF**。结果会以 `from_heic.pdf` 下载。
|
||||
|
||||
每个 HEIC 文件都使用 heic2any 库解码,并以 92% 的质量转换为 PNG。随后使用 pdf-lib 将 PNG 嵌入 PDF,每张图片独占一页,保持完整分辨率。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具不提供额外设置。HEIC 图片在嵌入前以高质量 (0.92) 转换为 PNG。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 用 iPhone 照片创建 PDF,附在保险理赔申请或报告中
|
||||
- 将房地产房源的 HEIC 照片转换为一份可打印的文档
|
||||
- 将 iPad 截图(HEIF 格式)变成可分享的 PDF
|
||||
- 批量转换度假照片,制作旅行日志
|
||||
|
||||
## 小贴士
|
||||
|
||||
- HEIC 解码完全在浏览器中使用 WebAssembly 完成。解码器加载期间,首次转换可能需要稍等片刻。
|
||||
- 如果您需要混合 HEIC 与其他图片格式(JPG、PNG 等),请使用 [图片转 PDF](./image-to-pdf) 工具,它可以同时处理 HEIC 和所有其他格式。
|
||||
- iPhone 的 HEIC 文件通常包含 EXIF 数据,其中有 GPS 坐标。PDF 输出不会保留这些元数据。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
- [JPG 转 PDF](./jpg-to-pdf)
|
||||
- [PNG 转 PDF](./png-to-pdf)
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
title: 图片转 PDF
|
||||
description: 将 JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP、PSD 以及 10 多种其他图片格式合并为一个 PDF 文件。
|
||||
---
|
||||
|
||||
# 图片转 PDF
|
||||
|
||||
通用的图片转 PDF 转换器。上传几乎任何格式的图片,并将它们合并为一个 PDF 文档。每张图片独占一页,页面大小与原始尺寸一致。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :-------------- | :------------------------------------- |
|
||||
| JPEG | `.jpg`, `.jpeg` |
|
||||
| JPEG 2000 | `.jp2`, `.jpx` |
|
||||
| PNG | `.png` |
|
||||
| BMP | `.bmp` |
|
||||
| GIF | `.gif` |
|
||||
| TIFF | `.tiff`, `.tif` |
|
||||
| SVG | `.svg` |
|
||||
| HEIC/HEIF | `.heic`, `.heif` |
|
||||
| WebP | `.webp` |
|
||||
| PSD | `.psd` |
|
||||
| Portable Anymap | `.pnm`, `.pgm`, `.pbm`, `.ppm`, `.pam` |
|
||||
| JPEG XR | `.jxr` |
|
||||
|
||||
这是 BentoPDF 所有图片转换器中支持格式最广的一个。如果您只需要某一种特定格式,可以改用对应的专用工具。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或将图片文件拖放进来。可以一次选择多个文件。
|
||||
2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或点击 **添加更多文件** 加入更多图片。
|
||||
3. 从下拉菜单中选择 **PDF 质量** 级别。
|
||||
4. 点击 **转换为 PDF**。该工具通过 PyMuPDF 引擎处理图片,并将结果下载为 `images_to_pdf.pdf`。
|
||||
|
||||
## 选项
|
||||
|
||||
**PDF 质量** 控制将图片嵌入 PDF 时应用的图片压缩:
|
||||
|
||||
- **高质量**:压缩最少,文件较大。最适合打印或归档。
|
||||
- **中等质量**(默认):均衡压缩。适合大多数用途。
|
||||
- **低质量**:激进压缩,文件最小。适合邮件发送或快速分享。
|
||||
|
||||
HEIC 和 WebP 文件在嵌入前会自动转换为 PNG。这一过程是透明的,无需任何额外操作。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将手机相机拍摄的扫描收据或文档合并为一个 PDF
|
||||
- 用多种格式的图片制作摄影作品集或产品画册
|
||||
- 无需安装桌面软件,即可将 iPhone 照片 (HEIC) 转换为可分享的 PDF
|
||||
- 将 PSD 导出文件和截图汇总为交付给客户的设计稿
|
||||
- 将一个文件夹中的旧版图片格式 (PNM、JXR、JP2) 归档为单个 PDF
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 图片在 PDF 中的顺序与它们在文件列表中的顺序一致。请按您想要的顺序上传。
|
||||
- 若要获得尽可能小的文件,请选择低质量。对于以文字为主的扫描件,视觉差异通常可以忽略。
|
||||
- 如果您只有一种图片格式,专用转换器(JPG 转 PDF、PNG 转 PDF 等)能以更简单的界面得到相同的结果。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [JPG 转 PDF](./jpg-to-pdf)
|
||||
- [PNG 转 PDF](./png-to-pdf)
|
||||
- [HEIC 转 PDF](./heic-to-pdf)
|
||||
- [WebP 转 PDF](./webp-to-pdf)
|
||||
@@ -0,0 +1,183 @@
|
||||
# 工具参考
|
||||
|
||||
BentoPDF 提供 **130 多种工具** 来处理 PDF。所有工具完全在您的浏览器中运行,您的文件永远不会离开您的设备。
|
||||
|
||||
---
|
||||
|
||||
## 编辑与批注
|
||||
|
||||
使用一整套编辑工具修改、标记和增强您的 PDF 文档。
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**PDF 编辑器**](./edit-pdf):批注、高亮、涂黑、评论、添加形状和图片、搜索和查看 PDF。
|
||||
- [**编辑书签**](./bookmark):添加、编辑、导入、删除和提取 PDF 书签。
|
||||
- [**目录**](./table-of-contents):根据 PDF 书签生成目录页。
|
||||
- [**页码**](./page-numbers):在文档中插入页码。
|
||||
- [**添加页面标签**](./add-page-labels):应用带有罗马数字、前缀和自定义起始值的 PDF 页面标签。
|
||||
- [**Bates 编号**](./bates-numbering):在一个或多个 PDF 文件中添加连续的 Bates 编号。
|
||||
- [**添加水印**](./add-watermark):在 PDF 页面上叠加文字或图片。
|
||||
- [**页眉和页脚**](./header-footer):在页面顶部和底部添加文本。
|
||||
- [**反转颜色**](./invert-colors):创建 PDF 的深色模式版本。
|
||||
- [**扫描效果**](./scanner-effect):让您的 PDF 看起来像扫描文档。
|
||||
- [**调整颜色**](./adjust-colors):微调亮度、对比度、饱和度等。
|
||||
- [**背景颜色**](./background-color):更改 PDF 的背景颜色。
|
||||
- [**更改文字颜色**](./text-color):更改 PDF 中文字的颜色。
|
||||
- [**签署 PDF**](./sign-pdf):绘制、输入或上传您的签名。
|
||||
- [**添加图章**](./add-stamps):使用批注工具栏为 PDF 添加图片图章。
|
||||
- [**移除批注**](./remove-annotations):清除评论、高亮和链接。
|
||||
- [**裁剪 PDF**](./crop-pdf):裁掉 PDF 中每一页的边距。
|
||||
- [**PDF 表单填写**](./form-filler):直接在浏览器中填写表单。也支持 XFA 表单。
|
||||
- [**创建 PDF 表单**](./form-creator):通过拖放文本字段创建可填写的 PDF 表单。
|
||||
- [**移除空白页**](./remove-blank-pages):自动检测并删除空白页。
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 转换为 PDF
|
||||
|
||||
将图片、文档、电子书和其他文件格式转换为 PDF。
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**图片转 PDF**](./image-to-pdf):将 JPG、PNG、BMP、GIF、TIFF、SVG、HEIC、WebP 等转换为 PDF。
|
||||
- [**JPG 转 PDF**](./jpg-to-pdf):用一张或多张 JPG 图片创建 PDF。
|
||||
- [**PNG 转 PDF**](./png-to-pdf):用一张或多张 PNG 图片创建 PDF。
|
||||
- [**WebP 转 PDF**](./webp-to-pdf):用一张或多张 WebP 图片创建 PDF。
|
||||
- [**SVG 转 PDF**](./svg-to-pdf):用一张或多张 SVG 图片创建 PDF。
|
||||
- [**BMP 转 PDF**](./bmp-to-pdf):用一张或多张 BMP 图片创建 PDF。
|
||||
- [**HEIC 转 PDF**](./heic-to-pdf):用一张或多张 HEIC 图片创建 PDF。
|
||||
- [**TIFF 转 PDF**](./tiff-to-pdf):用一张或多张 TIFF 图片创建 PDF。
|
||||
- [**文本转 PDF**](./txt-to-pdf):将纯文本文件转换为 PDF。
|
||||
- [**Markdown 转 PDF**](./markdown-to-pdf):将 Markdown 转换为 PDF,支持实时预览和语法高亮。
|
||||
- [**JSON 转 PDF**](./json-to-pdf):将 JSON 文件转换为 PDF 格式。
|
||||
- [**ODT 转 PDF**](./odt-to-pdf):将 ODT (OpenDocument Text) 文件转换为 PDF。
|
||||
- [**CSV 转 PDF**](./csv-to-pdf):将 CSV 电子表格转换为 PDF。
|
||||
- [**RTF 转 PDF**](./rtf-to-pdf):将 RTF (Rich Text Format) 文档转换为 PDF。
|
||||
- [**Word 转 PDF**](./word-to-pdf):将 Word 文档 (DOCX、DOC、ODT) 转换为 PDF。
|
||||
- [**Excel 转 PDF**](./excel-to-pdf):将 Excel 电子表格 (XLSX、XLS、ODS) 转换为 PDF。
|
||||
- [**PowerPoint 转 PDF**](./powerpoint-to-pdf):将 PowerPoint 演示文稿 (PPTX、PPT、ODP) 转换为 PDF。
|
||||
- [**XPS 转 PDF**](./xps-to-pdf):将 XPS/OXPS 文档转换为 PDF。
|
||||
- [**MOBI 转 PDF**](./mobi-to-pdf):将 MOBI 电子书转换为 PDF。
|
||||
- [**EPUB 转 PDF**](./epub-to-pdf):将 EPUB 电子书转换为 PDF。
|
||||
- [**FB2 转 PDF**](./fb2-to-pdf):将 FictionBook (FB2) 电子书转换为 PDF。
|
||||
- [**CBZ 转 PDF**](./cbz-to-pdf):将漫画压缩包 (CBZ/CBR) 转换为 PDF。
|
||||
- [**WPD 转 PDF**](./wpd-to-pdf):将 WordPerfect 文档 (WPD) 转换为 PDF。
|
||||
- [**WPS 转 PDF**](./wps-to-pdf):将 WPS Office 文档转换为 PDF。
|
||||
- [**XML 转 PDF**](./xml-to-pdf):将 XML 文档转换为 PDF。
|
||||
- [**ODG 转 PDF**](./odg-to-pdf):将 OpenDocument Graphics (ODG) 转换为 PDF。
|
||||
- [**ODS 转 PDF**](./ods-to-pdf):将 OpenDocument Spreadsheet (ODS) 转换为 PDF。
|
||||
- [**ODP 转 PDF**](./odp-to-pdf):将 OpenDocument Presentation (ODP) 转换为 PDF。
|
||||
- [**PUB 转 PDF**](./pub-to-pdf):将 Microsoft Publisher (PUB) 转换为 PDF。
|
||||
- [**VSD 转 PDF**](./vsd-to-pdf):将 Microsoft Visio (VSD、VSDX) 转换为 PDF。
|
||||
- [**PSD 转 PDF**](./psd-to-pdf):将 Adobe Photoshop (PSD) 文件转换为 PDF。
|
||||
- [**邮件转 PDF**](./email-to-pdf):将邮件文件 (EML、MSG) 转换为 PDF 格式。
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 从 PDF 转换
|
||||
|
||||
将 PDF 中的内容提取为图片、文档和数据格式。
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**PDF 转 JPG**](./pdf-to-jpg):将每个 PDF 页面转换为 JPG 图片。
|
||||
- [**PDF 转 PNG**](./pdf-to-png):将每个 PDF 页面转换为 PNG 图片。
|
||||
- [**PDF 转 WebP**](./pdf-to-webp):将每个 PDF 页面转换为 WebP 图片。
|
||||
- [**PDF 转 BMP**](./pdf-to-bmp):将每个 PDF 页面转换为 BMP 图片。
|
||||
- [**PDF 转 TIFF**](./pdf-to-tiff):将每个 PDF 页面转换为 TIFF 图片。
|
||||
- [**PDF 转 CBZ**](./pdf-to-cbz):将 PDF 转换为 CBZ(漫画压缩包),适用于漫画阅读器和 Calibre。
|
||||
- [**PDF 转 SVG**](./pdf-to-svg):将每个 PDF 页面转换为可缩放矢量图形。
|
||||
- [**PDF 转 CSV**](./pdf-to-csv):从 PDF 中提取表格并转换为 CSV 格式。
|
||||
- [**PDF 转 Excel**](./pdf-to-excel):从 PDF 中提取表格并转换为 Excel (XLSX)。
|
||||
- [**PDF 转灰度**](./pdf-to-greyscale):将所有颜色转换为黑白。
|
||||
- [**PDF 转 JSON**](./pdf-to-json):将 PDF 文件转换为 JSON 格式。
|
||||
- [**PDF 转 Word**](./pdf-to-word):将 PDF 文件转换为可编辑的 Word 文档。
|
||||
- [**提取图片**](./extract-images):从 PDF 文件中提取所有嵌入的图片。
|
||||
- [**PDF 转 Markdown**](./pdf-to-markdown):将 PDF 文本和表格转换为 Markdown 格式。
|
||||
- [**为 AI 准备 PDF**](./prepare-pdf-for-ai):将 PDF 内容提取为 LlamaIndex JSON,用于 RAG/LLM 流程。
|
||||
- [**PDF 转文本**](./pdf-to-text):从 PDF 文件中提取文本并保存为纯文本。
|
||||
- [**提取表格**](./extract-tables):将 PDF 中的表格提取为 CSV、JSON 或 Markdown。
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 整理与管理
|
||||
|
||||
重新排列、合并、拆分和管理您的 PDF 页面和文件。
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**PDF 工作流构建器**](./pdf-workflow):使用可视化节点编辑器构建自定义 PDF 处理流水线。
|
||||
- [**PDF 多功能工具**](./pdf-multi-tool):功能齐全的 PDF 编辑器,支持页面管理。
|
||||
- [**OCR PDF**](./ocr-pdf):让 PDF 可搜索、可复制。
|
||||
- [**合并 PDF**](./merge-pdf):将多个 PDF 合并为一个文件。
|
||||
- [**交替混合页面**](./alternate-merge):通过交替取每个 PDF 的页面来合并 PDF。
|
||||
- [**双面整理**](./duplex-collate):将正反面扫描块重新排列为正确的页面顺序。
|
||||
- [**整理和复制页面**](./organize-pdf):复制、重新排序和删除页面。
|
||||
- [**添加附件**](./add-attachments):将一个或多个文件嵌入您的 PDF。
|
||||
- [**提取附件**](./extract-attachments):将 PDF 中所有嵌入的文件提取为 ZIP。
|
||||
- [**编辑附件**](./edit-attachments):查看或移除 PDF 中的附件。
|
||||
- [**PDF 图层 (OCG)**](./pdf-layers):查看、切换、添加和删除 PDF 中的 OCG 图层。
|
||||
- [**分割 PDF**](./split-pdf):将一段页面范围提取为新的 PDF。
|
||||
- [**分割页面**](./divide-pages):水平或垂直分割页面。
|
||||
- [**提取页面**](./extract-pages):将选定的页面保存为新文件。
|
||||
- [**删除页面**](./delete-pages):从文档中移除特定页面。
|
||||
- [**添加空白页**](./add-blank-page):在 PDF 的任意位置插入一个空白页。
|
||||
- [**反转页面**](./reverse-pages):颠倒文档中所有页面的顺序。
|
||||
- [**旋转 PDF**](./rotate-pdf):以 90 度为单位旋转页面。
|
||||
- [**自定义角度旋转**](./rotate-custom):按任意自定义角度旋转页面。
|
||||
- [**N-Up PDF**](./n-up-pdf):将多个页面排列到同一张纸上。
|
||||
- [**PDF 小册子**](./pdf-booklet):重新排列页面,用于双面小册子打印。
|
||||
- [**合并为单页**](./combine-single-page):将所有页面拼接为一个连续的长页。
|
||||
- [**查看元数据**](./view-metadata):检查 PDF 的隐藏属性。
|
||||
- [**编辑元数据**](./edit-metadata):更改作者、标题和其他属性。
|
||||
- [**PDF 转 ZIP**](./pdf-to-zip):将多个 PDF 文件打包为 ZIP 压缩包。
|
||||
- [**比较 PDF**](./compare-pdfs):并排比较两个 PDF。
|
||||
- [**海报化 PDF**](./posterize-pdf):将一个大页面拆分为多个较小的页面。
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 优化与修复
|
||||
|
||||
压缩、修复和优化您的 PDF,以获得更好的性能和兼容性。
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**压缩 PDF**](./compress-pdf):减小 PDF 的文件大小。
|
||||
- [**PDF 转 PDF/A**](./pdf-to-pdfa):将 PDF 转换为 PDF/A,用于长期归档。
|
||||
- [**修正页面尺寸**](./fix-page-size):将所有页面统一为相同尺寸。
|
||||
- [**线性化 PDF**](./linearize-pdf):优化 PDF,实现快速网页查看。
|
||||
- [**页面尺寸**](./page-dimensions):分析页面尺寸、方向和单位。
|
||||
- [**移除限制**](./remove-restrictions):移除密码保护和安全限制。
|
||||
- [**修复 PDF**](./repair-pdf):从损坏或受损的 PDF 文件中恢复数据。
|
||||
- [**栅格化 PDF**](./rasterize-pdf):将 PDF 转换为基于图像的 PDF。展平图层并移除可选文本。
|
||||
- [**校正 PDF**](./deskew-pdf):使用 OpenCV 自动矫正倾斜的扫描页面。
|
||||
- [**字体转轮廓**](./font-to-outline):将所有字体转换为矢量轮廓,实现一致的渲染。
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 保护 PDF
|
||||
|
||||
保护、加密并控制对 PDF 文档的访问。
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**加密 PDF**](./protect-pdf):添加密码以锁定您的 PDF。
|
||||
- [**清理 PDF**](./sanitize-pdf):移除元数据、批注、脚本等。
|
||||
- [**解密 PDF**](./unlock-pdf):移除密码保护以解锁 PDF。
|
||||
- [**展平 PDF**](./flatten-pdf):使表单字段和批注不可编辑。
|
||||
- [**移除元数据**](./remove-metadata):清除 PDF 中的隐藏数据。
|
||||
- [**更改权限**](./change-permissions):设置或更改 PDF 的用户权限。
|
||||
- [**数字签名**](./digital-sign-pdf):使用 X.509 证书添加加密数字签名。
|
||||
- [**验证签名**](./validate-signature-pdf):验证数字签名并查看证书详情。
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 反转颜色
|
||||
description: 反转 PDF 中的所有颜色,为任何文档创建深色模式版本。
|
||||
---
|
||||
|
||||
# 反转颜色
|
||||
|
||||
将 PDF 中的每种颜色翻转为其反色。白色背景变为黑色,黑色文字变为白色,所有其他颜色则转为其互补色。这是为任何 PDF 创建“深色模式”版本的最快方法。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 点击 **反转颜色** 开始处理。
|
||||
3. 反转后的 PDF 会自动下载。
|
||||
|
||||
没有其他设置。该工具会将每一页渲染为图像,反转所有像素颜色,并将结果重新组装为新的 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 一键反转所有页面的颜色
|
||||
- 处理文档中的每一页
|
||||
- 保持原有的页面尺寸和布局
|
||||
- 适用于任何 PDF,无论内容类型(文本、图片或混合)
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为教科书或手册创建深色模式版本,方便夜间舒适阅读
|
||||
- 为无障碍需求准备高对比度版本的文档
|
||||
- 反转因曝光不当而扫描的文档
|
||||
- 为以图片为主的 PDF 生成负片版本,用于视觉分析
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 由于该工具通过栅格化页面来应用效果,输出结果是基于图像的。文本将不再可选择或可搜索。如果您在反转后需要可搜索的文本,请将输出结果交给 OCR 工具处理。
|
||||
- 如需更精细的颜色调整(亮度、对比度、饱和度),请改用 [调整颜色](./adjust-colors) 工具。
|
||||
- 页数较多的大型 PDF 可能需要更长的处理时间,因为每一页都要单独渲染和反转。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [调整颜色](./adjust-colors)
|
||||
- [背景颜色](./background-color)
|
||||
- [扫描效果](./scanner-effect)
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: JPG 转 PDF
|
||||
description: 在浏览器中将一张或多张 JPG、JPEG 和 JPEG 2000 图片转换为单个 PDF 文件。
|
||||
---
|
||||
|
||||
# JPG 转 PDF
|
||||
|
||||
将 JPG 图片变成整洁的 PDF。可以上传单个文件,也可以批量上传多张 JPG,每张图片都会成为输出文档中的一个整页。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :-------- | :-------------- |
|
||||
| JPEG | `.jpg`, `.jpeg` |
|
||||
| JPEG 2000 | `.jp2`, `.jpx` |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或将 JPG 文件拖放进来。支持多选。
|
||||
2. 查看已上传的文件。使用垃圾桶图标移除单个文件,或点击 **添加更多文件** 追加到列表。
|
||||
3. 选择 **PDF 质量** 级别。
|
||||
4. 点击 **转换为 PDF**。该工具会按照您的质量设置压缩图片,通过 PyMuPDF 引擎进行转换,并下载 `from_jpgs.pdf`。
|
||||
|
||||
## 选项
|
||||
|
||||
**PDF 质量** 用于调整图片嵌入 PDF 之前应用的压缩程度:
|
||||
|
||||
- **高质量**:保留最多细节。适用于摄影作品或打印。
|
||||
- **中等质量**(默认):在清晰度和文件大小之间取得良好平衡。
|
||||
- **低质量**:激进压缩,输出最小。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将保存为 JPG 的扫描文档转换为一份用于提交的 PDF
|
||||
- 将产品照片整理成给客户的目录
|
||||
- 将 JPEG 2000 格式的医学或卫星图像转为便携的 PDF
|
||||
- 用相机导出的照片创建可打印的相册
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 完整支持 JPEG 2000 文件(`.jp2`、`.jpx`),而不仅仅是标准 JPEG。这对医学影像和地理空间数据很有用。
|
||||
- 如果您的 JPG 来自手机相机,中等质量生成的文件通常比高质量小 40-60%,而在屏幕上看不出明显差异。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
- [PNG 转 PDF](./png-to-pdf)
|
||||
- [WebP 转 PDF](./webp-to-pdf)
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: JSON 转 PDF
|
||||
description: 从 BentoPDF 的 JSON 格式重建 PDF 文件。将 JSON 导出文件转换回原始 PDF 文档。
|
||||
---
|
||||
|
||||
# JSON 转 PDF
|
||||
|
||||
从之前由 BentoPDF 的 **PDF 转 JSON** 工具创建的 JSON 文件中重建 PDF 文档。这是一个往返转换工具:它读取 PDF 的结构化 JSON 表示,并重建原始文档。
|
||||
|
||||
::: warning
|
||||
此工具只接受由 BentoPDF 的 PDF 转 JSON 转换器生成的 JSON 文件。来自 API、数据库或其他工具的标准 JSON 文件不受支持。
|
||||
:::
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 输入 | 说明 |
|
||||
| :------ | :---------------------------------------------- |
|
||||
| `.json` | 由 BentoPDF 的 PDF 转 JSON 工具导出的 JSON 文件 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或拖放一个或多个 JSON 文件。
|
||||
2. 文件列表会显示每个已选文件及其大小。
|
||||
3. 点击 **转换为 PDF**。该工具使用 Web Worker 和 CPDF 引擎处理所有文件。
|
||||
4. 输出会下载为 `jsons-to-pdf.zip`,其中每个输入 JSON 文件对应一个 PDF。
|
||||
|
||||
转换在后台 Web Worker 中运行,因此即使处理大文件,界面也能保持响应。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。输出的 PDF 完全由 JSON 结构决定。
|
||||
|
||||
## 输出
|
||||
|
||||
转换多个 JSON 文件时,结果会以 ZIP 压缩包形式提供。每个 PDF 都以其源 JSON 文件命名(例如 `report.json` 会变为 `report.pdf`)。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从基于 JSON 的备份或归档流程中还原 PDF
|
||||
- 将 PDF 转为 JSON 进行检查,再转回 PDF
|
||||
- 在以编程方式修改 JSON 结构后重建文档
|
||||
- 通过转换回 PDF,验证 PDF 转 JSON 的导出是否捕获了全部文档内容
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 如果您需要将任意 JSON 数据(如 API 响应或配置文件)转换为格式化的 PDF,[文本转 PDF](./txt-to-pdf) 工具更合适。将 JSON 作为文本粘贴进去,它会以合适的格式渲染。
|
||||
- 此工具要求 CPDF WebAssembly 引擎可用。自托管实例需要配置 CPDF WASM 文件。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [文本转 PDF](./txt-to-pdf)
|
||||
- [Markdown 转 PDF](./markdown-to-pdf)
|
||||
- [CSV 转 PDF](./csv-to-pdf)
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: 线性化 PDF
|
||||
description: 优化 PDF 文件以支持渐进加载和快速网页查看,也称为“快速网页视图”优化。
|
||||
---
|
||||
|
||||
# 线性化 PDF
|
||||
|
||||
线性化会重新组织 PDF 的结构,使第一页无需等待整个文件下载完毕即可显示。Adobe 将此称为“快速网页视图”。如果您在网站上托管 PDF,或通过文档门户提供 PDF,线性化会让它们打开起来明显更快。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个或多个 PDF 文件。
|
||||
2. 点击 **线性化 PDF**。
|
||||
3. 下载包含所有线性化文件的 ZIP 压缩包。
|
||||
|
||||
无需任何设置。该工具使用 QPDF 的 `--linearize` 标志,在不改变视觉内容的前提下重新排列 PDF 的内部结构。
|
||||
|
||||
## 线性化的作用
|
||||
|
||||
- 重新排列 PDF 对象,使第一页的数据位于文件开头
|
||||
- 添加线性化字典和提示表,让查看器知道每一页的位置
|
||||
- 支持字节范围请求:浏览器只需获取第一页,而无需下载整个文件
|
||||
- 整理交叉引用表,以便高效地随机访问
|
||||
|
||||
## 功能
|
||||
|
||||
- 一次操作批量处理多个 PDF
|
||||
- 输出保留所有内容、字体、图片和交互元素
|
||||
- 使用 QPDF (WebAssembly) 实现可靠且符合标准的线性化
|
||||
- 结果打包为 ZIP,便于下载
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在网站上托管 PDF 报告,让用户立即看到页面
|
||||
- 在带有浏览器内查看器的 Web 应用中嵌入 PDF
|
||||
- 发布在慢速移动网络下访问的 PDF 目录或手册
|
||||
- 为支持字节范围服务的内容分发网络 (CDN) 准备文档
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 请在完成所有其他编辑之后再线性化。之后的任何修改(合并、添加页面)都会破坏线性化。
|
||||
- 与压缩 PDF 结合使用,可得到体积最小、加载最快的 PDF。
|
||||
- 线性化会让文件体积略有增加(通常不到 1%)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [压缩 PDF](./compress-pdf):线性化之前先减小文件体积
|
||||
- [修复 PDF](./repair-pdf):修复阻碍线性化的结构问题
|
||||
- [移除元数据](./remove-metadata):在线发布前清除元数据
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
title: Markdown 转 PDF
|
||||
description: 编写或粘贴 Markdown,并导出为排版精美的 PDF,支持实时预览和语法高亮。
|
||||
---
|
||||
|
||||
# Markdown 转 PDF
|
||||
|
||||
功能齐全的 Markdown 编辑器,带有实时预览和一键导出 PDF。您可以从零开始编写、上传现有的 `.md` 文件,或从剪贴板粘贴内容。编辑器会实时渲染您的 Markdown,并使用浏览器内置的打印引擎导出带样式的 PDF。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 输入 | 说明 |
|
||||
| :--------- | :------------------- |
|
||||
| `.md` 文件 | 通过上传按钮上传 |
|
||||
| 直接输入 | 在编辑器中输入或粘贴 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 打开 Markdown 转 PDF 工具。编辑器以分栏视图加载:左侧是 Markdown 源码,右侧是渲染后的预览。
|
||||
2. 编写您的 Markdown、粘贴内容,或点击 **上传** 加载 `.md` 文件。
|
||||
3. 使用工具栏中的主题滑块在浅色和深色主题之间切换。
|
||||
4. 点击 **导出 PDF**(或按 `Ctrl/Cmd + S`),通过浏览器的打印对话框生成 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
除基础语法外,编辑器还支持大量 Markdown 功能:
|
||||
|
||||
- **标准 Markdown**:标题、粗体、斜体、链接、图片、列表、引用块、分隔线
|
||||
- **代码块**,支持 15 种以上语言的语法高亮(JavaScript、TypeScript、Python、Go、Rust、SQL、Java、C#、C++、YAML、Bash 等)
|
||||
- **Mermaid 图表**:流程图、时序图、ER 图和其他 Mermaid 图表类型可直接在预览中渲染
|
||||
- **表格**,使用标准 Markdown 表格语法
|
||||
- **任务列表**,带复选框
|
||||
- **脚注**、**下标**、**上标**
|
||||
- **定义列表**、**缩写**
|
||||
- **表情符号** 支持(`:smile:` 会渲染为表情符号)
|
||||
- **高亮**(`==marked text==`)和 **插入**(`++inserted text++`)
|
||||
- **自动链接 URL**:纯 URL 会被转换为可点击的链接
|
||||
- **目录** 生成
|
||||
- 标题上的 **锚点链接**
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 编写项目文档,并为相关方导出精美的 PDF
|
||||
- 创建包含代码示例和 Mermaid 架构图的技术报告
|
||||
- 将 GitHub README 转换为 PDF,以便离线使用或打印
|
||||
- 使用任务列表和表格起草提案或规格说明
|
||||
- 根据用 Markdown 写成的课堂笔记生成带样式的讲义
|
||||
|
||||
## 小贴士
|
||||
|
||||
- PDF 输出使用浏览器的打印为 PDF 功能。在 Chrome 中,您可以在保存前于打印对话框中自定义页边距和缩放。
|
||||
- Mermaid 图表会在预览中渲染,但首次使用时可能需要稍等片刻进行初始化。
|
||||
- 使用 `Ctrl/Cmd + S` 键盘快捷键即可导出,无需去点按钮。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [文本转 PDF](./txt-to-pdf)
|
||||
- [Word 转 PDF](./word-to-pdf)
|
||||
- [JSON 转 PDF](./json-to-pdf)
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: 合并 PDF
|
||||
description: 将多个 PDF 文件合并为一个文档,支持拖放排序和页面级控制。
|
||||
---
|
||||
|
||||
# 合并 PDF
|
||||
|
||||
将多个 PDF 文件合并为一个文档。您可以按指定顺序合并整个文件,也可以切换到页面模式,对每个上传 PDF 中的单个页面进行精细控制。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖入,上传两个或更多 PDF 文件。
|
||||
2. 使用顶部的切换开关在 **文件模式** 和 **页面模式** 之间选择。
|
||||
3. 在文件模式下,拖动文件重新排序,并可为每个文件指定页面范围(例如 `1-3, 5`)。范围留空则包含所有页面。
|
||||
4. 在页面模式下,拖放单个页面缩略图来构建您想要的页面顺序。
|
||||
5. 点击 **合并 PDF**,将所有内容合并为一个文件。合并后的 PDF 会自动下载。
|
||||
|
||||
## 功能
|
||||
|
||||
- 两种合并模式:文件模式用于快速合并整个文件,页面模式用于逐页控制
|
||||
- 两种模式都支持拖放排序,动画流畅
|
||||
- 页面范围语法(例如 `1-3, 5, 8-10`)让您无需切换到页面模式即可挑选页面
|
||||
- 页面缩略图懒加载,即使处理大型文档,界面也保持响应
|
||||
- 文件数量和总页数均无限制
|
||||
- 保留原始 PDF 质量,不会重新编码
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 说明 |
|
||||
| -------------- | ------------------------------------------------------------ |
|
||||
| **文件模式** | 按自定义顺序合并整个文件,可为每个文件设置页面范围过滤 |
|
||||
| **页面模式** | 以网格形式显示所有文件的所有页面,拖动缩略图构建您想要的顺序 |
|
||||
| **页面输入框** | 每个文件的文本字段,接受类似 `1-3, 5` 的范围,只包含特定页面 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将各章节的 PDF 合并为一本书或一份报告
|
||||
- 将求职信和简历合并为一份申请文档
|
||||
- 从多个源文档中提取特定页面,汇总为一个文件
|
||||
- 将扫描的收据或发票整理为一个归档 PDF
|
||||
- 用多份幻灯片中的页面制作演示文稿讲义
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 当您需要将不同文件的页面交错排列,而不是一个文件接着一个文件追加时,请使用页面模式。
|
||||
- 初次上传后,您可以使用 **添加更多文件** 按钮继续添加文件,而不会丢失当前的排列。
|
||||
- 页码从 1 开始,因此 `1` 指该文件的第一页。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [分割 PDF](./split-pdf)
|
||||
- [整理和复制页面](./organize-pdf)
|
||||
- [交替混合页面](./alternate-merge)
|
||||
- [删除页面](./delete-pages)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: MOBI 转 PDF
|
||||
description: 在浏览器中直接将 MOBI 电子书文件转换为 PDF。免费、私密,无需上传文件。
|
||||
---
|
||||
|
||||
# MOBI 转 PDF
|
||||
|
||||
将亚马逊 Kindle 的 MOBI 电子书转换为 PDF 文档。MOBI 文件与 Kindle 设备和应用绑定,难以在其他地方阅读。转换为 PDF 后,您就得到一个可在任何设备上打开或打印的便携版本。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 备注 |
|
||||
| :--- | :------ | :----------------------------- |
|
||||
| MOBI | `.mobi` | Kindle 电子书格式 (Mobipocket) |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或拖放一个或多个 MOBI 文件。
|
||||
2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或使用 **添加更多文件** 加入更多电子书。
|
||||
3. 点击 **转换为 PDF**。PyMuPDF 引擎会解析 MOBI 结构,并将每一页渲染为 PDF 内容。
|
||||
4. 单个文件会下载为 PDF。转换多个文件时,您会得到名为 `mobi-converted.zip` 的 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
无需额外设置。转换会保留原始 MOBI 文件中的文本内容、格式和嵌入的图片。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在只支持 PDF 的非 Kindle 电子阅读器上阅读在 Kindle 购买的内容
|
||||
- 打印电子书中的章节,用于离线学习或批注
|
||||
- 将个人电子书库归档为通用格式
|
||||
- 与没有安装 Kindle 应用的人分享摘录
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 受 DRM 保护的 MOBI 文件无法转换。该工具只适用于无 DRM 的 MOBI 文件。
|
||||
- 带有大量嵌入图片的大型电子书可能需要多花几秒钟,因为所有处理都在浏览器中进行。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [EPUB 转 PDF](./epub-to-pdf)
|
||||
- [FB2 转 PDF](./fb2-to-pdf)
|
||||
- [CBZ 转 PDF](./cbz-to-pdf)
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: N-Up PDF
|
||||
description: 将多个 PDF 页面按网格布局排列到同一张纸上,便于紧凑打印。
|
||||
---
|
||||
|
||||
# N-Up PDF
|
||||
|
||||
将多个页面按网格排列到同一张纸上。每张纸可容纳 2、4、6、8、9 或 16 页,从而减少打印的页数。该工具会处理缩放、定位和可选的页面尺寸配置。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个 PDF 文件。
|
||||
2. 选择每张纸上的页数(即“N”值):2、4、6、8、9 或 16。
|
||||
3. 选择输出页面尺寸(默认为 A4)和方向。
|
||||
4. 可选:配置间距、边框颜色和背景颜色。
|
||||
5. 点击处理按钮。该工具会缩放每一页,并将它们平铺到新的纸张上。
|
||||
|
||||
## 功能
|
||||
|
||||
- 网格布局:2 合 1、4 合 1、6 合 1、8 合 1、9 合 1 和 16 合 1
|
||||
- 可配置的输出页面尺寸和方向
|
||||
- 平铺页面之间可选的间距
|
||||
- 背景和边框颜色设置
|
||||
- 缩放以适应时保持原始页面的宽高比
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 说明 |
|
||||
| ------------ | ------------------------------------------------- |
|
||||
| **每张页数** | 每个输出页面上容纳的原始页数(2、4、6、8、9、16) |
|
||||
| **页面尺寸** | 输出纸张的尺寸(A4、Letter、Legal 等) |
|
||||
| **方向** | 输出纸张为纵向或横向 |
|
||||
| **间距** | 平铺页面之间的间隙,单位为磅 |
|
||||
| **背景颜色** | 输出纸张背景的填充颜色 |
|
||||
| **边框颜色** | 每个平铺页面周围边框的颜色 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 打印每页 4 张幻灯片的讲义以节省纸张
|
||||
- 创建在一张纸上放置多页参考资料的学习资料
|
||||
- 制作紧凑的文档归档以便存档
|
||||
- 为长文档生成缩略图概览页
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 对于 2 合 1 布局,横向通常效果更好,而 4 合 1 及以上的布局通常最适合纵向。
|
||||
- 增加间距有助于提高可读性,但会减少每个平铺页面的可用区域。
|
||||
- 若要执行相反的操作(将一页拆分为多页),请参阅 [海报化 PDF](./posterize-pdf)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [海报化 PDF](./posterize-pdf)
|
||||
- [PDF 小册子](./pdf-booklet)
|
||||
- [合并为单页](./combine-single-page)
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: OCR PDF
|
||||
description: 使用 Tesseract OCR 让扫描版 PDF 可搜索、可复制,支持多语言和字符过滤。
|
||||
---
|
||||
|
||||
# OCR PDF
|
||||
|
||||
将扫描文档变成可搜索、可复制的 PDF。该工具使用 Tesseract OCR 识别图像中的文字,并在原始页面上叠加一层不可见的文本层,在保留视觉外观的同时,让内容完全可搜索。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传扫描版 PDF 或基于图像的 PDF 文件。
|
||||
2. 从可搜索的语言列表中选择文档中出现的一种或多种语言。
|
||||
3. 可选:调整高级设置(分辨率、二值化、白名单)。
|
||||
4. 点击 **开始 OCR**,并通过实时进度条监控进度。
|
||||
5. 完成后,查看提取的文本,然后下载可搜索的 PDF 或纯文本 `.txt` 文件。
|
||||
|
||||
## 功能
|
||||
|
||||
- 多语言 OCR,带可搜索的语言选择器
|
||||
- 不可见的文本层保留原始文档外观
|
||||
- 处理期间显示实时进度条和日志输出
|
||||
- 可将结果下载为可搜索的 PDF 或纯文本文件
|
||||
- 可直接将提取的文本复制到剪贴板
|
||||
- 三档分辨率,在速度和准确度之间取得平衡
|
||||
|
||||
## 选项
|
||||
|
||||
| 设置 | 取值 | 默认值 | 用途 |
|
||||
| ------------------ | ------------------------------------------------------------- | ------ | ---------------------------------------------- |
|
||||
| **分辨率** | 标准 (192 DPI)、高 (288 DPI)、超高 (384 DPI) | 高 | 更高的分辨率可提高小字的准确度,但耗时更长 |
|
||||
| **二值化图像** | 开 / 关 | 关 | 通过转换为黑白来增强清晰扫描件的对比度 |
|
||||
| **字符白名单预设** | 无、字母数字、数字 + 货币、仅字母、仅数字、发票、表单、自定义 | 无 | 限制识别的字符范围,以提高特定类型文档的准确度 |
|
||||
| **字符白名单** | 自由文本 | 空 | 当预设设为自定义时,手动指定字符集 |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 让扫描的合同和发票可搜索,这样您就可以用 Ctrl+F 查找内容
|
||||
- 从拍摄的文档或旧纸质记录中提取文本
|
||||
- 使用发票预设处理收据,准确识别金额和日期
|
||||
- 为满足合规要求,将仅含图像的扫描件制作为无障碍 PDF
|
||||
- 批量提取扫描书籍或手册中的文本内容
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 如果文档包含多种语言的内容(例如英文标题搭配日文正文),请选择多种语言。
|
||||
- 对于文字褪色或对比度低的文档,请使用二值化选项,它可以显著提高识别准确度。
|
||||
- 发票和表单白名单预设会忽略不相关的字符形状,从而大幅减少结构化文档上的误识别。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [提取表格](./extract-tables)
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [压缩 PDF](./compress-pdf)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: ODG 转 PDF
|
||||
description: 在浏览器中将 LibreOffice Draw (ODG) 文件转换为 PDF。免费、无需上传、完全私密。
|
||||
---
|
||||
|
||||
# ODG 转 PDF
|
||||
|
||||
将 OpenDocument Graphics 文件转换为 PDF。ODG 是 LibreOffice Draw 的原生格式,用于图表、流程图和矢量插图。转换为 PDF 后,这些绘图更便于分享、打印和嵌入其他文档。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 备注 |
|
||||
| :-------------------- | :----- | :-------------------------------------- |
|
||||
| OpenDocument Graphics | `.odg` | LibreOffice Draw / OpenOffice Draw 文件 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或将 ODG 文件拖放进来。可以一次添加多个文件。
|
||||
2. 查看文件列表。使用垃圾桶图标移除单个条目,或点击 **添加更多文件** 添加更多绘图。
|
||||
3. 点击 **转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载并转换每个 ODG 文件,同时保留矢量图形、形状和文字。
|
||||
4. 单个文件会直接下载为 PDF。多个文件会生成名为 `odg-to-pdf.zip` 的 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
无需额外设置。转换会保留 ODG 源文件中原有的页面尺寸、形状、连接线和文本框。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 与没有安装 LibreOffice 的客户分享 LibreOffice Draw 图表
|
||||
- 打印在 Draw 中创建的流程图和网络图
|
||||
- 将 ODG 插图作为嵌入的 PDF 加入报告或演示文稿
|
||||
- 将技术图纸归档为数十年后仍可读取的格式
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 矢量元素在 PDF 输出中仍保持矢量,因此结果可以清晰地缩放到任何打印尺寸。
|
||||
- LibreOffice 引擎在首次使用时需要一点时间初始化。在同一会话中,之后的转换会更快。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [ODS 转 PDF](./ods-to-pdf)
|
||||
- [ODP 转 PDF](./odp-to-pdf)
|
||||
- [VSD 转 PDF](./vsd-to-pdf)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: ODP 转 PDF
|
||||
description: 在浏览器中将 LibreOffice Impress (ODP) 演示文稿转换为 PDF。免费、私密,无需上传。
|
||||
---
|
||||
|
||||
# ODP 转 PDF
|
||||
|
||||
将 OpenDocument Presentation 文件转换为 PDF。ODP 是 LibreOffice Impress 的原生格式,也是 Google Slides 的标准导出格式。将演示文稿转为 PDF 后,任何人都无需演示软件即可查看,幻灯片也能整洁地打印。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 备注 |
|
||||
| :------------------------ | :----- | :--------------------------------------- |
|
||||
| OpenDocument Presentation | `.odp` | LibreOffice Impress / Google Slides 导出 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或将 ODP 文件拖放进来。可以一次选择多个演示文稿。
|
||||
2. 查看文件列表。使用垃圾桶图标移除条目,或使用 **添加更多文件** 加入更多演示文稿。
|
||||
3. 点击 **转换为 PDF**。基于 LibreOffice 的引擎会处理每个演示文稿,并生成每张幻灯片对应一页的 PDF。
|
||||
4. 单个文件会下载为 PDF。多个文件会打包在名为 `odp-to-pdf.zip` 的 ZIP 压缩包中。
|
||||
|
||||
## 选项
|
||||
|
||||
无需配置。每张幻灯片都按原始尺寸渲染,并保留文字、图片、形状和幻灯片背景。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将演示文稿作为讲义 PDF 分发给听众
|
||||
- 与更喜欢 PDF 而非 ODP 的人分享 Google Slides 导出文件
|
||||
- 将会议演讲和讲座以只读格式归档
|
||||
- 为线下工作坊打印幻灯片
|
||||
|
||||
## 小贴士
|
||||
|
||||
- 幻灯片切换和动画属于仅限视觉的功能,不会带入 PDF,但所有静态内容都能正确渲染。
|
||||
- 演讲者备注不会包含在 PDF 输出中。如果您需要备注,请从演示软件中单独导出。
|
||||
- 与其他基于 LibreOffice 的工具一样,引擎在首次使用时加载,并在会话期间保持缓存。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [ODG 转 PDF](./odg-to-pdf)
|
||||
- [ODS 转 PDF](./ods-to-pdf)
|
||||
- [PUB 转 PDF](./pub-to-pdf)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: ODS 转 PDF
|
||||
description: 在浏览器中将 LibreOffice Calc (ODS) 电子表格转换为 PDF。免费、私密、无需注册。
|
||||
---
|
||||
|
||||
# ODS 转 PDF
|
||||
|
||||
将 OpenDocument 电子表格文件转换为 PDF。ODS 是 LibreOffice Calc 的原生格式,也是 Google Sheets 常见的导出格式。此工具会把电子表格的数据、格式和图表渲染为分页 PDF,方便打印或分享。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 备注 |
|
||||
| :-------------------- | :----- | :------------------------------------ |
|
||||
| OpenDocument 电子表格 | `.ods` | LibreOffice Calc / Google Sheets 导出 |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或拖放 ODS 文件,支持多个文件。
|
||||
2. 查看文件列表。使用垃圾桶图标移除文件,或点击 **添加更多文件** 扩充批次。
|
||||
3. 点击 **转换为 PDF**。基于 LibreOffice 的引擎会在浏览器中加载,并将每个电子表格渲染为 PDF 页面。
|
||||
4. 单个电子表格会直接下载为 PDF。多个文件会打包为 `ods-to-pdf.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
无需任何配置。转换器会将电子表格现有的打印布局、单元格格式和列宽应用到 PDF 输出中。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 LibreOffice Calc 的预算或报告分享给只接受 PDF 的人
|
||||
- 打印以 ODS 格式下载的 Google Sheets 导出文件
|
||||
- 以不可编辑的格式归档财务记录
|
||||
- 以固定版式文档的形式提交基于 ODS 的表单或工时表
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 如果电子表格包含多个工作表,所有工作表都会包含在 PDF 输出中。
|
||||
- 非常宽的电子表格可能会在水平方向跨越多个 PDF 页面。如果版面很重要,建议在转换前先调整源文件中的列宽。
|
||||
- LibreOffice 引擎在首次使用时初始化。同一会话中后续的转换会更快。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [ODG 转 PDF](./odg-to-pdf)
|
||||
- [ODP 转 PDF](./odp-to-pdf)
|
||||
- [XML 转 PDF](./xml-to-pdf)
|
||||
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: ODT 转 PDF
|
||||
description: 使用 LibreOffice 驱动的引擎,在浏览器中将 OpenDocument 文本 (ODT) 文件转换为 PDF 格式。
|
||||
---
|
||||
|
||||
# ODT 转 PDF
|
||||
|
||||
将 OpenDocument 文本文件转换为 PDF。ODT 是 LibreOffice Writer、Apache OpenOffice 和其他开源文字处理软件的原生格式。此工具使用浏览器中的 LibreOffice 引擎,生成保留格式、表格、图片和样式的精确转换结果。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :---------------- | :----- |
|
||||
| OpenDocument 文本 | `.odt` |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或拖放一个或多个 ODT 文件。
|
||||
2. 查看文件列表。可添加更多文件或移除不需要的文件。
|
||||
3. 点击 **转换为 PDF**。LibreOffice 引擎会先初始化(进度指示器显示加载状态),然后转换每个文件。
|
||||
4. 单个文件会直接下载为 PDF。多个文件会打包为 `odt-converted.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有额外配置。转换会尽可能保留原始文档的格式。
|
||||
|
||||
## 输出
|
||||
|
||||
| 输入数量 | 输出 |
|
||||
| :------- | :------------------------------------------------------ |
|
||||
| 1 个文件 | 下载单个 PDF(例如 `document.pdf`) |
|
||||
| 2 个以上 | ZIP 压缩包(`odt-converted.zip`),每个文件对应一个 PDF |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 LibreOffice Writer 文档转换为 PDF,以便分享给 Microsoft Office 用户
|
||||
- 从用 OpenDocument 格式撰写的学术论文生成可直接打印的 PDF
|
||||
- 批量将一批 ODT 模板转换为 PDF 用于分发
|
||||
- 从自动文档生成系统创建的 ODT 文件生成 PDF
|
||||
|
||||
## 小技巧
|
||||
|
||||
- LibreOffice 引擎在首次使用时加载,并会缓存以供后续转换使用。首次加载需要几秒钟,之后转换会很快。
|
||||
- 包含嵌入式 OLE 对象或特殊字体的复杂文档,渲染效果可能与桌面版 LibreOffice 略有不同。批量转换前请先用样本测试。
|
||||
- 对于 Word 文档(`.doc`、`.docx`),请改用 [Word 转 PDF](./word-to-pdf) 工具,它同样使用 LibreOffice 引擎,但可直接接受 Microsoft 格式。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [Word 转 PDF](./word-to-pdf)
|
||||
- [RTF 转 PDF](./rtf-to-pdf)
|
||||
- [文本转 PDF](./txt-to-pdf)
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: 复制与组织
|
||||
description: 通过拖放缩略图和自定义页面顺序输入,对 PDF 页面重新排序、复制和删除。
|
||||
---
|
||||
|
||||
# 复制与组织
|
||||
|
||||
通过可视化的拖放界面,对 PDF 的页面进行重新排列、复制和删除。每个页面都以缩略图显示,您可以在保存为新文件之前移动、克隆或删除它们。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传单个 PDF 文件。
|
||||
2. 工具会渲染显示所有页面的缩略图网格。
|
||||
3. 拖动缩略图以重新排序页面,点击绿色复制按钮克隆页面,或点击红色删除按钮移除页面。
|
||||
4. 或者,在文本框中输入自定义页面顺序(例如 `3, 1, 2, 4`),然后点击 **应用** 一次性重新排列所有页面。
|
||||
5. 点击处理按钮,生成并下载重新组织后的 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 带动画过渡的拖放页面重新排序
|
||||
- 每个页面都有复制和删除按钮
|
||||
- 自定义页面顺序输入,实现精确排列
|
||||
- 页码标签在每次更改后自动更新
|
||||
- 防止删除最后一个剩余页面
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将报告中放错位置的页面移到正确位置
|
||||
- 复制表单页面,在一个文件中获得多份空白副本
|
||||
- 在分发文档之前移除草稿页或占位页
|
||||
- 为打印准备而反转或打乱页面顺序
|
||||
- 无需重新合并单独的文件,即可构建自定义页面序列
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 自定义页面顺序字段需要以逗号分隔的原始页码。必须恰好包含每个页面一次,不能遗漏或重复。
|
||||
- 复制页面后,两个副本引用相同的原始页面索引。对任一副本重新排序都是相互独立的。
|
||||
- 如需跨多个文件的批量操作或更高级的工作流,请考虑改用 [PDF 多功能工具](./pdf-multi-tool)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [删除页面](./delete-pages)
|
||||
- [PDF 多功能工具](./pdf-multi-tool)
|
||||
- [反转页面](./reverse-pages)
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: 页面尺寸
|
||||
description: 分析 PDF 页面尺寸、方向、宽高比和旋转。检测混合尺寸文档并将数据导出为 CSV。
|
||||
---
|
||||
|
||||
# 页面尺寸
|
||||
|
||||
一款诊断工具,会读取 PDF 中的每个页面,并报告其精确尺寸、方向、标准尺寸名称、宽高比、面积和旋转角度。适合在打印前发现混合尺寸页面,或记录收到的 PDF 的属性。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。分析会自动开始,无需点击按钮。
|
||||
2. 摘要面板会显示总页数、唯一页面尺寸的数量,以及文档是否包含混合尺寸。
|
||||
3. 浏览包含每页详细信息的完整结果表。
|
||||
4. 在点、英寸、毫米或像素之间切换显示单位。
|
||||
5. 点击 **导出为 CSV** 保存数据。
|
||||
|
||||
## 报告字段
|
||||
|
||||
| 列 | 说明 |
|
||||
| -------- | ------------------------------------- |
|
||||
| 页码 # | 连续页码 |
|
||||
| 尺寸 | 所选单位下的宽 x 高 |
|
||||
| 标准尺寸 | 匹配的名称(A4、Letter 等)或“自定义” |
|
||||
| 方向 | 纵向或横向 |
|
||||
| 宽高比 | 以小数表示的宽高比 |
|
||||
| 面积 | 所选单位平方下的页面面积 |
|
||||
| 旋转 | 页面旋转角度(度) |
|
||||
|
||||
## 功能
|
||||
|
||||
- 自动检测标准纸张尺寸(A3、A4、A5、Letter、Legal、Tabloid 等)
|
||||
- 混合尺寸文档警告,并详细列出出现了哪些尺寸以及每种尺寸使用的页数
|
||||
- 在点、英寸、毫米和像素(按 96 PPI)之间转换单位
|
||||
- 导出 CSV,可用于电子表格或文档系统
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在将文档提交给印刷店之前,确认所有页面都是 A4
|
||||
- 诊断合并后的 PDF 为何在某些页面上打印出意外的页边距
|
||||
- 为元数据记录整理大型 PDF 档案的页面布局
|
||||
- 找出需要修正的已旋转页面
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 如果摘要显示“混合尺寸”,请在打印前使用修复页面尺寸工具进行统一。
|
||||
- 旋转字段有助于识别显示正常但旋转属性非零的页面,这在某些工作流中可能引发问题。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [修复页面尺寸](./fix-page-size):发现混合尺寸后统一页面
|
||||
- [压缩 PDF](./compress-pdf):修复页面问题后优化 PDF
|
||||
- [旋转 PDF](./rotate-pdf):纠正已旋转的页面
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
title: 页码
|
||||
description: 在 PDF 页面的任意位置添加可自定义的页码,可配置字体、大小和颜色。
|
||||
---
|
||||
|
||||
# 页码
|
||||
|
||||
为 PDF 的每一页添加可见的页码。您可以选择位置、格式、字号和颜色,其余交给工具处理。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 在出现的选项面板中配置页码设置。
|
||||
3. 点击 **添加页码** 进行处理。
|
||||
4. 带页码的 PDF 会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
- **位置**:选择页码出现的位置,包括底部居中、底部左侧、底部右侧、顶部居中、顶部左侧或顶部右侧。
|
||||
- **格式**:可选简单编号(1、2、3...)或“第 X 页,共 Y 页”格式(1 / 5、2 / 5...)。
|
||||
- **字号**:设置页码文本的大小。默认为 12。
|
||||
- **颜色**:使用取色器为页码文本选择任意颜色。
|
||||
|
||||
## 功能
|
||||
|
||||
- 六种位置选项,涵盖所有角落和居中位置
|
||||
- 两种编号格式:简单顺序编号或“第 X 页,共 Y 页”
|
||||
- 可自定义字号,范围为 6 到 72 点
|
||||
- 完整的文本颜色取色器
|
||||
- 自动处理边距,无论页面大小如何都能让页码保持在安全区域内
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为需要可见页面引用的文档准备打印
|
||||
- 为由多个源文件合并而成的 PDF 添加页码
|
||||
- 在分发前为演示讲义编号
|
||||
- 为法律文件或合同添加连续编号
|
||||
|
||||
## 小技巧
|
||||
|
||||
- “第 X 页,共 Y 页”格式适用于读者需要了解总长度的文档,例如提案或报告。
|
||||
- 如果不同部分需要不同的编号样式(例如前言部分使用罗马数字),请改用 [添加页面标签](./add-page-labels) 工具。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [添加页面标签](./add-page-labels)
|
||||
- [Bates 编号](./bates-numbering)
|
||||
- [页眉和页脚](./header-footer)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 小册子
|
||||
description: 将 PDF 页面重新排列为小册子(骑马钉)顺序,用于折叠和装订成实体小册子。
|
||||
---
|
||||
|
||||
# PDF 小册子
|
||||
|
||||
将 PDF 的页面重新排列为小册子拼版顺序。双面打印并对折后,页面会呈现正确的阅读顺序。这是骑马钉小册子和独立杂志常用的版式。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 配置小册子设置:输出页面大小和方向。
|
||||
3. 点击 **生成预览**,查看页面在每张纸上的排列方式。
|
||||
4. 查看预览,其中显示每张实体纸张及其正反面的页面分配。
|
||||
5. 点击 **下载** 保存已拼版的小册子 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 自动为骑马钉装订重新排列页面
|
||||
- 可配置输出页面大小
|
||||
- 下载前可视化预览小册子布局
|
||||
- 页数为奇数时,会在需要的位置插入空白页
|
||||
- 缩放源页面以适应小册子纸张大小
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将普通 PDF 制作成可打印的小册子或独立杂志
|
||||
- 准备会议议程或活动指南用于内部打印
|
||||
- 制作折叠贺卡或小型目录
|
||||
- 制作用于手工装订的小诗集
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 源 PDF 的页数最好是 4 的倍数,这样小册子更整齐。如果不是,会自动添加空白页来补满最后一张纸。
|
||||
- 在打印机上选择“短边翻转”进行双面打印,然后将所有纸张一起对折,并在书脊处装订。
|
||||
- 如果只是将多个页面放在一张纸上而不需要小册子排序,请改用 [N-Up PDF](./n-up-pdf)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [N-Up PDF](./n-up-pdf)
|
||||
- [旋转 PDF](./rotate-pdf)
|
||||
- [添加空白页](./add-blank-page)
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: PDF 图层 (OCG)
|
||||
description: 查看、切换、添加和删除 PDF 文档中的可选内容组 (OCG) 图层。
|
||||
---
|
||||
|
||||
# PDF 图层 (OCG)
|
||||
|
||||
管理 PDF 中的可选内容组 (OCG),通常称为“图层”。您可以切换图层可见性、添加新图层(包括嵌套的子图层)、删除图层,并保存修改后的 PDF。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 点击处理按钮,使用 PyMuPDF 引擎加载文档。
|
||||
3. 工具会显示所有现有图层及其可见状态、锁定状态和嵌套层级。
|
||||
4. 勾选或取消勾选复选框以显示或隐藏图层。锁定的图层无法切换。
|
||||
5. 输入名称并点击添加按钮来添加新的顶级图层,或在现有父图层下添加子图层。
|
||||
6. 删除不再需要的图层。
|
||||
7. 点击 **保存**,下载应用了图层更改的修改后 PDF。
|
||||
|
||||
## 功能
|
||||
|
||||
- 以适当的缩进显示图层层级和嵌套图层
|
||||
- 切换图层可见性的开或关
|
||||
- 锁定图层标识可防止意外更改
|
||||
- 使用自定义名称添加顶级或子图层
|
||||
- 删除单个图层
|
||||
- 将所有更改保存到新的 PDF 文件中
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 切换建筑或工程图纸中标注图层的可见性
|
||||
- 为多图层设计文档添加新的注释图层
|
||||
- 在分发模板之前移除过时的图层
|
||||
- 检查从第三方收到的复杂 PDF 中包含哪些图层
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 如果 PDF 没有图层,工具会显示空状态并提示添加图层。并非所有 PDF 都使用 OCG 图层,它们在 CAD 导出文件和设计文件中最为常见。
|
||||
- 子图层会在其父图层下缩进显示。您可以嵌套任意深度的图层。
|
||||
- 锁定的图层会显示锁图标,其复选框被禁用。这些锁定由 PDF 创建者设置。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [查看元数据](./view-metadata)
|
||||
- [编辑元数据](./edit-metadata)
|
||||
- [复制与组织](./organize-pdf)
|
||||
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: PDF 多功能工具
|
||||
description: 一体化页面管理器,用于合并、分割、旋转、复制、删除和重新排序 PDF 页面。
|
||||
---
|
||||
|
||||
# PDF 多功能工具
|
||||
|
||||
一个统一的工作区,涵盖所有页面级 PDF 操作。上传一个或多个 PDF,并在单个可视化网格中处理它们的所有页面。无需离开工具,即可旋转、重新排序、复制、删除、插入新的 PDF、添加空白页并分割结果。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击 **上传 PDF** 或将文件拖到上传区域。支持多个文件。
|
||||
2. 所有上传文件的全部页面会以缩略图形式显示在可滚动的网格中。
|
||||
3. 使用工具栏或每页的操作按钮来处理页面。
|
||||
4. 使用每张卡片上的复选框选择页面,然后应用批量操作。
|
||||
5. 使用剪刀图标标记分割点,将输出划分为多个单独的文件。
|
||||
6. 点击 **导出 PDF** 下载最终结果。如果存在分割标记,输出将是包含多个 PDF 的 ZIP。
|
||||
|
||||
## 功能
|
||||
|
||||
- **合并**:上传多个 PDF,它们会自动合并到一个工作区
|
||||
- **重新排序**:拖放页面卡片以重新排列顺序
|
||||
- **旋转**:按 90 度增量(向左或向右)对单页或批量旋转
|
||||
- **复制**:一键克隆任意页面
|
||||
- **删除**:移除单个页面或批量删除所选页面
|
||||
- **插入 PDF**:在任意指定页面之后添加新的 PDF
|
||||
- **添加空白页**:在末尾追加一个空白 A4 页面
|
||||
- **分割**:在页面之间放置分割标记,然后导出为单独 PDF 的 ZIP
|
||||
- **全选 / 取消全选**:快速选择以进行批量操作
|
||||
- **撤销 / 重做**:每项操作都有完整的撤销和重做历史
|
||||
- **下载所选**:仅将所选页面导出为独立的 PDF
|
||||
- 加载前自动修复损坏的 PDF
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 使用多个源 PDF 中的页面构建自定义文档
|
||||
- 通过删除空白页、旋转横向扫描页和重新排序章节来整理扫描文档
|
||||
- 使用可视化分割标记,在章节边界处分割大型 PDF
|
||||
- 无需完整的 PDF 编辑器,即可快速进行页面级编辑
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 撤销和重做系统会记录每项操作。请放心使用,您不会意外毁掉自己的工作。
|
||||
- 分割标记显示为页面之间的蓝色虚线。请直观地将其放在您想要划分文档的位置,然后导出以获得 ZIP。
|
||||
- 对于简单的合并或分割任务,专用的 [合并 PDF](./merge-pdf) 或 [分割 PDF](./split-pdf) 工具可能更快。当您需要在一次会话中完成多项操作时,多功能工具最能发挥优势。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [分割 PDF](./split-pdf)
|
||||
- [复制与组织](./organize-pdf)
|
||||
- [旋转 PDF](./rotate-pdf)
|
||||
@@ -0,0 +1,40 @@
|
||||
---
|
||||
title: PDF 转 BMP
|
||||
description: 将 PDF 页面转换为未压缩的 BMP 图像。适用于需要位图输入的旧系统和打印工作流。
|
||||
---
|
||||
|
||||
# PDF 转 BMP
|
||||
|
||||
将 PDF 的每一页转换为 BMP(位图)图像。BMP 是未压缩格式,因此输出逐像素精确且无质量损失,但文件很大。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 点击 **转换** 处理文件。
|
||||
3. 单个 `.bmp` 文件或 ZIP 压缩包会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。页面以固定的 2 倍比例渲染,生成的图像尺寸约为 PDF 原始页面尺寸的两倍。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单页**:`filename.bmp`
|
||||
- **多页**:`filename_bmps.zip`,包含 `page_1.bmp`、`page_2.bmp` 等。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 PDF 页面输入只接受 BMP 的旧系统或硬件。
|
||||
- 为特定打印工作流准备未压缩图像。
|
||||
- 将位图输出用作需要原始像素数据的图像处理工具的输入。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- BMP 文件非常大,因为它们存储未经压缩的原始像素数据。在大多数情况下,[PDF 转 PNG](./pdf-to-png) 能以小得多的文件提供无损质量。
|
||||
- 如果目标系统接受 PNG 或 TIFF,请优先使用这些格式以节省磁盘空间。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 TIFF](./pdf-to-tiff)
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
@@ -0,0 +1,77 @@
|
||||
---
|
||||
title: PDF 转 CBZ
|
||||
description: 将 PDF 转换为 CBZ(漫画书压缩包)文件,适用于 Komga、Kavita、CDisplayEx 和 Calibre 等漫画阅读器。
|
||||
---
|
||||
|
||||
# PDF 转 CBZ
|
||||
|
||||
将 PDF 转换为 CBZ(Comic Book ZIP)文件,这是数字漫画和日本漫画的标准格式。每个 PDF 页面都会成为压缩包内的一张图片。工具会生成三种格式的元数据以获得最佳兼容性:ComicInfo.xml、metadata.opf 和 ComicBookInfo JSON。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 选择图片格式、质量、缩放比例和可选的元数据。
|
||||
3. 点击 **转换** 生成 CBZ 文件。
|
||||
4. `.cbz` 文件会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 值 | 默认值 | 说明 |
|
||||
| ---------- | --------------- | ------ | -------------------------------------------------------------------- |
|
||||
| 图片格式 | JPEG, PNG, WebP | JPEG | JPEG 适用于彩色漫画,PNG 适用于无损黑白日本漫画,WebP 压缩效果最佳。 |
|
||||
| 质量 | 50–100% | 85% | 控制 JPEG/WebP 压缩。PNG 不显示此项(始终无损)。 |
|
||||
| 缩放 | 1.0x–4.0x | 2.0x | 缩放比例越高,图像在高分辨率屏幕上越清晰。 |
|
||||
| 灰度 | 开/关 | 关 | 将页面转换为灰度。可减小黑白内容的文件大小。 |
|
||||
| 日漫模式 | 开/关 | 关 | 在元数据中设置从右到左的阅读方向。 |
|
||||
| 包含元数据 | 开/关 | 开 | 嵌入 ComicInfo.xml、metadata.opf 和 ComicBookInfo JSON。 |
|
||||
|
||||
## 元数据字段
|
||||
|
||||
启用元数据后,您可以填写:
|
||||
|
||||
- **标题**:从 PDF 文件名自动检测。
|
||||
- **系列**:系列名称(例如“Naruto”)。
|
||||
- **编号 (#)**:系列中的期号。
|
||||
- **卷 (Vol.)**:卷号。
|
||||
- **作者**:作者或创作者姓名。
|
||||
- **出版商**:出版公司。
|
||||
- **标签 / 类型**:以逗号分隔的标签(例如“Action, Adventure”)。
|
||||
- **出版年份**:出版年份(1900–2100)。
|
||||
- **评分**:社区评分,范围 0 到 5。
|
||||
|
||||
## 元数据兼容性
|
||||
|
||||
工具会以三种格式写入元数据,以便每个阅读器都能找到它:
|
||||
|
||||
| 格式 | 位置 | 支持的软件 |
|
||||
| ------------------ | ------------ | ------------------------------------------- |
|
||||
| ComicInfo.xml | ZIP 内的文件 | Komga, Kavita, CDisplayEx, Mylar, ComicRack |
|
||||
| metadata.opf | ZIP 内的文件 | Calibre |
|
||||
| ComicBookInfo JSON | ZIP 注释字段 | Calibre(备用) |
|
||||
|
||||
## 输出格式
|
||||
|
||||
- `filename.cbz`:包含编号页面图片和元数据文件的 ZIP 压缩包。
|
||||
|
||||
页面图片以补零的编号命名(`01.jpg`、`02.jpg` 等),以便阅读器按正确顺序显示。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 转换日本漫画或漫画 PDF,以便在漫画阅读器中使用。
|
||||
- 在 Komga、Kavita 或 Calibre 中建立数字漫画库。
|
||||
- 将扫描的漫画书转换为便于阅读器使用的格式。
|
||||
- 以保留阅读方向和元数据的格式分享漫画。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 彩色漫画使用 **JPEG**,黑白日本漫画使用 **PNG**,PNG 能非常高效地压缩黑白内容。
|
||||
- 对日本漫画启用 **灰度** 可显著减小文件大小。
|
||||
- 填写 **系列** 和 **编号** 字段,以便库管理器(Komga、Calibre)自动整理您的收藏。
|
||||
- **WebP** 压缩效果最佳,但较旧的漫画阅读器可能不支持。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 TIFF](./pdf-to-tiff)
|
||||
- [提取图片](./extract-images)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: PDF 转 CSV
|
||||
description: 从 PDF 文档中提取表格并导出为单个 CSV 文件。通过自动表格检测处理多页 PDF。
|
||||
---
|
||||
|
||||
# PDF 转 CSV
|
||||
|
||||
从 PDF 中提取表格并导出为 CSV 文件。工具使用 PyMuPDF 的表格检测引擎扫描每一页的表格数据,然后将找到的所有行写入单个逗号分隔的输出中。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 点击 **转换** 开始提取表格。
|
||||
3. 工具会扫描每一页并自动识别表格。
|
||||
4. 包含所有提取的表格数据的 `.csv` 文件会下载。
|
||||
|
||||
输出中,来自不同页面的表格以空行分隔。包含逗号、引号或换行符的单元格会按照 RFC 4180 正确转义。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。文档中找到的所有表格都会被提取并合并为单个 CSV。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- 一个包含所有检测到的表格的 `filename.csv` 文件。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 PDF 银行对账单或发票中的财务数据导入电子表格。
|
||||
- 从供应商报价单中提取价格表进行比较。
|
||||
- 将 PDF 论文中的表格研究数据转换为适合分析工具的格式。
|
||||
- 将旧版 PDF 报告中的数据迁移到数据库。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 如果未找到表格,工具会显示“未找到表格”消息。这通常意味着 PDF 使用的文本布局看起来像表格,但并非真正结构化的表格。
|
||||
- 如需对单个表格进行更多控制,请使用 [提取 PDF 表格](./extract-tables),它允许您在 CSV、JSON 和 Markdown 输出格式之间选择。
|
||||
- 如果您需要 Excel 格式的数据,并让每个表格位于单独的工作表,请使用 [PDF 转 Excel](./pdf-to-excel)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 Excel](./pdf-to-excel)
|
||||
- [提取 PDF 表格](./extract-tables)
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: PDF 转 Excel
|
||||
description: 将 PDF 文档中的表格提取到 Excel 电子表格中。每个表格都有自己的工作表,并附带页面引用。
|
||||
---
|
||||
|
||||
# PDF 转 Excel
|
||||
|
||||
从 PDF 中提取表格并保存为 Excel (`.xlsx`) 电子表格。每个检测到的表格都放在单独的工作表中,并标有表格编号和来源页面。表格检测由 PyMuPDF 提供支持,Excel 生成由 SheetJS 库提供支持。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 点击 **转换** 开始提取表格。
|
||||
3. 工具会扫描每一页的表格,然后构建 Excel 工作簿。
|
||||
4. 下载 `.xlsx` 文件,每个表格对应一个工作表。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。所有检测到的表格都会被自动提取。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- 一个 `filename.xlsx` 文件。
|
||||
- **一个表格**:一个名为“Table”的工作表。
|
||||
- **多个表格**:工作表名称为“Table 1 (Page 3)”、“Table 2 (Page 5)”等。工作表名称会被截断为 31 个字符(Excel 的限制)。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 PDF 财务报告转换为可编辑的电子表格以便进一步分析。
|
||||
- 从供应商 PDF 中提取库存或订单表格。
|
||||
- 将 PDF 表单或目录中的结构化数据导入 Excel 进行排序和筛选。
|
||||
- 以非技术同事可以处理的格式归档 PDF 中的表格数据。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 如果工具报告“未找到表格”,说明 PDF 可能使用自由流动的文本布局,而不是结构化表格。请尝试 [PDF 转文本](./pdf-to-text) 来获取原始内容。
|
||||
- 如需更简单的扁平格式,请使用 [PDF 转 CSV](./pdf-to-csv)。如需以多种格式按表格下载,请使用 [提取 PDF 表格](./extract-tables)。
|
||||
- 查看工作表名称,以确定每个表格来自哪一页。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 CSV](./pdf-to-csv)
|
||||
- [提取 PDF 表格](./extract-tables)
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: PDF 转灰度
|
||||
description: 将彩色 PDF 转换为灰度(黑白)版本。生成一个每页都去除了所有颜色的新 PDF。
|
||||
---
|
||||
|
||||
# PDF 转灰度
|
||||
|
||||
将彩色 PDF 转换为灰度版本。每个页面都会被渲染、去饱和,并作为 JPEG 图像重新嵌入到新的 PDF 中。输出保留原始页面尺寸。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 点击 **转换** 处理文件。
|
||||
3. 新的 `greyscale.pdf` 会下载,所有页面都已转换为黑白。
|
||||
|
||||
在底层,每个页面以 2 倍比例渲染,像素数据经过灰度滤镜处理,然后以 90% 质量重新编码为 JPEG,并放入全新的 PDF 文档中。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。灰度转换使用标准亮度公式,JPEG 质量固定为 90%。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- 一个 `greyscale.pdf` 文件,其中所有页面均为灰度 JPEG 图像。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 准备黑白打印的文档,以节省彩色墨水成本。
|
||||
- 满足要求使用灰度的法律或政府文件的提交要求。
|
||||
- 减小色彩丰富的 PDF 的文件大小(JPEG 灰度图像比彩色图像更小)。
|
||||
- 为混合了彩色和黑白页面的文档创建一致的视觉风格。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 由于每个页面都被栅格化并重新嵌入为 JPEG,输出是基于图像的。原始 PDF 中的文本将不再可选择或可搜索。如果之后需要可搜索的文本,请将输出通过 OCR 工具处理。
|
||||
- 如需对颜色调整(亮度、对比度、饱和度)进行更多控制,请查看调整颜色工具,或 [PDF 工作流构建器](./pdf-workflow) 中的灰度节点。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 工作流构建器](./pdf-workflow)
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: PDF 转 JPG
|
||||
description: 将 PDF 页面转换为质量可调的 JPG 图像。单页 PDF 直接下载,多页 PDF 导出为 ZIP。
|
||||
---
|
||||
|
||||
# PDF 转 JPG
|
||||
|
||||
将 PDF 的每一页转换为 JPG 图像。单页文档会下载为独立的 `.jpg` 文件。多页 PDF 会生成一个 ZIP 压缩包,其中每页对应一个 JPG。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。工具会显示文件名、文件大小和页数。
|
||||
2. 调整 **质量** 滑块以控制 JPG 压缩。
|
||||
3. 点击 **转换** 开始处理。
|
||||
4. 结果会自动下载:单页 PDF 为单个 JPG,多页文档为 ZIP 文件。
|
||||
|
||||
## 选项
|
||||
|
||||
- **质量**:从 0% 到 100% 的滑块(默认 90%)。数值越高,图像越清晰,文件也越大。数值越低,压缩越激进。
|
||||
|
||||
页面在内部以 2 倍比例渲染,因此输出分辨率是 PDF 页面尺寸的两倍。标准 Letter 尺寸的页面会生成约 1,224 x 1,584 像素的图像。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单页**:`filename.jpg`
|
||||
- **多页**:`filename_jpgs.zip`,包含 `page_1.jpg`、`page_2.jpg` 等。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为文档管理系统生成预览缩略图。
|
||||
- 在不支持 PDF 的聊天或电子邮件中分享报告的某一页。
|
||||
- 从 PDF 图表或插图创建图像素材。
|
||||
- 将扫描文档作为单独的图像归档。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 如需无损输出,请改用 [PDF 转 PNG](./pdf-to-png)。
|
||||
- 80-90% 的质量设置能在文件大小和视觉保真度之间取得良好平衡。
|
||||
- 如果您需要为每页指定格式,可以考虑 [PDF 工作流构建器](./pdf-workflow),它提供 PDF 转图片输出节点。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 WebP](./pdf-to-webp)
|
||||
- [PDF 转 BMP](./pdf-to-bmp)
|
||||
- [PDF 转 TIFF](./pdf-to-tiff)
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
title: PDF 转 JSON
|
||||
description: 使用 CPDF 将 PDF 文件转换为结构化 JSON 格式。将 PDF 内部结构导出为机器可读的 JSON 数据。
|
||||
---
|
||||
|
||||
# PDF 转 JSON
|
||||
|
||||
将一个或多个 PDF 文件转换为 JSON 格式。工具使用 CPDF (Coherent PDF) 将每个 PDF 的内部结构序列化为机器可读的 JSON 表示。输出始终以 ZIP 压缩包的形式提供。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 使用文件选择器选择一个或多个 PDF 文件。
|
||||
2. 点击 **转换** 开始处理。转换在后台 Web Worker 中运行。
|
||||
3. 下载 ZIP 压缩包,其中每个输入 PDF 对应一个 JSON 文件。
|
||||
|
||||
状态栏会显示转换和 ZIP 创建阶段的进度。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。每个 PDF 都会被转换为其完整的 JSON 表示。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- 一个 `pdfs-to-json.zip` 文件,其中包含每个输入 PDF 对应的 `filename.json`。
|
||||
|
||||
JSON 输出表示 PDF 的内部对象结构,包括页面树、字体引用、元数据和内容流。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 检查 PDF 的内部结构,用于调试或验证。
|
||||
- 以编程方式提取结构化元数据和页面属性。
|
||||
- 将 PDF 结构数据输入自定义处理流水线。
|
||||
- 通过分析对象树来审核 PDF 文档的合规性。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 此工具输出的是原始 PDF 对象结构,而不是提取的文本内容。如果您需要 JSON 格式的页面文本,请改用 [为 AI 准备 PDF](./prepare-pdf-for-ai)。
|
||||
- 对于纯文本提取,[PDF 转文本](./pdf-to-text) 更直接。
|
||||
- 结构复杂的大型 PDF 会生成非常大的 JSON 文件。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
- [为 AI 准备 PDF](./prepare-pdf-for-ai)
|
||||
- [提取 PDF 表格](./extract-tables)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 转 Markdown
|
||||
description: 将 PDF 文档转换为 Markdown 格式,可选提取图片。支持批量转换多个文件。
|
||||
---
|
||||
|
||||
# PDF 转 Markdown
|
||||
|
||||
将 PDF 文件转换为 Markdown (`.md`) 格式,保留标题、段落、列表和基本格式。可选择提取并包含嵌入的图片。支持单个和批量转换。由 PyMuPDF 提供支持。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。
|
||||
2. 可选择切换 **包含图片**,将提取的图片嵌入 Markdown 输出。
|
||||
3. 点击 **转换** 开始处理。
|
||||
4. 单个文件会下载为 `filename.md`。多个文件会生成 `markdown-files.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
- **包含图片**:勾选后,会提取 PDF 中的嵌入图片并在 Markdown 输出中引用。取消勾选时,仅转换文本内容。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单个文件**:`filename.md`
|
||||
- **多个文件**:`markdown-files.zip`,每个输入 PDF 对应一个 `.md`。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将 PDF 文档转换为 Markdown,用于 VitePress、Hugo 或 Jekyll 等静态站点生成器。
|
||||
- 将 PDF 研究论文转换为可编辑的 Markdown,用于 Obsidian 等笔记应用。
|
||||
- 将旧版 PDF 知识库迁移为对 Git 友好的文本格式。
|
||||
- 从 PDF 电子书中提取结构化内容以便重新排版。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 当 PDF 包含对内容至关重要的图表或插图时,包含图片选项很有用。对于以文本为主的文档,请禁用它以保持输出整洁。
|
||||
- 带有侧边栏、脚注或多栏文本的复杂布局可能会生成不完美的 Markdown。请根据需要检查并调整输出。
|
||||
- 如需不带任何格式的原始文本,请改用 [PDF 转文本](./pdf-to-text)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
- [PDF 转 Word](./pdf-to-word)
|
||||
- [为 AI 准备 PDF](./prepare-pdf-for-ai)
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: PDF 转 PDF/A
|
||||
description: 将标准 PDF 转换为用于长期归档的 PDF/A 格式。支持 PDF/A-1b、PDF/A-2b 和 PDF/A-3b 合规级别。
|
||||
---
|
||||
|
||||
# PDF 转 PDF/A
|
||||
|
||||
PDF/A 是 PDF 的 ISO 标准化子集,专为长期数字保存而设计。此工具使用直接在浏览器中运行的 Ghostscript,将您的标准 PDF 转换为符合 PDF/A 的文档。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 上传一个或多个 PDF 文件。
|
||||
2. 从下拉菜单中选择 **PDF/A 版本**。
|
||||
3. 对于正常转换失败的复杂文件,可选择启用 **预先扁平化 PDF**。
|
||||
4. 点击 **转换为 PDF/A**。多个文件会生成 ZIP 压缩包。
|
||||
|
||||
## PDF/A 版本
|
||||
|
||||
| 版本 | 限制 | 最适合 |
|
||||
| ------------ | -------------------------- | -------------------------- |
|
||||
| **PDF/A-1b** | 最严格。无透明度,无图层。 | 与较旧归档系统的最大兼容性 |
|
||||
| **PDF/A-2b** | 允许透明度和 JPEG2000。 | 通用归档(推荐) |
|
||||
| **PDF/A-3b** | 允许嵌入任何格式的附件。 | 归档带有源数据文件的文档 |
|
||||
|
||||
默认选择 PDF/A-2b,可满足绝大多数归档需求。
|
||||
|
||||
## 预先扁平化选项
|
||||
|
||||
某些 PDF 包含会妨碍干净地转换为 PDF/A 的特性,例如不常见的字体编码、复杂的透明度堆叠或损坏的内部结构。启用 **预先扁平化** 会在转换前以 300 DPI 栅格化 PDF,这能保证合规,但代价是文本将无法选择。当标准转换出错时,请将其用作备用方案。
|
||||
|
||||
预先扁平化需要 PyMuPDF WASM 引擎。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 满足政府或法律的归档要求(许多司法管辖区要求法院文件使用 PDF/A)
|
||||
- 向机构存储库或数字图书馆提交文档
|
||||
- 保存十年后原始软件可能已不存在的业务记录
|
||||
- 为要求带有 XML 附件的 PDF/A-3b 的电子发票标准准备发票
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 请先尝试不使用预先扁平化进行转换。仅在出现错误时才启用它。
|
||||
- PDF/A 会嵌入所有字体,因此输出文件通常比原始文件更大。
|
||||
- 如果您的工作流需要严格合规,请在专门的 PDF/A 验证器中验证输出。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [压缩 PDF](./compress-pdf):转换后减小文件大小
|
||||
- [扁平化 PDF](./flatten-pdf):转换为 PDF/A 之前扁平化表单
|
||||
- [移除元数据](./remove-metadata):归档前清除元数据
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: PDF 转 PNG
|
||||
description: 将 PDF 页面转换为缩放比例可调的无损 PNG 图像。非常适合高质量截图和透明背景。
|
||||
---
|
||||
|
||||
# PDF 转 PNG
|
||||
|
||||
将 PDF 的每一页转换为 PNG 图像。PNG 使用无损压缩,因此输出会保留原始页面的每一个细节。单页 PDF 会下载为 `.png` 文件,多页 PDF 会生成 ZIP。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 设置 **缩放** 滑块以控制输出分辨率。
|
||||
3. 点击 **转换** 开始处理。
|
||||
4. 单个 PNG 或 ZIP 压缩包会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
- **缩放**:范围从 1.0x 到 3.0x(默认 2.0x)。在 2.0x 时,标准 Letter 尺寸的页面渲染为约 1,224 x 1,584 像素。更高的缩放值会生成更大、更清晰的图像,但代价是文件大小和处理时间。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单页**:`filename.png`
|
||||
- **多页**:`filename_pngs.zip`,包含 `page_1.png`、`page_2.png` 等。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为演示文稿捕获 PDF 页面的高保真截图。
|
||||
- 提取需要清晰边缘且无压缩伪影的图表或示意图。
|
||||
- 从 PDF 原型图准备网页设计素材。
|
||||
- 为 OCR 预处理创建无损页面图像。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- PNG 文件比 JPG 大得多。如果文件大小比完美质量更重要,请使用 [PDF 转 JPG](./pdf-to-jpg) 或 [PDF 转 WebP](./pdf-to-webp)。
|
||||
- 在 1.0x 缩放时,输出与 PDF 的原生分辨率一致。如需印刷质量的导出,请提高到 3.0x。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
- [PDF 转 WebP](./pdf-to-webp)
|
||||
- [PDF 转 SVG](./pdf-to-svg)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 转 SVG
|
||||
description: 将 PDF 页面转换为可缩放的 SVG 矢量图形。将文本和形状保留为矢量路径,可无限缩放。
|
||||
---
|
||||
|
||||
# PDF 转 SVG
|
||||
|
||||
将 PDF 的每一页转换为 SVG(可缩放矢量图形)文件。与栅格格式不同,SVG 会保留矢量路径、文本和形状,因此输出可缩放到任意大小而不会出现像素化。由 PyMuPDF 提供支持。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。您可以添加多个文件并分别管理。
|
||||
2. 点击 **转换** 处理所有已上传的文件。
|
||||
3. 单文件单页的转换会下载为独立的 `.svg`。其他情况都会下载为 ZIP 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。每个页面都使用 PyMuPDF 的原生矢量导出转换为 SVG。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单文件,单页**:`filename.svg`
|
||||
- **单文件,多页**:`filename_svg.zip`,包含 `page_1.svg`、`page_2.svg` 等。
|
||||
- **多个文件**:`pdf_to_svg.zip`,文件按源文档名称组织。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从 PDF 报告中提取矢量图表、图示或插图,用于网页。
|
||||
- 在 Inkscape 或 Illustrator 等矢量编辑器中编辑 PDF 页面内容。
|
||||
- 在响应式网络应用中嵌入可缩放的页面预览。
|
||||
- 从 PDF 宣传册中提取徽标或图形,同时保持边缘锐利。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- SVG 最适合包含矢量内容的 PDF。扫描文档或图像较多的 PDF 会生成包含嵌入栅格数据的大型 SVG 文件。
|
||||
- 对于图像较多的 PDF,如需栅格输出,请改用 [PDF 转 PNG](./pdf-to-png) 或 [PDF 转 JPG](./pdf-to-jpg)。
|
||||
- 此工具支持批量转换:一次上传多个 PDF,即可一次性全部转换。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
- [PDF 转 Markdown](./pdf-to-markdown)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 转文本
|
||||
description: 从 PDF 文件中提取纯文本内容。支持批量提取多个 PDF,并输出为 TXT 文件。
|
||||
---
|
||||
|
||||
# PDF 转文本
|
||||
|
||||
从 PDF 文件中提取所有文本内容,并保存为纯 `.txt` 文件。支持批量处理:上传多个 PDF,一次操作即可提取每个文件的文本。由 PyMuPDF 提供支持。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。使用“添加更多”和“清除”按钮管理文件列表。
|
||||
2. 点击 **提取** 开始处理。
|
||||
3. 单个文件会下载为 `filename.txt`。多个文件会生成 `pdf-to-text.zip` 压缩包。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。会按阅读顺序提取每一页的所有文本内容。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单个文件**:`filename.txt`
|
||||
- **多个文件**:`pdf-to-text.zip`,每个输入 PDF 对应一个 `.txt`。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 从 PDF 报告中提取正文,用于全文搜索索引。
|
||||
- 将 PDF 电子书或文章转换为纯文本,以便在电子墨水设备上阅读。
|
||||
- 从合同或法律文件中提取文本,用于关键词分析。
|
||||
- 去除 PDF 的格式,获得干净的文本,供数据处理脚本使用。
|
||||
- 从 PDF 档案中准备用于自然语言处理的文本语料库。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 扫描的 PDF(仅有图像)会生成空的文本文件,因为没有可提取的文本层。请先对扫描文档进行 OCR。
|
||||
- 输出保留 PyMuPDF 所解读的阅读顺序,通常是从左到右、从上到下。多栏布局可能会生成交错的文本。
|
||||
- 如需带有标题和格式的结构化输出,请尝试 [PDF 转 Markdown](./pdf-to-markdown)。如需适用于 AI 的结构化 JSON,请使用 [为 AI 准备 PDF](./prepare-pdf-for-ai)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 Markdown](./pdf-to-markdown)
|
||||
- [为 AI 准备 PDF](./prepare-pdf-for-ai)
|
||||
- [PDF 转 Word](./pdf-to-word)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 转 TIFF
|
||||
description: 将 PDF 页面转换为 TIFF 图像,常用于印刷、传真和归档工作流。编码失败时回退为 PNG。
|
||||
---
|
||||
|
||||
# PDF 转 TIFF
|
||||
|
||||
将 PDF 的每一页转换为 TIFF 图像。TIFF 是印刷制作、传真系统和文档归档的标准格式。工具使用 PackBits 压缩进行 TIFF 编码,如果某个页面编码失败,则回退为 PNG。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 点击 **转换** 处理文件。
|
||||
3. 单个 TIFF 文件或 ZIP 压缩包会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。页面以固定的 2 倍比例渲染。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单页**:`filename.tiff`
|
||||
- **多页**:`filename_tiffs.zip`,包含 `page_1.tiff`、`page_2.tiff` 等。
|
||||
|
||||
如果某个特定页面的 TIFF 编码失败(由于压缩问题),该页面会改为保存为 `.png` 文件。在这种情况下,ZIP 中会混合包含 TIFF 和 PNG 文件。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 向要求 TIFF 格式的政府机构或法律系统提交文档。
|
||||
- 准备页面,通过数字传真服务进行传真传输。
|
||||
- 以广泛支持的无损格式归档扫描文档。
|
||||
- 将页面输入企业文档管理系统。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- TIFF 文件很大。如果您只需要用于网页或屏幕的无损质量,[PDF 转 PNG](./pdf-to-png) 是更好的选择。
|
||||
- 如果某些页面需要使用 PNG 回退,请检查 ZIP 内容,您可能需要单独转换这些页面。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 BMP](./pdf-to-bmp)
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 转 WebP
|
||||
description: 将 PDF 页面转换为质量可调的 WebP 图像。在视觉质量相当的情况下,文件比 JPG 更小。
|
||||
---
|
||||
|
||||
# PDF 转 WebP
|
||||
|
||||
将 PDF 的每一页转换为 WebP 图像。在相同的感知质量下,WebP 生成的文件通常比 JPG 小 25-35%,是网页使用的理想选择。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传 PDF。
|
||||
2. 调整 **质量** 滑块。
|
||||
3. 点击 **转换** 处理文件。
|
||||
4. 单个 `.webp` 文件或 ZIP 压缩包会自动下载。
|
||||
|
||||
## 选项
|
||||
|
||||
- **质量**:从 0% 到 100% 的滑块(默认 85%)。控制有损压缩级别。数值越高,保留的细节越多。
|
||||
|
||||
页面在内部以 2 倍比例渲染,生成的图像尺寸大约是 PDF 原始尺寸的两倍。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单页**:`filename.webp`
|
||||
- **多页**:`filename_webps.zip`,包含 `page_1.webp`、`page_2.webp` 等。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为带宽有限的网站准备页面预览。
|
||||
- 为社交媒体生成传单或宣传册的轻量图像版本。
|
||||
- 将多页文档批量转换为经过网页优化的图像集。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 所有现代浏览器都支持 WebP。如需兼容旧版浏览器,请回退使用 [PDF 转 JPG](./pdf-to-jpg)。
|
||||
- 80-85% 的质量在屏幕上通常与原图难以区分,同时能保持较小的文件大小。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转 JPG](./pdf-to-jpg)
|
||||
- [PDF 转 PNG](./pdf-to-png)
|
||||
- [PDF 转 BMP](./pdf-to-bmp)
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: PDF 转 Word
|
||||
description: 将 PDF 文件转换为可编辑的 Word (DOCX) 文档。支持一次批量转换多个 PDF。
|
||||
---
|
||||
|
||||
# PDF 转 Word
|
||||
|
||||
将 PDF 文件转换为可编辑的 Word (`.docx`) 文档。工具使用 PyMuPDF 重建文档内容,保留文本、基本格式和布局。支持单个和批量转换。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上以上传一个或多个 PDF。您可以添加更多文件,或从列表中移除单个文件。
|
||||
2. 点击 **转换** 开始处理。
|
||||
3. 单个文件会下载为 `filename.docx`。多个文件会打包为 `converted-documents.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。每个 PDF 都使用 PyMuPDF 的内置转换引擎转换为 DOCX。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单个文件**:`filename.docx`
|
||||
- **多个文件**:`converted-documents.zip`,每个输入 PDF 对应一个 `.docx`。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 编辑您收到并需要修改的 PDF 中的文本。
|
||||
- 将归档的 PDF 报告转换为同事可在 Microsoft Word 或 Google Docs 中编辑的格式。
|
||||
- 将 PDF 合同或提案中的内容提取到 Word 中进行修订。
|
||||
- 将旧版 PDF 文档迁移为可编辑格式。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 带有多栏文本、嵌入式表单或大量图形的复杂布局可能无法完美转换。请检查输出,并在文字处理软件中调整格式。
|
||||
- 扫描的 PDF(仅有图像)会生成空的或内容极少的 DOCX 文件。请先对其进行 OCR 以添加文本层。
|
||||
- 批量模式可高效转换整个文件夹的 PDF,一次上传全部即可。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
- [PDF 转 Markdown](./pdf-to-markdown)
|
||||
- [PDF 工作流构建器](./pdf-workflow)
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
title: PDF 转 ZIP
|
||||
description: 将多个 PDF 文件打包为单个 ZIP 压缩包,便于分享和存储。
|
||||
---
|
||||
|
||||
# PDF 转 ZIP
|
||||
|
||||
将多个 PDF 文件打成单个 ZIP 压缩包。这是一个简单的打包工具,不会对 PDF 本身进行转换、压缩或修改。
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 使用拖放区域上传多个 PDF 文件。
|
||||
2. 查看文件列表。移除您不想包含的文件。
|
||||
3. 点击处理按钮。
|
||||
4. 包含所有已上传 PDF 的 ZIP 压缩包会立即下载。
|
||||
|
||||
## 功能
|
||||
|
||||
- 接受任意数量的 PDF 文件
|
||||
- 创建压缩包前可逐个移除文件
|
||||
- 在 ZIP 内保留原始文件名
|
||||
- 不修改 PDF 内容,文件按原样打包
|
||||
- 显示每个已上传 PDF 的文件名和大小
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将一组发票或收据打包,作为电子邮件附件
|
||||
- 打包项目交付物(多个 PDF 报告)以便交接
|
||||
- 为一组表单或模板创建单个下载文件
|
||||
- 将一批文档归档为一个压缩文件
|
||||
|
||||
## 小技巧
|
||||
|
||||
- ZIP 文件使用原始的 PDF 文件名。如果有同名文件,请在上传前重命名以避免冲突。
|
||||
- 此工具不会压缩 PDF 本身。如需减小文件大小,请先使用压缩 PDF 处理,然后再用此工具打包。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [合并 PDF](./merge-pdf)
|
||||
- [分割 PDF](./split-pdf)
|
||||
- [压缩 PDF](./compress-pdf)
|
||||
@@ -0,0 +1,95 @@
|
||||
---
|
||||
title: PDF 工作流构建器
|
||||
description: 通过在画布上连接节点,以可视化方式构建自定义 PDF 处理流水线。串联合并、压缩、水印和导出等操作。
|
||||
---
|
||||
|
||||
# PDF 工作流构建器
|
||||
|
||||
工作流构建器可让您将多个 PDF 操作串联成一个自动化流水线。无需逐个运行工具,您只需连接由输入、处理和输出节点组成的可视化图,然后一键执行所有操作。您的文件始终不会离开浏览器。
|
||||
|
||||
## 使用方法
|
||||
|
||||
界面分为三个面板:左侧的 **节点工具箱**,中间的 **画布**,以及选中节点时出现在右侧的 **设置面板**。
|
||||
|
||||
1. **添加节点**:点击左侧边栏中的节点,或将其直接拖到画布上。使用工具箱顶部的搜索栏按名称筛选。
|
||||
2. **连接节点**:从一个节点的输出接口(节点底部)拖动到另一个节点的输入接口(节点顶部)。连接自上而下流动。
|
||||
3. **配置设置**:点击节点以打开右侧的设置面板。每种节点类型都有自己的选项(页面范围、质量滑块、密码等)。
|
||||
4. **运行工作流**:点击工具栏中的 **运行** 按钮。引擎会按拓扑顺序执行节点,依次处理每个节点。底部的状态栏会跟踪进度。
|
||||
5. **下载结果**:末端的下载节点会保存最终的 PDF(如果生成多个文件则为 ZIP)。
|
||||
|
||||
## 节点类别
|
||||
|
||||
节点分为六个类别,在画布上以不同颜色标识:
|
||||
|
||||
- **输入**(蓝色):PDF 输入、图片输入、Word/Excel/PowerPoint 转 PDF,以及其他 15 种以上将文件送入流水线的格式转换器。
|
||||
- **编辑与注释**(靛蓝色):裁剪、灰度、反转颜色、水印、页码、页眉和页脚、扫描效果、调整颜色、背景颜色、移除空白页、移除注释。
|
||||
- **组织与管理**(紫色):合并、分割、提取页面、旋转、删除页面、反转、添加空白页、分割页面、N-Up、修复页面尺寸、合并为单页、小册子、海报化、编辑元数据、目录、OCR。
|
||||
- **优化与修复**(琥珀色):压缩、栅格化、线性化、校正、PDF 转 PDF/A、字体转轮廓、修复。
|
||||
- **PDF 安全**(玫红色):加密、解密、清理、扁平化、数字签名、涂黑。
|
||||
- **输出**(青色):下载(自动检测单个 PDF 还是 ZIP)、PDF 转图片、PDF 转文本、PDF 转 DOCX、PDF 转 XLSX、PDF 转 CSV、PDF 转 SVG、PDF 转 Markdown、提取图片。
|
||||
|
||||
## 保存和加载工作流
|
||||
|
||||
工具栏提供四种持久化选项:
|
||||
|
||||
- **保存**:将当前工作流作为命名模板存储在浏览器的本地存储中。您可以保存多个模板。
|
||||
- **加载**:打开一个列出所有已保存模板的弹窗。点击加载以恢复某个模板,或删除不再需要的模板。
|
||||
- **导出**:将工作流下载为 `.json` 文件,以便分享或备份。
|
||||
- **导入**:从磁盘加载 `.json` 工作流文件,恢复所有节点、位置和连接。
|
||||
|
||||
模板会在本地存储中跨会话保留。导出的 JSON 文件可在不同浏览器和机器之间移植。
|
||||
|
||||
## 执行模型
|
||||
|
||||
引擎会根据您的连接构建依赖图,并按拓扑顺序执行节点。如果任何节点失败,执行会停止,失败的节点会被标红。需要记住几条规则:
|
||||
|
||||
- 每个工作流至少需要一个 **输入** 节点和一个 **输出** 节点。
|
||||
- 引擎会检测循环依赖,并以错误阻止执行。
|
||||
- **加密** 节点必须是输出节点之前的最后一个处理步骤。将其放在更前面会触发验证警告,因为下游节点无法处理已加密的数据。
|
||||
- 受密码保护的 PDF 会在执行期间提示输入密码。
|
||||
- 支持多 PDF 输入:合并节点可以将它们合并,批处理节点则会逐个处理每个 PDF。
|
||||
|
||||
## 接口类型
|
||||
|
||||
连接使用带类型的接口,以防止无效连线:
|
||||
|
||||
- **PDF**(靛蓝色):单个 PDF 文档。
|
||||
- **MultiPDF**(琥珀色):打包在一起的多个 PDF 文档。
|
||||
- **Image**(绿色):图片二进制数据。
|
||||
|
||||
## 选项
|
||||
|
||||
每个节点都有自己的配置,可通过右侧设置面板访问。常见模式包括:
|
||||
|
||||
- 分割、提取页面、删除页面节点上的 **页面范围**
|
||||
- 图片转换输出节点上的 **质量滑块**
|
||||
- 加密和解密节点上的 **密码字段**
|
||||
- 水印、页眉和页脚、编辑元数据的 **文本输入**
|
||||
- 旋转节点上的 **旋转角度**
|
||||
- 压缩节点上的 **压缩级别**
|
||||
- OCR 节点上的 **OCR 语言选择**
|
||||
|
||||
## 使用场景
|
||||
|
||||
- **发票处理流水线**:PDF 输入 -> OCR -> 提取 PDF 表格 -> 下载为 CSV。
|
||||
- **报告标准化**:Word 转 PDF -> 修复页面尺寸 -> 添加页码 -> 水印 -> 压缩 -> 下载。
|
||||
- **归档准备**:PDF 输入 -> 修复 -> 扁平化 -> 清理 -> PDF 转 PDF/A -> 下载。
|
||||
- **批量图片提取**:PDF 输入(多个文件) -> 提取图片 -> 下载 ZIP。
|
||||
- **可直接印刷的小册子**:PDF 输入 -> 小册子 -> 裁剪 -> 压缩 -> 下载。
|
||||
- **安全分发**:PDF 输入 -> 涂黑 -> 移除注释 -> 加密 -> 下载。
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 使用 **Delete** 或 **Backspace** 从画布上移除选中的节点。
|
||||
- 点击节点状态栏上的 **X** 按钮可直接将其删除。
|
||||
- 点击并拖动空白处即可平移画布。平移时光标会变为抓取图标。
|
||||
- 在移动设备上,使用工具栏中的 **+** 按钮切换节点工具箱。
|
||||
- 如果您的工作流生成多个输出文件,下载节点会自动将它们打包为 ZIP。
|
||||
- 从简单开始:在增加复杂度之前,先构建并测试一个包含两个节点的流水线。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
- [PDF 转 Excel](./pdf-to-excel)
|
||||
- [提取图片](./extract-images)
|
||||
- [PDF 转 Markdown](./pdf-to-markdown)
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: PNG 转 PDF
|
||||
description: 完全在浏览器中,将一张或多张 PNG 图片转换为质量可调的 PDF 文档。
|
||||
---
|
||||
|
||||
# PNG 转 PDF
|
||||
|
||||
将 PNG 图片转换为 PDF,并保留其完整分辨率。每张 PNG 都会成为单独的一页,页面大小与原始图片尺寸一致。透明度会被自动处理。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :--- | :----- |
|
||||
| PNG | `.png` |
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 点击上传区域或拖放 PNG 文件。您可以一次选择多个文件。
|
||||
2. 管理文件列表:移除不需要的文件或添加更多文件。
|
||||
3. 从下拉菜单中选择 **PDF 质量** 级别。
|
||||
4. 点击 **转换为 PDF**。输出会下载为 `from_jpgs.pdf`。
|
||||
|
||||
工具使用 pdf-lib 直接嵌入每张图片。如果某张 PNG 无法原生嵌入(例如由于不常见的颜色配置文件),则会回退为通过画布重新渲染为 JPEG。
|
||||
|
||||
## 选项
|
||||
|
||||
**PDF 质量** 控制嵌入之前应用的压缩:
|
||||
|
||||
- **高质量**:压缩最少,文件最大。
|
||||
- **中等质量**(默认):在大小和清晰度之间取得良好平衡。
|
||||
- **低质量**:压缩最强,输出最小。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将截图转换为多页 PDF,用于错误报告或文档
|
||||
- 将 UI 设计导出文件打包为单个文件以供审阅
|
||||
- 将图表导出文件(draw.io、Excalidraw)转换为可分享的 PDF
|
||||
- 将一组图表图片汇编为报告
|
||||
|
||||
## 小技巧
|
||||
|
||||
- 带透明度的 PNG 文件在 PDF 中会获得白色背景。如果您需要不同的背景,请事先编辑图片。
|
||||
- 对于带有锐利边缘和文字的截图和图表,高质量可避免 JPEG 压缩伪影。中等或低质量可能会在内部转换为 JPEG。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
- [JPG 转 PDF](./jpg-to-pdf)
|
||||
- [SVG 转 PDF](./svg-to-pdf)
|
||||
@@ -0,0 +1,53 @@
|
||||
---
|
||||
title: 海报化 PDF
|
||||
description: 将 PDF 页面拆分为由较小页面组成的网格,以便在多张纸上进行大幅面打印。
|
||||
---
|
||||
|
||||
# 海报化 PDF
|
||||
|
||||
将 PDF 的每一页划分为由较小子页面组成的网格。使用此工具可以把单个页面打印到多张纸上,再将它们拼接起来,制作成大型海报或横幅。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 设置**行数**和**列数**来定义网格(例如,2 行 x 2 列会将每页拆分为 4 个子页面)。
|
||||
3. 可选:指定页面范围,限制要海报化的页面。
|
||||
4. 预览画布会在当前页面上显示网格叠加层,方便您直观查看切割位置。
|
||||
5. 在页面之间切换,查看其他页面上的叠加层。
|
||||
6. 点击处理按钮。每个网格单元都会成为输出 PDF 中的一个独立页面。
|
||||
|
||||
## 功能
|
||||
|
||||
- 可配置行数和列数,网格尺寸灵活
|
||||
- 实时预览,网格叠加层精确显示页面的分割位置
|
||||
- 页面范围筛选,仅对指定页面进行海报化
|
||||
- 在预览中逐页浏览
|
||||
- 缓存页面快照,预览切换更快
|
||||
- 红色虚线网格线清晰标出切割边界
|
||||
|
||||
## 选项
|
||||
|
||||
| 选项 | 说明 |
|
||||
| ------------ | --------------------------------- |
|
||||
| **行数** | 水平分割数量(默认:1) |
|
||||
| **列数** | 垂直分割数量(默认:1) |
|
||||
| **页面范围** | 要海报化的页面(留空 = 所有页面) |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 将海报尺寸的 PDF 打印到多张标准 A4 或 Letter 纸上,拼贴到墙上
|
||||
- 用单页 PDF 设计制作大型横幅
|
||||
- 将超大的技术图纸拆分为可打印的分块
|
||||
- 在没有宽幅打印机的情况下完成大幅面打印
|
||||
|
||||
## 提示
|
||||
|
||||
- 2x2 网格会将一页变成 4 页,3x3 网格会将一页变成 9 页。请根据最终拼接成品的大小规划网格。
|
||||
- 预览叠加层可帮助您确认重要内容不会落在切割线上。如有需要,请调整行数和列数。
|
||||
- 如需相反的操作(将多个页面放到一张纸上),请使用 [N-Up PDF](./n-up-pdf)。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [N-Up PDF](./n-up-pdf)
|
||||
- [分割页面](./divide-pages)
|
||||
- [分割 PDF](./split-pdf)
|
||||
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: PowerPoint 转 PDF
|
||||
description: 将 PowerPoint 演示文稿(PPT、PPTX)和 ODP 文件转换为 PDF,并保留幻灯片格式。
|
||||
---
|
||||
|
||||
# PowerPoint 转 PDF
|
||||
|
||||
将演示文稿文件转换为 PDF。每张幻灯片都会成为输出文档中的一页,文本、图片、形状和切换效果通过浏览器内的 LibreOffice 引擎渲染。同时支持新版和旧版 PowerPoint 格式,以及 OpenDocument 演示文稿格式。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 |
|
||||
| :-------------------- | :------ |
|
||||
| PowerPoint(新版) | `.pptx` |
|
||||
| PowerPoint(旧版) | `.ppt` |
|
||||
| OpenDocument 演示文稿 | `.odp` |
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 点击上传区域,或将演示文稿文件拖放到此处。
|
||||
2. 查看文件列表。可根据需要添加或移除文件。
|
||||
3. 点击**转换为 PDF**。LibreOffice 引擎会在首次使用时加载,然后转换每个文件。
|
||||
4. 单个文件会直接下载为 PDF。多个文件会打包为 `powerpoint-converted.zip`。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有额外设置。幻灯片按其原始尺寸渲染。
|
||||
|
||||
## 输出
|
||||
|
||||
| 输入数量 | 输出 |
|
||||
| :------- | :------------------------------------------------------------- |
|
||||
| 1 个文件 | 下载单个 PDF(原文件名,扩展名为 `.pdf`) |
|
||||
| 2 个以上 | ZIP 压缩包(`powerpoint-converted.zip`),每个文件对应一个 PDF |
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在分享给可能没有 PowerPoint 的观众之前,先将演示文稿转换为 PDF
|
||||
- 为会议或研讨会制作可打印的幻灯片讲义版本
|
||||
- 以在所有设备上显示一致的格式归档演示文稿
|
||||
- 批量将 LibreOffice Impress 的 ODP 演示文稿库转换为 PDF
|
||||
- 制作用于邮件附件的融资演示文稿 PDF 版本
|
||||
|
||||
## 提示
|
||||
|
||||
- 幻灯片动画和切换效果不会体现在 PDF 中,每张幻灯片都会被截取为静态页面。
|
||||
- 嵌入的视频不会出现在输出中。如有需要,请用截图或占位图片替换。
|
||||
- 默认的 PDF 导出不包含演讲者备注。如果需要备注,请先通过 PowerPoint 原生的“打印备注”视图导出。
|
||||
- LibreOffice 引擎在首次加载后会被缓存,因此在同一会话中转换第二个演示文稿会快得多。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [Word 转 PDF](./word-to-pdf)
|
||||
- [Excel 转 PDF](./excel-to-pdf)
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: 为 AI 准备 PDF
|
||||
description: 将 PDF 内容提取为针对 LLM 和 LlamaIndex 等 AI 管道优化的结构化 JSON。支持批量处理。
|
||||
---
|
||||
|
||||
# 为 AI 准备 PDF
|
||||
|
||||
从 PDF 文件中提取内容,并将其整理为适合大型语言模型(LLM)和 LlamaIndex 等 AI 框架摄取的 JSON。每一页的内容都会被提取并组织成结构化格式,可直接用于 RAG 管道、聊天机器人或语义搜索系统。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 点击拖放区域或将文件拖到其上,上传一个或多个 PDF。
|
||||
2. 点击**提取**开始处理。
|
||||
3. 单个文件会下载为 `filename_llm.json`。多个文件会生成 `pdf-for-ai.zip` 压缩包。
|
||||
|
||||
此工具使用 PyMuPDF 的 LlamaIndex 集成来提取带元数据的页面级内容,生成的输出可直接加载到 AI 框架中。
|
||||
|
||||
## 选项
|
||||
|
||||
此工具没有可配置的选项。所有页面都会提取完整文本和元数据。
|
||||
|
||||
## 输出格式
|
||||
|
||||
- **单个文件**:`filename_llm.json`
|
||||
- **多个文件**:`pdf-for-ai.zip`,每个输入 PDF 对应一个 `_llm.json`。
|
||||
|
||||
JSON 输出遵循 LlamaIndex 文档模式,包含每页的文本内容和元数据字段。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 为检索增强生成(RAG)管道准备 PDF 文档。
|
||||
- 利用 PDF 档案为 AI 聊天机器人构建可搜索的知识库。
|
||||
- 将 PDF 报告输入基于 LLM 的分析工作流。
|
||||
- 为语义搜索和问答系统预处理研究论文。
|
||||
- 从 PDF 文档集合中创建结构化的训练数据。
|
||||
|
||||
## 提示
|
||||
|
||||
- 如果只需要不含 AI 专用格式的纯文本提取,请使用 [PDF 转文本](./pdf-to-text)。
|
||||
- 如果需要保留标题和结构的 Markdown 输出,请使用 [PDF 转 Markdown](./pdf-to-markdown)。
|
||||
- 扫描版 PDF 的输出会为空或内容极少。请先通过 OCR 添加文本层,再进行提取。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [PDF 转文本](./pdf-to-text)
|
||||
- [PDF 转 Markdown](./pdf-to-markdown)
|
||||
- [PDF 转 JSON](./pdf-to-json)
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
title: 保护 PDF
|
||||
description: 使用 256 位 AES 加密为 PDF 文件设置密码保护。可设置用户密码和所有者密码,并配置使用限制。
|
||||
---
|
||||
|
||||
# 保护 PDF
|
||||
|
||||
用密码锁定您的 PDF,使只有获得授权的人才能打开。BentoPDF 使用 256 位 AES 加密(银行和政府机构使用的同一标准),并通过 QPDF 完全在您的浏览器中完成。
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 上传 PDF 文件。
|
||||
2. 输入**用户密码**(必填)。这是他人打开文件时需要输入的密码。
|
||||
3. 可选:输入**所有者密码**。设置后,PDF 将获得使用限制,禁止打印、编辑、复制和批注。
|
||||
4. 点击**加密 PDF**。
|
||||
5. 下载加密后的文件。
|
||||
|
||||
## 密码类型
|
||||
|
||||
### 用户密码(必填)
|
||||
|
||||
用户密码是收件人打开 PDF 时需要输入的密码。没有它,文档将完全无法访问。每个加密的 PDF 都必须有用户密码。
|
||||
|
||||
### 所有者密码(可选)
|
||||
|
||||
所有者密码用于控制获得授权的用户在打开文件后可以执行的操作。当您设置了不同的所有者密码时,BentoPDF 会自动应用最严格的限制集:
|
||||
|
||||
- 禁止修改
|
||||
- 禁止提取/复制
|
||||
- 禁止打印
|
||||
- 禁止批注
|
||||
- 禁止填写表单
|
||||
- 禁止文档组装
|
||||
|
||||
如果您将所有者密码留空,PDF 仍会被加密(打开时仍需要用户密码),但打开后没有任何使用限制。
|
||||
|
||||
## 加密详情
|
||||
|
||||
- **算法**:AES-256(256 位高级加密标准)
|
||||
- **密钥长度**:256 位
|
||||
- **标准**:PDF 2.0 加密(QPDF 实现)
|
||||
|
||||
以当前技术,暴力破解 AES-256 在计算上是不可行的。加密 PDF 的安全性完全取决于密码的强度。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 在通过邮件发送之前保护机密财务报告
|
||||
- 保护与对方律师共享的法律文件
|
||||
- 为医疗记录或个人身份信息添加密码
|
||||
- 通过访问控制分发付费内容(电子书、报告)
|
||||
- 遵守要求静态数据加密的数据保护政策
|
||||
|
||||
## 提示
|
||||
|
||||
- 使用强度高且唯一的密码。包含大小写字母、数字和符号的 12 位以上口令最为理想。
|
||||
- 通过单独的渠道(电话、短信)分享密码,切勿与 PDF 放在同一封邮件中。
|
||||
- 如果您只想限制操作(禁止打印、禁止复制),而不需要密码才能打开,请改用“更改权限”工具。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [解密 PDF](./unlock-pdf):已知密码时移除加密
|
||||
- [更改权限](./change-permissions):修改特定的使用限制
|
||||
- [移除限制](./remove-restrictions):移除 PDF 的所有安全设置
|
||||
- [清理 PDF](./sanitize-pdf):在加密前移除隐藏内容
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: PSD 转 PDF
|
||||
description: 在浏览器中将 Photoshop(PSD)文件转换为 PDF。免费、私密,无需 Adobe 软件。
|
||||
---
|
||||
|
||||
# PSD 转 PDF
|
||||
|
||||
将 Adobe Photoshop PSD 文件转换为 PDF 文档。PSD 是 Photoshop 的原生格式,通常需要昂贵的 Adobe 软件才能打开。此工具会将 PSD 文件的合并图像以完整分辨率渲染为 PDF 页面。
|
||||
|
||||
## 支持的格式
|
||||
|
||||
| 格式 | 扩展名 | 说明 |
|
||||
| :-------------- | :----- | :------------------- |
|
||||
| Adobe Photoshop | `.psd` | 渲染合并后的复合图像 |
|
||||
|
||||
## 工作原理
|
||||
|
||||
1. 点击上传区域或将 PSD 文件拖放到此处。支持多个文件。
|
||||
2. 查看文件列表。使用垃圾桶图标移除不需要的文件,或使用**添加更多文件**加入更多文件。
|
||||
3. 点击**转换为 PDF**。PyMuPDF 引擎会读取 PSD 文件,并以原始分辨率将合并图像嵌入 PDF 页面。
|
||||
4. 单个 PSD 生成一个 PDF。上传多个 PSD 文件时,它们会合并为一个名为 `psd_to_pdf.pdf` 的多页 PDF,每个 PSD 成为其中一页。
|
||||
|
||||
## 选项
|
||||
|
||||
无需任何设置。转换器使用 PSD 文件中合并后的图像数据。
|
||||
|
||||
## 使用场景
|
||||
|
||||
- 无需打开 Photoshop 即可预览设计稿
|
||||
- 向没有 Adobe Creative Suite 的客户发送设计样稿
|
||||
- 打印 PSD 文件中的高分辨率作品
|
||||
- 用多个 PSD 设计文件创建 PDF 作品集,每个文件成为单个文档中的一页
|
||||
|
||||
## 提示
|
||||
|
||||
- 转换渲染的是 PSD 的合并(扁平化)视图。单独的图层、调整图层和图层效果不会作为独立元素保留在 PDF 中。
|
||||
- 多个 PSD 文件会合并为一个多页 PDF,而不是单独的 PDF。这对于制作作品集或样册很有用。
|
||||
- 分辨率很高的 PSD 文件(300 DPI 以上的印刷文件)会生成较大的 PDF。该工具会保留完整分辨率。
|
||||
|
||||
## 相关工具
|
||||
|
||||
- [图片转 PDF](./image-to-pdf)
|
||||
- [PNG 转 PDF](./png-to-pdf)
|
||||
- [VSD 转 PDF](./vsd-to-pdf)
|
||||
Loaded 100 of 3344 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user