mirror of
https://github.com/alam00000/bentopdf.git
synced 2026-11-11 09:23:36 +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`을 실행하세요
|
||||
- 프로덕션 코드에는 주석을 넣지 마세요 (주석은 빌드 중에 제거됩니다)
|
||||
|
||||
## 풀 리퀘스트 절차
|
||||
|
||||
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 이슈](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` 같은 LAN 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]
|
||||
> 폐쇄망 OCR 배포를 준비한다면 Tesseract 워커, 코어 런타임, traineddata 파일 외에 OCR 텍스트 레이어 글꼴도 내부에서 호스팅해야 합니다. `VITE_OCR_FONT_BASE_URL`과 번들된 `ocr-fonts/` 디렉터리를 포함한 전체 설정은 [셀프 호스팅](/ko/self-hosting/)에 문서화되어 있습니다.
|
||||
|
||||
### 옵션 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+
|
||||
|
||||
## 다음 단계
|
||||
|
||||
- [모든 도구 살펴보기](/ko/tools/)
|
||||
- [BentoPDF 직접 호스팅하기](/ko/self-hosting/)
|
||||
- [프로젝트에 기여하기](/ko/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: /ko/getting-started
|
||||
- theme: alt
|
||||
text: 도구 보기
|
||||
link: /ko/tools/
|
||||
- theme: alt
|
||||
text: 직접 호스팅
|
||||
link: /ko/self-hosting/
|
||||
- theme: alt
|
||||
text: 상용 라이선스
|
||||
link: /ko/licensing
|
||||
|
||||
features:
|
||||
- icon: 🔒
|
||||
title: 100% 개인정보 보호
|
||||
details: 파일이 기기 밖으로 나가지 않습니다. 모든 처리는 WebAssembly를 사용해 브라우저에서 로컬로 이루어집니다.
|
||||
- icon: ⚡
|
||||
title: 빠르고 무료
|
||||
details: 회원가입, 제한, 워터마크가 없습니다. 무제한으로 PDF를 영원히 무료로 처리하세요.
|
||||
- icon: 🛠️
|
||||
title: 50개 이상의 도구
|
||||
details: 변환, 편집, 병합, 분할, 압축, 서명, OCR 등. 필요한 모든 것을 한곳에서.
|
||||
|
||||
- icon: 🌐
|
||||
title: 직접 호스팅 가능
|
||||
details: 자체 인프라에 배포하세요. Docker, Vercel, Netlify, AWS는 물론, 셀프 호스팅 OCR 워커, 언어 데이터, 텍스트 레이어 글꼴을 갖춘 완전 폐쇄망 환경까지 지원합니다.
|
||||
---
|
||||
|
||||
## 오프라인 OCR
|
||||
|
||||
폐쇄망이나 오프라인 환경에서 BentoPDF를 직접 호스팅하는 경우, OCR에는 Tesseract 워커와 traineddata 파일 외에도 필요한 것이 있습니다. 검색 가능한 PDF를 만들려면 OCR 텍스트 레이어 글꼴도 내부에서 제공해야 합니다.
|
||||
`VITE_OCR_FONT_BASE_URL`, 번들된 `ocr-fonts/` 디렉터리, 업데이트된 폐쇄망 워크플로를 포함한 전체 설정은 [셀프 호스팅](/ko/self-hosting/)을 참고하세요.
|
||||
@@ -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](/ko/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 서명 또는 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`로 끝난다면, 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/octet-stream`이 아니라 `application/javascript`여야 합니다.
|
||||
|
||||
### 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` 같은 LAN IP는 대체로 HTTPS가 필요합니다. 헤더가 있는데도 `window.crossOriginIsolated`가 계속 `false`라면, 페이지가 루프백이 아닌 origin에서 일반 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 응답 헤더 정책을 만드세요:
|
||||
|
||||
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단계: 사용자 지정 오류 페이지
|
||||
|
||||
SPA 라우팅을 위해 404가 `index.html`을 반환하도록 설정하세요:
|
||||
|
||||
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 저장소를 연결합니다
|
||||
|
||||
## 빌드 설정
|
||||
|
||||
| 설정 | 값 |
|
||||
| ------------------ | --------------- |
|
||||
| 프레임워크 프리셋 | None |
|
||||
| 빌드 명령어 | `npm run build` |
|
||||
| 빌드 출력 디렉터리 | `dist` |
|
||||
| 루트 디렉터리 | `/` |
|
||||
|
||||
## 환경 변수
|
||||
|
||||
Settings → Environment variables에서 다음을 추가하세요:
|
||||
|
||||
| 변수 | 값 |
|
||||
| ----------------------- | ------------------------------------- |
|
||||
| `NODE_VERSION` | `18` |
|
||||
| `SIMPLE_MODE` | `false` (선택) |
|
||||
| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 (선택) |
|
||||
| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 (선택) |
|
||||
| `VITE_FOOTER_TEXT` | 사용자 지정 푸터/저작권 텍스트 (선택) |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어, 예: `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 엔진이 초기화되지 못합니다.
|
||||
:::
|
||||
|
||||
SPA 라우팅을 위해 `_redirects`를 만드세요:
|
||||
|
||||
```
|
||||
/* /index.html 200
|
||||
```
|
||||
|
||||
## 사용자 지정 도메인
|
||||
|
||||
1. Pages 프로젝트로 이동합니다
|
||||
2. "Custom domains"를 클릭합니다
|
||||
3. 도메인을 추가합니다
|
||||
4. 도메인이 Cloudflare에 있으면 Cloudflare가 DNS를 자동으로 설정합니다
|
||||
|
||||
## 장점
|
||||
|
||||
- **무료 무제한 대역폭**
|
||||
- 300개 이상의 엣지 로케이션을 갖춘 **글로벌 CDN**
|
||||
- **자동 HTTPS**
|
||||
- 풀 리퀘스트용 **미리보기 배포**
|
||||
- **빠른 빌드**
|
||||
|
||||
## 문제 해결
|
||||
|
||||
### 대용량 파일 업로드
|
||||
|
||||
Cloudflare Pages는 최대 25MB 파일을 지원합니다. WASM 모듈은 문제없겠지만 제한에 걸린다면 다음을 고려하세요:
|
||||
|
||||
```bash
|
||||
# Split large files during build
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Worker 크기 제한
|
||||
|
||||
고급 라우팅에 Cloudflare Workers를 사용하는 경우, 무료 플랜에는 1MB 제한이 있다는 점에 유의하세요.
|
||||
|
||||
## 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. 이 요청은 필요한 `Access-Control-Allow-Origin` 헤더를 추가하는 CORS 프록시를 거칩니다
|
||||
4. 프록시가 인증서 데이터를 브라우저에 반환합니다
|
||||
|
||||
## CORS 프록시 직접 호스팅하기
|
||||
|
||||
BentoPDF를 직접 호스팅한다면, 체인 가져오기가 필요한 인증서로 디지털 서명이 작동하도록 자체 CORS 프록시를 배포해야 합니다.
|
||||
|
||||
### 옵션 1: Cloudflare Workers (권장)
|
||||
|
||||
1. **Wrangler CLI 설치**:
|
||||
|
||||
```bash
|
||||
npm install -g wrangler
|
||||
```
|
||||
|
||||
2. **Cloudflare에 로그인**:
|
||||
|
||||
```bash
|
||||
wrangler login
|
||||
```
|
||||
|
||||
3. **BentoPDF를 클론하고 허용 origin 업데이트**:
|
||||
|
||||
```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에는 여러 보안 장치가 있습니다:
|
||||
|
||||
| 기능 | 설명 |
|
||||
| ----------------------- | --------------------------------------------------------------------------- |
|
||||
| **Origin 검증** | `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 오류 시 fail open) |
|
||||
| **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 프록시가 origin을 거부함**: `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 변환)는 `SharedArrayBuffer` 지원을 위해 다음 HTTP 헤더가 필요합니다:
|
||||
>
|
||||
> - `Cross-Origin-Opener-Policy: same-origin`
|
||||
> - `Cross-Origin-Embedder-Policy: require-corp`
|
||||
>
|
||||
> 페이지는 보안 컨텍스트에서 제공되어야 합니다. `http://localhost`는 로컬 테스트에서 작동하지만, `http://192.168.x.x` 같은 LAN IP는 대체로 해당되지 않으므로 헤더가 있어도 일반 HTTP로는 Office 변환이 실패합니다.
|
||||
>
|
||||
> 공식 컨테이너 이미지에는 이 헤더가 포함되어 있습니다. 리버스 프록시(Traefik, Caddy 등)를 사용한다면 이 헤더가 유지되거나 추가되도록 하고, 루프백이 아닌 접근에는 HTTPS를 사용하세요.
|
||||
|
||||
> [!TIP]
|
||||
> **Podman 사용자:** 모든 `docker` 명령은 `docker`를 `podman`으로, `docker-compose`를 `podman-compose`로 바꾸면 Podman에서도 작동합니다.
|
||||
|
||||
## 빠른 시작
|
||||
|
||||
> [!TIP]
|
||||
> BentoPDF는 두 가지 빌드로 제공됩니다:
|
||||
>
|
||||
> - **셀프 호스팅 빌드**: `ghcr.io/alam00000/bentopdf-simple:latest`. 마케팅 요소(히어로, FAQ, 후기, 푸터)를 **제외한** 모든 PDF 도구를 제공합니다. 내부/팀/조직 배포에 사용하세요. 기능이 줄어든 "라이트" 버전이 **아닙니다**.
|
||||
> - **상용 빌드**: `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 워커 스크립트 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` | UI에 표시할 OCR 언어 (쉼표로 구분) | _(비어 있음, 전체 목록 표시)_ |
|
||||
| `VITE_OCR_FONT_BASE_URL` | OCR 텍스트 레이어 글꼴 디렉터리 | _(비어 있음, 원격 Noto 글꼴 URL 사용)_ |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어 | `en` |
|
||||
| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 | `BentoPDF` |
|
||||
| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 | `images/favicon-no-bg.svg` |
|
||||
| `VITE_FOOTER_TEXT` | 사용자 지정 푸터/저작권 텍스트 | `© 2026 BentoPDF. All rights reserved.` |
|
||||
| `DISABLE_TOOLS` | 숨길 도구 ID (쉼표로 구분) | _(비어 있음, 모든 도구 활성화)_ |
|
||||
| `DISABLE_GITHUB_STARS` | 페이지 로드 시 GitHub 스타 수 가져오기를 건너뛰고 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 이미지에는 적용(enforcing) 모드의 `Content-Security-Policy` 헤더가 포함되어 있습니다. CSP의 `script-src`, `connect-src`, `font-src` 지시어는 위의 `VITE_*` URL 변수로부터 **빌드 시점에 생성**됩니다. `--build-arg`로 전달하는 호스트는 자동으로 정책에 추가됩니다.
|
||||
|
||||
그 결과:
|
||||
|
||||
- 빌드 시 `VITE_CORS_PROXY_URL` 또는 `VITE_WASM_*_URL`을 덮어쓰면 CSP가 해당 origin을 자동으로 허용합니다. 별도 설정이 필요 없습니다.
|
||||
- `cdn.jsdelivr.net`의 URL에 대해 `script-src`는 전체 CDN이 아니라 버전이 명시된 정확한 패키지 폴더만 허용합니다. 예: `https://cdn.jsdelivr.net/npm/@bentopdf/pymupdf-wasm@0.11.16/`. jsDelivr는 모든 공개 npm 패키지와 GitHub 저장소를 제공하므로 호스트 전체를 허용하면 그 어떤 것도 사용자의 인스턴스에서 실행될 수 있기 때문입니다. 다른 호스트의 URL은 origin 단위로 허용됩니다.
|
||||
- 앱 내 고급 설정 페이지에서 _런타임에_ 사용자 지정 WASM URL을 설정하면 해당 origin은 CSP에 **포함되지 않으며** 브라우저가 해당 가져오기를 차단합니다. `cdn.jsdelivr.net`의 같은 패키지라도 다른 버전이면 마찬가지인데, 빌드 시 설정한 버전만 허용되기 때문입니다. 런타임 설정은 실험용입니다. 영구적인 사용자 지정 URL은 해당 `VITE_*` 빌드 인수를 설정하세요.
|
||||
- 세 가지 `VITE_WASM_*_URL` 값을 모두 덮어쓰는 폐쇄망 배포는 해당 `cdn.jsdelivr.net` 패키지 폴더도 CSP에서 제거됩니다 (각 기본값은 추가되는 것이 아니라 대체됩니다). `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을 쓰려면 세 가지를 함께 설정하세요. 워커, 코어 런타임, traineddata 디렉터리가 서로 일치해야 하므로 일부만 덮어쓰는 것은 거부됩니다. 완전히 오프라인으로 검색 가능한 PDF를 만들려면 `VITE_OCR_FONT_BASE_URL`도 설정하여 OCR 텍스트 레이어 글꼴을 공개 Noto 글꼴 URL 대신 내부 서버에서 불러오도록 하세요.
|
||||
|
||||
`VITE_DEFAULT_LANGUAGE`는 처음 방문하는 사용자의 UI 언어를 설정합니다. 지원되는 값: `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 로고, 이름, 푸터 텍스트를 직접 만든 것으로 바꾸세요. 로고 파일을 `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 모두에서 작동하며 다른 모든 빌드 시점 옵션과 함께 사용할 수 있습니다.
|
||||
|
||||
### 특정 도구 비활성화
|
||||
|
||||
규정 준수나 보안 요구 사항에 따라 UI에서 도구를 숨길 수 있습니다. 비활성화된 도구는 홈페이지, 검색 결과, 키보드 단축키, 워크플로 빌더에서 제거됩니다. 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`, `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 스타 카운터 비활성화
|
||||
|
||||
내비게이션 바에는 페이지 로드 시 `api.github.com`에서 가져오는 실시간 GitHub 스타 수가 표시됩니다. PDF 기능과 무관한 유일한 외부 요청입니다. 빌드 시 비활성화하면 번들에서 가져오기 코드가 제거되고 Content-Security-Policy에서 `api.github.com`이 제거됩니다:
|
||||
|
||||
```bash
|
||||
docker build --build-arg DISABLE_GITHUB_STARS=true -t bentopdf .
|
||||
```
|
||||
|
||||
Simple Mode 빌드(`bentopdf-simple`)는 항상 스타 카운터를 건너뜁니다. 이 플래그는 상용 빌드나 사용자 지정 전체 빌드에서만 필요합니다.
|
||||
|
||||
### 사용자 지정 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)
|
||||
|
||||
특정 비루트 사용자로 실행해야 하는 환경(NAS 기기, 보안 컨텍스트가 있는 Kubernetes, 조직 정책 등)을 위해 BentoPDF는 LSIO 방식의 PUID/PGID를 지원하는 별도의 Dockerfile을 제공합니다.
|
||||
|
||||
### 빌드 및 실행
|
||||
|
||||
```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)는 인기 있는 공유 호스팅 제공업체입니다. 이 가이드는 Hostinger 공유 호스팅에 BentoPDF를 배포하는 방법을 다룹니다.
|
||||
|
||||
## 사전 요구 사항
|
||||
|
||||
- 파일 관리자에 접근할 수 있는 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는 SPA 라우팅이 아니라 정적 HTML 파일을 사용합니다:
|
||||
|
||||
```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`. 마케팅 요소(히어로, FAQ, 후기, 푸터)를 **제외한** 모든 PDF 도구를 제공합니다. 내부/팀/조직 배포에 사용하세요. 기능이 줄어든 "라이트" 버전이 **아닙니다**.
|
||||
> - **상업용 빌드**: `ghcr.io/alam00000/bentopdf:latest`. 전체 마케팅 사이트를 포함하며 bentopdf.com 자체와, 공개 서비스를 운영하는 상업용 라이선스 보유자가 사용합니다.
|
||||
>
|
||||
> 잘 모르겠다면 셀프 호스팅 빌드를 받으세요.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Office 파일 변환에는 `SharedArrayBuffer`가 필요하며, 이를 위해 앱이 교차 출처 격리되어 있고 보안 컨텍스트에서 제공되어야 합니다. 공식 이미지는 필요한 COOP/COEP 헤더를 이미 전송하지만, `http://192.168.x.x` 같은 일반 HTTP 로컬 네트워크 출처에서는 브라우저가 여전히 `SharedArrayBuffer`를 비활성화합니다.
|
||||
>
|
||||
> `http://localhost`는 같은 기기에서 테스트할 때만 사용하세요. 사용자가 LAN 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 배포 가이드](/ko/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를 상용 제품에 포함하는 상업용 라이선스 보유자인 경우
|
||||
|
||||
**그대로 실행** (BentoPDF 브랜딩, 빌드를 미리 확인할 때 유용):
|
||||
|
||||
```bash
|
||||
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
|
||||
```
|
||||
|
||||
**자체 브랜드로 빌드** (일반적인 상업용 워크플로):
|
||||
|
||||
```bash
|
||||
docker build \
|
||||
--build-arg VITE_BRAND_NAME="AcmePDF" \
|
||||
--build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \
|
||||
--build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. All rights reserved." \
|
||||
-t acmepdf .
|
||||
|
||||
docker run -p 3000:8080 acmepdf
|
||||
```
|
||||
|
||||
다른 모든 빌드 시점 옵션(`BASE_URL`, `VITE_DEFAULT_LANGUAGE`, `DISABLE_TOOLS`, WASM URL 재정의 등)은 셀프 호스팅 빌드와 같은 방식으로 작동합니다.
|
||||
|
||||
::: warning 라이선스
|
||||
상업용 빌드는 BentoPDF의 두 가지 라이선스 옵션 중 어느 쪽으로든 실행할 수 있습니다.
|
||||
|
||||
- **AGPL-3.0** (무료): 브랜딩 수정과 주변 비즈니스 로직을 포함한 전체 소스 코드를 AGPL로 공개하는 배포에서 허용됩니다.
|
||||
- **상업용 라이선스** ($79 평생): 브랜딩 포크나 비즈니스 코드를 오픈소스로 공개하지 않는 비공개/독점 배포에 필요합니다.
|
||||
|
||||
전체 비교는 [라이선스 페이지](https://www.bentopdf.com/licensing)를 참고하세요. AGPL 라이선스의 WASM 모듈(PyMuPDF, Ghostscript, CoherentPDF)은 런타임에 CDN에서 로드되므로 이미지에 포함되지 않으며 라이선스 상태에 영향을 주지 않습니다.
|
||||
:::
|
||||
|
||||
### Base URL
|
||||
|
||||
하위 디렉터리에 배포합니다.
|
||||
|
||||
```bash
|
||||
BASE_URL=/pdf-tools/ npm run build
|
||||
```
|
||||
|
||||
### 사용자 지정 브랜딩
|
||||
|
||||
기본 BentoPDF 로고, 이름, 푸터 텍스트를 빌드 시점에 직접 만든 것으로 바꿉니다.
|
||||
|
||||
| 변수 | 설명 | 기본값 |
|
||||
| ------------------ | ---------------------------------- | --------------------------------------- |
|
||||
| `VITE_BRAND_NAME` | 헤더와 푸터에 표시되는 브랜드 이름 | `BentoPDF` |
|
||||
| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 | `images/favicon-no-bg.svg` |
|
||||
| `VITE_FOOTER_TEXT` | 사용자 지정 푸터/저작권 텍스트 | `© 2026 BentoPDF. All rights reserved.` |
|
||||
|
||||
```bash
|
||||
# Place your logo in public/, then build
|
||||
VITE_BRAND_NAME="AcmePDF" \
|
||||
VITE_BRAND_LOGO="images/acme-logo.svg" \
|
||||
VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \
|
||||
npm run build
|
||||
```
|
||||
|
||||
또는 Docker로:
|
||||
|
||||
```bash
|
||||
docker build \
|
||||
--build-arg VITE_BRAND_NAME="AcmePDF" \
|
||||
--build-arg VITE_BRAND_LOGO="images/acme-logo.svg" \
|
||||
--build-arg VITE_FOOTER_TEXT="© 2026 Acme Corp. Internal use only." \
|
||||
-t acmepdf .
|
||||
```
|
||||
|
||||
브랜딩은 전체 모드와 Simple Mode 모두에서 작동하며, 다른 모든 빌드 시점 옵션(`BASE_URL`, `SIMPLE_MODE`, `VITE_DEFAULT_LANGUAGE`)과 함께 사용할 수 있습니다.
|
||||
|
||||
### 특정 도구 비활성화
|
||||
|
||||
규정 준수나 보안을 위해 개별 도구를 숨깁니다. 비활성화된 도구는 홈페이지, 검색, 단축키, 워크플로 빌더, 직접 URL 접근에서 제거됩니다.
|
||||
|
||||
도구 ID는 `.html`을 뺀 페이지 URL입니다. 아무 도구나 열어 URL을 확인하세요(예: `edit-pdf`, `sign-pdf`, `encrypt-pdf`).
|
||||
|
||||
**빌드 시점** (번들에 포함됨):
|
||||
|
||||
```bash
|
||||
DISABLE_TOOLS="edit-pdf,sign-pdf" npm run build
|
||||
```
|
||||
|
||||
**런타임** (재빌드 불필요, `config.json`을 마운트):
|
||||
|
||||
```json
|
||||
{
|
||||
"disabledTools": ["edit-pdf", "sign-pdf"]
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run -d -p 3000:8080 \
|
||||
-v ./config.json:/usr/share/nginx/html/config.json:ro \
|
||||
ghcr.io/alam00000/bentopdf-simple:latest
|
||||
```
|
||||
|
||||
두 방법을 함께 사용할 수 있으며 목록이 병합됩니다.
|
||||
|
||||
`config.json`에 `editorDisabledCategories`를 추가하면 도구 전체를 비활성화하지 않고 PDF 편집기 내부의 특정 기능(예: 교정)만 비활성화할 수도 있습니다. 전체 카테고리 목록은 [Docker 가이드](/ko/self-hosting/docker#에디터-기능-비활성화)를 참고하세요.
|
||||
|
||||
## 배포 가이드
|
||||
|
||||
플랫폼을 선택하세요.
|
||||
|
||||
- [Vercel](/ko/self-hosting/vercel)
|
||||
- [Netlify](/ko/self-hosting/netlify)
|
||||
- [Cloudflare Pages](/ko/self-hosting/cloudflare)
|
||||
- [AWS S3 + CloudFront](/ko/self-hosting/aws)
|
||||
- [Hostinger](/ko/self-hosting/hostinger)
|
||||
- [Nginx](/ko/self-hosting/nginx)
|
||||
- [Apache](/ko/self-hosting/apache)
|
||||
- [Docker](/ko/self-hosting/docker)
|
||||
- [Kubernetes](/ko/self-hosting/kubernetes)
|
||||
- [CORS 프록시](/ko/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`에서 제공되어야 합니다. LAN IP의 일반 HTTP(예: `http://192.168.x.x`)는 보안 컨텍스트로 인정되지 않으며, 브라우저가 `SharedArrayBuffer`를 비활성화합니다.
|
||||
|
||||
`00 61 73 6d / 1f 8b 08 08` 불일치는 별도의 하위 증상입니다. 미리 압축된 `.wasm.gz` / `.data.gz` 파일에 `Content-Encoding: gzip` 응답 헤더가 없어서 브라우저가 압축 해제된 WASM이 아닌 원시 gzip 바이트를 받는 것입니다.
|
||||
|
||||
**해결**: 정확한 설정은 플랫폼별 배포 가이드를 참고하세요.
|
||||
|
||||
- [Nginx →](/ko/self-hosting/nginx#word-odt-excel을-pdf로-변환이-작동하지-않음)
|
||||
- [Apache →](/ko/self-hosting/apache#word-odt-excel을-pdf로-변환이-작동하지-않음)
|
||||
- [AWS S3 + CloudFront →](/ko/self-hosting/aws#_3b단계-응답-헤더-정책-libreoffice-wasm에-필수)
|
||||
- [Cloudflare Pages →](/ko/self-hosting/cloudflare#설정-파일) (`_headers` 파일)
|
||||
- [Netlify →](/ko/self-hosting/netlify#word-odt-excel을-pdf로-변환이-55-에서-멈춤) (`netlify.toml`)
|
||||
- [Vercel →](/ko/self-hosting/vercel#word-odt-excel을-pdf로-변환이-작동하지-않음) (`vercel.json`)
|
||||
- [Hostinger →](/ko/self-hosting/hostinger#libreoffice-도구가-작동하지-않음) (`.htaccess`)
|
||||
- [Kubernetes →](/ko/self-hosting/kubernetes#sharedarraybuffer-헤더가-계속-작동하는지-확인-ingress-gateway)
|
||||
- **Docker**: 번들된 nginx 설정이 자동으로 처리하므로 별도 조치가 필요 없습니다.
|
||||
|
||||
**확인**: 아무 BentoPDF 페이지에서 DevTools 콘솔을 열고 다음을 실행하세요.
|
||||
|
||||
```js
|
||||
console.log(window.crossOriginIsolated); // should be true
|
||||
console.log(typeof SharedArrayBuffer); // should be "function"
|
||||
```
|
||||
|
||||
페이지가 HTTPS 또는 `http://localhost`이고 모든 응답에 COEP/COOP 헤더가 모두 있으면 두 검사 모두 통과합니다. `http://192.168.x.x` 같은 루프백이 아닌 HTTP 출처라면 HTTPS로 종단 처리하세요. 헤더만으로 해결할 방법은 없습니다.
|
||||
|
||||
### `.mjs` 파일이 `application/octet-stream`으로 제공됨
|
||||
|
||||
**증상**: PDF 서명 / 양식 작성기 / 일부 다른 도구에서 뷰어가 비어 있거나 로드에 실패합니다. 브라우저 콘솔에 다음이 보고됩니다.
|
||||
|
||||
> `Failed to load module script: The server responded with a non-JavaScript MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.`
|
||||
|
||||
**원인**: 웹 서버나 리버스 프록시에 `.mjs` 파일의 MIME 타입 매핑이 없습니다(내장 PDF 뷰어는 이 확장자의 ES 모듈을 포함합니다). 많은 기본 서버 설정은 인식하지 못하는 확장자를 `application/octet-stream`으로 처리하며, 브라우저는 이를 ES 모듈로 실행하지 않습니다.
|
||||
|
||||
**해결**: 정확한 스니펫은 플랫폼별 배포 가이드를 참고하세요.
|
||||
|
||||
- [Nginx →](/ko/self-hosting/nginx#pdf-서명-또는-양식-작성기에-빈-뷰어가-표시됨-mjs-mime-오류)
|
||||
- [Apache →](/ko/self-hosting/apache#pdf-서명-또는-form-filler에-빈-뷰어가-표시됨-mjs-mime-오류)
|
||||
- [AWS S3 + CloudFront →](/ko/self-hosting/aws#_2단계-빌드-및-업로드) (`aws s3 cp ... --include "*.mjs"` 참고)
|
||||
- [Kubernetes →](/ko/self-hosting/kubernetes#mjs-mime-타입-오류-pdf-서명-양식-작성기-iframe이-비어-있음)
|
||||
- **Docker, Vercel, Netlify, Cloudflare Pages, Hostinger**: 자동으로 처리되므로 별도 조치가 필요 없습니다.
|
||||
|
||||
**확인**: DevTools → 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_*` 변수를 비워 두고 기본 온라인 에셋을 사용하거나, 셀프 호스팅/오프라인 OCR을 위해 worker/core/lang URL을 함께 설정하세요. 특정 OCR 언어만 번들한다면 `VITE_TESSERACT_AVAILABLE_LANGUAGES`에도 같은 쉼표 구분 코드를 설정하세요. 그러면 UI가 설치된 언어만 제공하고, 지원되지 않는 선택은 설명이 포함된 오류로 실패합니다. 완전 오프라인으로 검색 가능한 PDF를 출력하려면 번들된 OCR 글꼴을 제공하는 내부 디렉터리를 `VITE_OCR_FONT_BASE_URL`로 설정하세요.
|
||||
|
||||
사용자는 UI의 **고급 설정**에서 언제든지 이 기본값을 재정의할 수도 있습니다. 브라우저에 저장된 사용자 재정의가 환경 기본값보다 우선합니다.
|
||||
|
||||
### 폐쇄망 / 오프라인 배포
|
||||
|
||||
인터넷에 접속할 수 없는 네트워크(정부, 의료, 금융 등)를 위한 방법입니다. 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 활성화 | off |
|
||||
| `--base-url <path>` | 하위 디렉터리 기본 URL (예: `/pdf/`) | `/` |
|
||||
| `--language <code>` | 기본 UI 언어 (예: `fr`, `de`) | _(없음)_ |
|
||||
| `--brand-name <name>` | 사용자 지정 브랜드 이름 | _(없음)_ |
|
||||
| `--brand-logo <path>` | `public/` 기준 로고 경로 | _(없음)_ |
|
||||
| `--footer-text <text>` | 사용자 지정 푸터 텍스트 | _(없음)_ |
|
||||
| `--ocr-languages <list>` | 번들할 OCR 언어(쉼표로 구분) | `eng` |
|
||||
| `--list-ocr-languages` | 지원되는 OCR 코드와 이름을 출력하고 종료 | off |
|
||||
| `--search-ocr-language <term>` | 이름이나 약어로 OCR 코드 검색 | off |
|
||||
| `--dockerfile <path>` | 사용할 Dockerfile | `Dockerfile` |
|
||||
| `--skip-docker` | Docker 빌드와 내보내기 건너뛰기 | off |
|
||||
| `--skip-wasm` | WASM 다운로드 건너뛰기 (기존 `.tgz` 파일 재사용) | off |
|
||||
|
||||
대화형 프롬프트에서도 `list`를 입력하면 지원되는 전체 Tesseract 코드 목록을 출력하고, `search <term>`을 입력하면 `search german`이나 `search chi` 같은 일치 항목을 찾을 수 있습니다.
|
||||
|
||||
::: warning 동일 출처 요구 사항
|
||||
WASM 파일은 BentoPDF 앱과 **같은 출처**에서 제공되어야 합니다. 웹 워커는 다른 출처의 스크립트를 로드할 수 없는 `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
|
||||
```
|
||||
|
||||
`.../ocr/worker.min.js`, `.../ocr/core`, `.../ocr/lang-data`, `.../ocr/fonts`를 포함해 2단계에서 구성한 URL로 파일에 접근할 수 있는지 확인하세요.
|
||||
|
||||
</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 Proxy 가이드](https://github.com/alam00000/bentopdf/blob/main/cloudflare/WASM-PROXY.md)를 참고하세요.
|
||||
|
||||
::: tip 왜 분리했나요?
|
||||
이렇게 분리하면 다음이 보장됩니다.
|
||||
|
||||
- 상업용 사용자를 위한 명확한 법적 준수
|
||||
- BentoPDF 코어가 듀얼 라이선스(AGPL-3.0 / 상업용)를 유지
|
||||
- WASM 파일은 소스에 번들되지 않고 런타임에 로드됨
|
||||
:::
|
||||
|
||||
## 시스템 요구 사항
|
||||
|
||||
| 요구 사항 | 최소 사양 |
|
||||
| --------- | ------------------------------- |
|
||||
| 저장 공간 | 약 100 MB (AGPL 모듈 제외 코어) |
|
||||
| RAM | 512 MB |
|
||||
| CPU | 최신 프로세서 아무거나 |
|
||||
|
||||
::: tip
|
||||
BentoPDF는 정적 사이트이므로 데이터베이스나 백엔드 서버가 필요 없습니다!
|
||||
:::
|
||||
@@ -0,0 +1,211 @@
|
||||
# Kubernetes로 배포하기
|
||||
|
||||
정적 사이트에 Kubernetes는 과할 수 있지만, 이미 Helm + GitOps를 표준으로 사용하고 있다면 잘 맞을 수 있습니다.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Office 파일 변환에 필요한 헤더**
|
||||
>
|
||||
> LibreOffice 기반 도구(Word, Excel, PowerPoint 변환)에는 `SharedArrayBuffer` 지원을 위해 다음 HTTP 헤더가 필요합니다.
|
||||
>
|
||||
> - `Cross-Origin-Opener-Policy: same-origin`
|
||||
> - `Cross-Origin-Embedder-Policy: require-corp`
|
||||
>
|
||||
> 공식 BentoPDF nginx 이미지에는 이 헤더가 포함되어 있습니다. Kubernetes에서는 **Ingress/Gateway 컨트롤러도 리버스 프록시**이므로 이 헤더가 유지되는지 확인하거나 엣지에서 추가하세요.
|
||||
|
||||
## 사전 준비
|
||||
|
||||
- Kubernetes 클러스터
|
||||
- Helm v3
|
||||
- **8080 포트**로 서비스하는 BentoPDF nginx 이미지 (예: `ghcr.io/alam00000/bentopdf:<tag>`)
|
||||
|
||||
## Helm으로 배포
|
||||
|
||||
### 이 저장소에서 설치 (로컬 차트)
|
||||
|
||||
```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 차트)
|
||||
|
||||
차트가 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
|
||||
```
|
||||
|
||||
## 외부에 노출하기
|
||||
|
||||
### 포트 포워딩 (빠른 테스트)
|
||||
|
||||
```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 (선택 사항)
|
||||
|
||||
이 차트는 Gateway API의 `Gateway`와 `HTTPRoute`를 지원합니다.
|
||||
|
||||
예시 (Cloudflare Gateway API 오퍼레이터):
|
||||
|
||||
```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 서명 / 양식 작성기 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`를 설정할 수 있습니다. DevTools → 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는 `.html`을 뺀 페이지 URL입니다. 아무 도구나 열어 URL을 확인하세요(예: `edit-pdf`, `merge-pdf`, `compress-pdf`). 비활성화된 도구는 홈페이지, 검색, 단축키, 워크플로 빌더, 직접 URL 접근에서 숨겨집니다. 전체 옵션 목록은 [Docker 가이드](/ko/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단계: 빌드 설정 구성
|
||||
|
||||
| 설정 | 값 |
|
||||
| ----------------- | --------------- |
|
||||
| Build command | `npm run build` |
|
||||
| Publish directory | `dist` |
|
||||
| Node version | 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` | 기본 UI 언어 (예: `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%에서 멈추면 DevTools 콘솔을 열고 다음을 확인하세요.
|
||||
|
||||
```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` 헤더가 빠진 것입니다. `soffice.wasm.gz`와 `soffice.data.gz`용 `[[headers]]` 블록이 `netlify.toml`에 있는지 확인하세요.
|
||||
|
||||
### 빌드 실패
|
||||
|
||||
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 서명 또는 양식 작성기에 빈 뷰어가 표시됨 (`.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 서명, 양식 작성기 및 일부 다른 도구에서 사용)는 `.mjs` 확장자의 ES 모듈 파일을 포함하는데, nginx의 기본 `mime.types`에는 이 확장자가 들어 있지 않습니다.
|
||||
|
||||
`/etc/nginx/mime.types`의 기존 `application/javascript` 줄에 `mjs`를 추가해 해결합니다.
|
||||
|
||||
```nginx
|
||||
application/javascript js mjs;
|
||||
```
|
||||
|
||||
> `application/javascript` 줄을 _두 번째로_ 추가하지 마세요. nginx는 `mime.types`를 한 줄씩 파싱하며 타입과 확장자의 매핑은 하나만 적용되므로, 일부 버전에서는 두 번째 줄이 조용히 무시됩니다. 기존 줄을 수정해 `js` 옆에 `mjs`를 추가하세요.
|
||||
|
||||
또는 server 블록 안에서 로컬로 재정의할 수 있습니다(전역 파일 수정 불필요).
|
||||
|
||||
```nginx
|
||||
types {
|
||||
application/javascript js mjs;
|
||||
application/wasm wasm;
|
||||
}
|
||||
```
|
||||
|
||||
변경 후 nginx를 다시 로드합니다.
|
||||
|
||||
```bash
|
||||
sudo nginx -t && sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
확인하려면 브라우저 DevTools → Network 탭에서 실패했던 `.mjs` 요청을 찾아 `Content-Type` 응답 헤더를 확인하세요. 이제 `application/octet-stream`이 아니라 `application/javascript`여야 합니다.
|
||||
|
||||
### Word/ODT/Excel을 PDF로 변환이 작동하지 않음
|
||||
|
||||
LibreOffice WASM에는 `SharedArrayBuffer`가 필요하며, 이를 위해 `Cross-Origin-Embedder-Policy` 및 `Cross-Origin-Opener-Policy` 헤더가 필요합니다. 보안 컨텍스트도 필요하므로 `http://localhost`는 로컬 테스트에서 작동하지만 `http://192.168.x.x` 같은 LAN 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단계: 저장소 포크
|
||||
|
||||
[bentopdf/bentopdf](https://github.com/alam00000/bentopdf)를 GitHub 계정으로 포크합니다.
|
||||
|
||||
### 2단계: Vercel로 가져오기
|
||||
|
||||
1. [vercel.com/new](https://vercel.com/new)로 이동합니다
|
||||
2. 포크한 저장소를 선택합니다
|
||||
3. 프로젝트를 구성합니다.
|
||||
|
||||
| 설정 | 값 |
|
||||
| ---------------- | --------------- |
|
||||
| Framework Preset | Vite |
|
||||
| Build Command | `npm run build` |
|
||||
| Output Directory | `dist` |
|
||||
| Install Command | `npm install` |
|
||||
|
||||
### 3단계: 환경 변수 (선택 사항)
|
||||
|
||||
필요한 경우 다음을 추가합니다.
|
||||
|
||||
| 변수 | 설명 |
|
||||
| ----------------------- | --------------------------------------------------- |
|
||||
| `SIMPLE_MODE` | 최소 UI를 사용하려면 `true`로 설정 |
|
||||
| `VITE_BRAND_NAME` | 사용자 지정 브랜드 이름 ("BentoPDF" 대체) |
|
||||
| `VITE_BRAND_LOGO` | `public/` 기준 로고 경로 (예: `images/my-logo.svg`) |
|
||||
| `VITE_FOOTER_TEXT` | 사용자 지정 바닥글/저작권 텍스트 |
|
||||
| `VITE_DEFAULT_LANGUAGE` | 기본 UI 언어 (예: `fr`, `de`, `es`) |
|
||||
|
||||
### 4단계: 배포
|
||||
|
||||
"Deploy"를 클릭하고 빌드가 끝날 때까지 기다립니다.
|
||||
|
||||
## 사용자 지정 도메인
|
||||
|
||||
1. 프로젝트 설정으로 이동합니다
|
||||
2. "Domains"로 이동합니다
|
||||
3. 사용자 지정 도메인을 추가합니다
|
||||
4. 안내에 따라 DNS를 구성합니다
|
||||
|
||||
## 제한 사항
|
||||
|
||||
::: warning 대용량 파일
|
||||
Vercel의 서버리스 함수에는 50MB 제한이 있습니다. BentoPDF는 정적 사이트이므로 영향을 받지 않아야 하지만, WASM 모듈은 용량이 큽니다(총 약 100MB). `/public` 폴더에서 제공되도록 하세요.
|
||||
:::
|
||||
|
||||
## 문제 해결
|
||||
|
||||
### 빌드 시간 초과
|
||||
|
||||
빌드 시간이 초과되면 다음을 시도해 보세요.
|
||||
|
||||
```json
|
||||
// vercel.json
|
||||
{
|
||||
"buildCommand": "npm run build",
|
||||
"outputDirectory": "dist"
|
||||
}
|
||||
```
|
||||
|
||||
### 새로고침 시 404
|
||||
|
||||
SPA 라우팅을 위해 `vercel.json`을 추가합니다.
|
||||
|
||||
```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" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
확인하려면 DevTools 콘솔을 열고 `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 전체에 파일을 첨부하며, 첨부파일 패널에서 접근할 수 있습니다 |
|
||||
| **페이지 수준** | 페이지 범위 입력으로 지정한 특정 페이지에 파일을 첨부합니다 |
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- PDF 보고서에 원본 데이터(Excel 파일, CSV)를 함께 묶기
|
||||
- 사진 포트폴리오 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부터 시작하려면 0으로 설정합니다.
|
||||
- **떨어진 범위에서 번호 이어가기** -- 규칙이 연속되지 않은 페이지(`1-9,30-40` 또는 `odd` 등)를 대상으로 하며 번호를 순서대로 이어가고 싶을 때 켭니다.
|
||||
- **기존 페이지 레이블 제거** -- 기본으로 선택되어 있습니다. 새 규칙을 적용하기 전에 이전 레이블을 모두 지웁니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 복잡한 번호 체계를 위한 문서당 다중 레이블 규칙
|
||||
- 모든 표준 번호 체계를 포괄하는 여섯 가지 레이블 스타일
|
||||
- 섹션별 레이블을 위한 사용자 지정 접두사 지원
|
||||
- 떨어진 범위에서 이어지는 번호 매기기 지원
|
||||
- 기존 레이블 유지 또는 제거 옵션
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 책의 머리말에는 로마 숫자(i, ii, iii), 본문에는 십진수 레이블 설정
|
||||
- 부록 페이지에 "A-1", "A-2", "B-1", "B-2" 같은 문자 접두사 레이블 지정
|
||||
- 실제 페이지 번호가 PDF 페이지 순서와 맞지 않는 스캔 문서의 페이지 레이블 수정
|
||||
- 기술 문서에 0부터 시작하는 번호 매기기 적용
|
||||
|
||||
## 팁
|
||||
|
||||
- 페이지 레이블은 PDF 뷰어가 탐색 도구 모음에 표시하는 메타데이터입니다. 실제 페이지에는 인쇄되지 않습니다. 눈에 보이는 번호가 필요하면 [페이지 번호](./page-numbers)를 사용하세요.
|
||||
- 이 도구를 사용하려면 WASM 설정에서 CoherentPDF(CPDF)를 구성해야 합니다. 설정되어 있지 않으면 구성하라는 안내가 표시됩니다.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [페이지 번호](./page-numbers)
|
||||
- [베이츠 번호 매기기](./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. **워터마크 추가**를 클릭하여 처리하고 다운로드합니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
**텍스트 워터마크 설정:**
|
||||
|
||||
- **텍스트** -- 워터마크 문구입니다(예: "CONFIDENTIAL", "DRAFT").
|
||||
- **글꼴 크기** -- 10에서 200포인트입니다. 기본값은 72입니다.
|
||||
- **색상** -- 색상 선택기로 원하는 색을 고릅니다.
|
||||
- **불투명도** -- 완전 투명에서 완전 불투명까지 투명도를 조절합니다.
|
||||
- **회전** -- 워터마크 텍스트를 -180도에서 180도까지 회전합니다.
|
||||
|
||||
**이미지 워터마크 설정:**
|
||||
|
||||
- **이미지 업로드** -- 워터마크로 사용할 PNG, JPG 등의 이미지 파일을 업로드합니다.
|
||||
- **불투명도** -- 이미지 투명도를 조절합니다.
|
||||
- **배율** -- 이미지 워터마크의 크기를 조정합니다.
|
||||
|
||||
**레이아웃 설정:**
|
||||
|
||||
- **단일** -- 페이지당 워터마크 하나를 끌어서 또는 위치 프리셋으로 배치합니다.
|
||||
- **타일** -- 회전 각도를 따르는 대각선 격자로 페이지 전체에 워터마크를 반복하여 문서를 가장자리까지 덮습니다.
|
||||
- **가로 간격** -- 텍스트 방향을 따른 타일 사이의 간격으로, 워터마크 너비에 대한 백분율입니다(타일 모드에서만 해당).
|
||||
- **세로 간격** -- 타일 행 사이의 간격으로, 워터마크 높이에 대한 백분율입니다(타일 모드에서만 해당).
|
||||
|
||||
**일반 설정:**
|
||||
|
||||
- **모든 페이지에 적용** -- 선택하면 모든 페이지에 같은 워터마크가 적용됩니다. 선택을 해제하면 페이지별로 워터마크를 설정할 수 있습니다.
|
||||
- **페이지 범위** -- 워터마크를 넣을 페이지를 지정합니다(예: "1-3, 5, 7-9" 또는 "all").
|
||||
|
||||
## 기능
|
||||
|
||||
- 실시간 PDF 미리보기에서 끌어서 놓는 시각적 위치 지정
|
||||
- 모서리 핸들로 크기를 조절할 수 있는 워터마크
|
||||
- 텍스트 및 이미지 워터마크 모드
|
||||
- 간격을 조절할 수 있는 단일 또는 전체 페이지 타일(반복) 레이아웃
|
||||
- 페이지별 또는 전체 워터마크 적용
|
||||
- 미리보기에서 페이지 단위 탐색
|
||||
- 불투명도 및 회전 조절
|
||||
- 페이지 범위 필터링
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 검토용으로 배포하기 전에 초안 문서에 "DRAFT" 표시
|
||||
- 민감한 재무 보고서에 "CONFIDENTIAL" 워터마크 추가
|
||||
- 회사 로고 이미지 워터마크로 문서 브랜딩
|
||||
- 잠재 고객에게 공유하는 제품 문서에 "SAMPLE" 찍기
|
||||
- 배포용 PDF 자료에 저작권 고지 추가
|
||||
|
||||
## 팁
|
||||
|
||||
- 페이지를 대각선으로 가로지르는 워터마크는 회전을 약 45도로 설정하고 글꼴 크기를 키우세요.
|
||||
- 타일 모드는 하나를 지워도 수십 개가 남기 때문에 잘라내기 후 문서를 재사용하기가 훨씬 어려워집니다. 타일을 쓸 때는 아래 텍스트가 읽히도록 불투명도를 낮추세요.
|
||||
- 배경이 투명한 이미지 워터마크(PNG 형식)가 문서 내용과 더 자연스럽게 어우러집니다.
|
||||
- 페이지마다 다른 워터마크 텍스트가 필요하면 "모든 페이지에 적용"을 해제하고 페이지별로 이동하며 설정하세요.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [머리글 및 바닥글](./header-footer)
|
||||
- [도장 추가](./add-stamps)
|
||||
- [베이츠 번호 매기기](./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의 페이지를 교차 배치
|
||||
- 끌어서 놓기로 파일 순서를 바꿔 교차 우선순위 조절
|
||||
- 원본 문서의 북마크 유지
|
||||
- 업로드한 각 파일의 페이지 수와 파일 크기 표시
|
||||
- 전용 웹 워커로 처리하여 반응성이 좋은 UI
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 홀수 페이지와 짝수 페이지를 따로 스캔한 양면 스캔본 재조립
|
||||
- 문제지와 답안지를 합쳐 각 문제 뒤에 답이 오도록 구성
|
||||
- 두 언어 문서를 페이지 단위로 병합(예: 한쪽은 영어, 다음 쪽은 번역)
|
||||
- 단면 스캐너로 스캔한 앞면과 뒷면 교차 배치
|
||||
|
||||
## 팁
|
||||
|
||||
- 원본 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: 베이츠 번호 매기기
|
||||
description: 사용자 지정 템플릿, 자릿수 채우기, 글꼴, 위치를 설정하여 하나 또는 여러 PDF에 베이츠 번호를 적용합니다.
|
||||
---
|
||||
|
||||
# 베이츠 번호 매기기
|
||||
|
||||
베이츠 번호 매기기는 PDF의 모든 페이지에 순차적인 식별 번호를 찍는 방식입니다. 법적 절차, 감사, 규정 준수 업무에서 문서에 번호를 붙이는 표준 방법입니다. 이 도구는 여러 파일, 사용자 지정 템플릿을 지원하며 번호가 매겨진 PDF를 개별 파일이나 하나의 ZIP 아카이브로 만듭니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. PDF 파일을 하나 이상 업로드합니다. 여러 파일을 한 번에 끌어다 놓을 수 있습니다.
|
||||
2. 스타일 프리셋을 고르거나 사용자 지정 템플릿을 만듭니다.
|
||||
3. 위치, 글꼴, 크기, 색상, 시작 번호를 설정합니다.
|
||||
4. **베이츠 번호 적용**을 클릭하여 처리합니다.
|
||||
5. 파일이 하나면 바로 다운로드되고, 여러 개면 ZIP 아카이브로 다운로드됩니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
- **스타일 프리셋** -- 기본 제공 형식 중에서 선택합니다.
|
||||
- 증거 + 사건 + Bates + 페이지 (예: "Exhibit 1 Case XYZ 000001 Page 1")
|
||||
- 증거 + 사건 + Bates (페이지 번호 없음)
|
||||
- 사건 + Bates
|
||||
- Bates 번호만 (예: "000001")
|
||||
- 사용자 지정 (직접 템플릿 작성)
|
||||
- **스타일 사용자 지정** -- 자리 표시자 `[BATES]`, `[PAGE]`, `[FILE]`, `[FILENAME]`을 사용하는 템플릿 문자열입니다.
|
||||
- **베이츠 자릿수** -- 0으로 채운 베이츠 번호의 자릿수(3에서 6)입니다. 사용자 지정 모드에서만 표시됩니다.
|
||||
- **위치** -- 머리글 또는 바닥글, 그리고 왼쪽, 가운데, 오른쪽입니다.
|
||||
- **베이츠 시작 번호** -- 첫 번째 베이츠 번호입니다. 기본값은 1입니다. 번호는 파일을 넘어 이어집니다.
|
||||
- **파일 카운터 시작 번호** -- `[FILE]` 자리 표시자의 시작 번호입니다.
|
||||
- **글꼴** -- Helvetica, Times New Roman 또는 Courier입니다.
|
||||
- **글꼴 크기** -- 찍히는 텍스트의 크기입니다.
|
||||
- **색상** -- 베이츠 번호 텍스트의 색상 선택기입니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 업로드한 모든 파일에 베이츠 번호가 어떻게 표시될지 보여 주는 실시간 미리보기
|
||||
- 문서 간에 번호가 이어지는 다중 파일 지원
|
||||
- 끌어서 놓기로 파일 순서를 바꿔 번호 순서 제어
|
||||
- 여섯 가지 위치 옵션(머리글/바닥글, 왼쪽/가운데/오른쪽)
|
||||
- 페이지 크기에 따라 달라지는 여백을 고려한 적응형 여백 계산
|
||||
- 여러 파일 일괄 처리 시 ZIP 출력
|
||||
- 최대한의 유연성을 위한 템플릿 자리 표시자
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 소송 증거 개시 문서에 순차적인 증거 번호 찍기
|
||||
- 수십 개 파일에 걸친 감사 증빙 패키지에 번호 매기기
|
||||
- 규정 준수 문서에 규제 참조 번호 적용
|
||||
- 특허 출원 첨부 자료에 사건별 식별자 붙이기
|
||||
|
||||
## 팁
|
||||
|
||||
- 처리하기 전에 파일 목록에서 파일을 끌어 순서를 바꾸세요. 베이츠 번호 순서는 이 순서를 따릅니다.
|
||||
- `[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에 삽입됩니다. 페이지 크기는 원본 이미지 크기와 같습니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구는 별도의 품질 설정을 제공하지 않습니다. 이미지는 PDF 안에 원본 해상도의 무손실 PNG로 삽입됩니다.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 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: 시각적 편집기와 CSV/JSON 지원으로 PDF 북마크를 추가, 편집, 가져오기, 내보내기, 삭제합니다.
|
||||
---
|
||||
|
||||
# 북마크 편집
|
||||
|
||||
북마크 편집기를 사용하면 PDF 탐색 북마크(개요라고도 합니다)를 완전히 제어할 수 있습니다. 새 북마크를 추가하고, 기존 북마크를 편집하고, 계층 구조를 재구성하고, 북마크 데이터를 CSV 및 JSON 형식으로 가져오거나 내보낼 수 있습니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 클릭하거나 파일을 드롭 영역으로 끌어다 놓아 PDF를 업로드합니다.
|
||||
2. 필요하면 **기존 북마크 자동 추출**을 선택하여 문서의 현재 북마크 트리를 불러옵니다.
|
||||
3. 편집기가 분할 보기로 열립니다. 왼쪽에는 PDF 뷰어, 오른쪽에는 북마크 패널이 표시됩니다.
|
||||
4. 북마크 제목을 입력하고 **페이지에 추가**를 클릭하면 현재 페이지를 가리키는 새 북마크가 만들어집니다.
|
||||
5. 도구 모음 버튼으로 북마크를 재정렬하거나, 스타일을 지정하거나, 삭제합니다.
|
||||
6. **북마크 포함하여 PDF 저장**을 클릭하여 업데이트된 파일을 다운로드합니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 페이지 이동, 확대/축소 컨트롤, 페이지 이동 입력란이 있는 시각적 PDF 뷰어
|
||||
- 한 번의 클릭으로 모든 페이지에 북마크 추가
|
||||
- PDF를 직접 클릭하여 정확한 북마크 위치 지정(지정 모드)
|
||||
- 드래그 앤 드롭으로 순서를 바꿀 수 있는 중첩 북마크 계층 구조
|
||||
- 일괄 작업: 여러 북마크를 선택하여 색상, 스타일 변경 또는 삭제를 한 번에 처리
|
||||
- 큰 트리에서 항목을 빠르게 찾는 북마크 검색
|
||||
- 모든 변경 사항에 대한 실행 취소 및 다시 실행 지원
|
||||
- CSV(제목, 페이지, 수준) 또는 JSON 파일에서 북마크 가져오기
|
||||
- 외부 편집을 위해 북마크를 CSV 또는 JSON으로 내보내기
|
||||
- 북마크 스타일: 색상(빨강, 파랑, 초록, 노랑, 보라)과 글꼴 스타일(굵게, 기울임, 굵은 기울임)
|
||||
- 빠른 탐색: 페이지 위/아래 키로 페이지 스크롤
|
||||
|
||||
## 옵션
|
||||
|
||||
- **기존 북마크 자동 추출**: 선택하면 로드할 때 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`보다 먼저 옵니다). 올바른 페이지 순서를 위해 파일 이름에 일관된 번호를 붙이세요.
|
||||
- 변환기는 파일 확장자가 아니라 바이너리 시그니처로 이미지 형식을 감지합니다. 실수로 `.jpg`라는 이름이 붙은 PNG도 올바르게 삽입됩니다.
|
||||
- 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)
|
||||
- [PDF OCR](./ocr-pdf)
|
||||
- [PDF 병합](./merge-pdf)
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: PDF 압축
|
||||
description: Hyper Compress 엔진으로 PDF 파일 크기를 최대 90%까지 줄입니다. 목표 파일 크기, 일괄 처리, 사용자 지정 품질 설정을 지원합니다.
|
||||
---
|
||||
|
||||
# PDF 압축
|
||||
|
||||
PDF 파일을 망가뜨리지 않고 줄입니다. PDF 압축은 BentoPDF의 자체 압축 엔진인 [Hyper Compress](https://www.bentopdf.com/hyper-compress)로 구동됩니다. 이미지를 다시 압축하고, 글꼴을 서브셋으로 만들어 병합하며, 내장 썸네일과 비공개 애플리케이션 데이터 같은 불필요한 용량을 제거합니다. 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 유지, 지원하는 PDF 2.0 리더를 위한 Brotli 압축
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 50MB 보고서를 이메일 첨부 한도 이하로 줄이기
|
||||
- 목표 파일 크기로 스캔본을 포털의 엄격한 업로드 한도 이하로 맞추기
|
||||
- 웹사이트 다운로드를 빠르게 하기 위해 마케팅 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개 이상 | 파일당 PDF 하나를 담은 ZIP 아카이브 (`csv-converted.zip`) |
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 내보낸 데이터베이스 보고서를 인쇄 가능한 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. <strong>처리 품질(DPI)</strong>을 선택합니다. 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 이미지 업로드(손글씨 서명, 회사 직인 등)
|
||||
- **텍스트**: 색상과 글꼴 크기를 설정할 수 있는 사용자 지정 텍스트. 이미지나 텍스트를 제공하지 않으면 도구가 인증서의 일반 이름(common name)과 현재 날짜로 텍스트를 자동 생성합니다.
|
||||
|
||||
## 서명 메타데이터
|
||||
|
||||
- **사유**: 문서에 서명한 이유(예: "승인됨", "검토됨")
|
||||
- **위치**: 서명이 이루어진 장소(예: "New York, NY")
|
||||
- **연락처**: 서명자에게 연락하는 방법(예: 이메일 주소)
|
||||
|
||||
## 인터넷 연결 참고
|
||||
|
||||
서명에는 인터넷 연결이 필요할 수 있습니다. 서명 라이브러리가 인증서의 AIA(Authority Information Access) 확장에 포함된 URL에서 인증서 체인을 가져옵니다. 해당 서버에 접속할 수 없으면 체인 검증이 필요한 인증서의 서명이 실패합니다.
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 법적 효력이 있는 디지털 서명으로 계약서, 제안서, 합의서 서명
|
||||
- PKI 기반 인증이 필요한 워크플로에서 공식 문서 인증
|
||||
- 규정 준수를 위한 PDF 청구서 서명(많은 EU 국가가 디지털 서명된 전자 청구서를 요구합니다)
|
||||
- 엔지니어링 도면이나 품질 문서에 조직의 승인 추가
|
||||
|
||||
## 팁
|
||||
|
||||
- 자체 서명 인증서는 테스트에는 쓸 수 있지만 Adobe Reader에서 경고가 표시됩니다. 실제 운영 문서에는 신뢰할 수 있는 인증 기관의 인증서를 사용하세요.
|
||||
- 보이는 서명은 순전히 시각적인 것입니다. 보이는 블록을 켜든 켜지 않든 암호화 서명은 포함됩니다.
|
||||
- 서명 검증 도구로 서명된 PDF를 확인하여 서명이 온전한지 검증하세요.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [서명 검증](./validate-signature-pdf): 서명된 PDF의 디지털 서명 확인
|
||||
- [PDF 평면화](./flatten-pdf): 서명 전에 양식을 평면화하여 수정 방지
|
||||
- [PDF 보호](./protect-pdf): 디지털 서명 위에 비밀번호 보호 추가
|
||||
- [메타데이터 제거](./remove-metadata): 서명 전에 메타데이터 제거
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 페이지 분할
|
||||
description: PDF 페이지를 가로 또는 세로로 더 작은 하위 페이지로 나눕니다.
|
||||
---
|
||||
|
||||
# 페이지 분할
|
||||
|
||||
개별 PDF 페이지를 가로 또는 세로로 잘라 반으로 나눕니다. 한 페이지에 별도의 페이지로 분리해야 할 내용이 들어 있을 때 유용합니다. 예를 들어 2단 레이아웃이 넓은 한 페이지로 스캔된 경우입니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. PDF 파일을 업로드합니다.
|
||||
2. 나누기 방향을 선택합니다. **세로**(왼쪽/오른쪽 절반) 또는 **가로**(위/아래 절반).
|
||||
3. 필요하면 나눌 페이지를 제한하는 페이지 범위를 지정합니다. 비워 두면 모든 페이지를 나눕니다.
|
||||
4. 처리 버튼을 클릭하여 나눈 PDF를 생성합니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 세로 나누기: 각 페이지를 왼쪽과 오른쪽 절반으로 나눔
|
||||
- 가로 나누기: 각 페이지를 위쪽과 아래쪽 절반으로 나눔
|
||||
- 특정 페이지만 선택적으로 나누는 페이지 범위 필터
|
||||
- 대상이 아닌 페이지는 그대로 통과
|
||||
- 다시 렌더링하지 않고 콘텐츠 품질 유지
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 2쪽씩 스캔된 페이지 분리(예: 한 장에 왼쪽과 오른쪽 페이지가 함께 있는 책 스캔)
|
||||
- 내용이 나란히 있는 가로형 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를 올바른 앞면/뒷면 순서로 재정렬합니다.
|
||||
---
|
||||
|
||||
# 양면 스캔 정렬
|
||||
|
||||
양면 스캔 정렬은 하나의 PDF에 두 개의 페이지 블록이 들어 있는 ADF 스캔 워크플로를 위해 설계되었습니다.
|
||||
|
||||
- 모든 앞면이 먼저
|
||||
- 모든 뒷면이 그다음
|
||||
|
||||
수동으로 나누고 다시 조립하는 대신, 이 도구가 두 블록을 자연스러운 읽기 순서(앞면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. 표준 필드(제목, 작성자, 주제, 키워드, 작성 프로그램, PDF 생성기)를 편집합니다.
|
||||
3. 날짜/시간 선택기로 작성일과 수정일을 조정합니다.
|
||||
4. 추가 버튼을 클릭하고 키-값 쌍을 입력하여 사용자 지정 메타데이터 필드를 추가합니다.
|
||||
5. 처리 버튼을 클릭하여 수정된 PDF를 저장합니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 업로드한 PDF의 기존 메타데이터를 모두 미리 채움
|
||||
- 표준 필드: 제목, 작성자, 주제, 키워드, 작성 프로그램, 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 중에서 선택합니다. |
|
||||
| **참조 및 숨은 참조 포함** | 켜짐 | 켜면 참조(CC)와 숨은 참조(BCC) 수신자 목록이 PDF의 이메일 헤더 섹션에 표시됩니다. |
|
||||
| **첨부파일 목록 포함** | 켜짐 | 켜면 이메일의 첨부파일 목록(파일 이름과 크기)이 PDF에 표시됩니다. |
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 규정 준수나 감사를 위해 중요한 업무 서신을 PDF로 보관
|
||||
- 법적 절차나 증거 개시 요청을 위한 이메일 스레드 인쇄
|
||||
- 이메일로 받은 주문 확인서, 영수증, 계약서의 영구 기록 만들기
|
||||
- Outlook이 없어도 읽을 수 있는 형식으로 Outlook MSG 파일 백업
|
||||
- 내보낸 EML 파일로 고객 지원 대화 기록
|
||||
|
||||
## 팁
|
||||
|
||||
- Thunderbird, Apple Mail 등 대부분의 이메일 클라이언트에서 쓰는 EML과 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개 이상 | 파일당 PDF 하나를 담은 ZIP 아카이브 (`excel-converted.zip`) |
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 배포를 위해 재무 보고서나 예산을 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. 필요하면 각 범위를 ZIP 아카이브 안의 별도 PDF로 다운로드하도록 선택합니다.
|
||||
4. 처리 버튼을 클릭합니다. 추출된 페이지가 새 PDF(또는 ZIP)로 다운로드됩니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 유연한 페이지 범위 구문: 개별 페이지, 범위, 쉼표로 구분한 조합
|
||||
- 업로드 후 전체 페이지 수를 표시하여 쉽게 참조
|
||||
- 하나로 합친 PDF 또는 ZIP 안의 개별 파일로 출력하는 옵션
|
||||
- 원본 페이지 내용과 서식 유지
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 긴 보고서에서 요약(처음 몇 페이지) 꺼내기
|
||||
- 교재 PDF에서 한 챕터 추출
|
||||
- 양식 묶음에서 특정 페이지를 독립된 문서로 저장
|
||||
- 큰 파일에서 선택한 페이지로 샘플 문서 만들기
|
||||
|
||||
## 팁
|
||||
|
||||
- 페이지 번호는 1부터 시작합니다. 첫 페이지는 `0`이 아니라 `1`을 사용하세요.
|
||||
- 페이지를 추출하는 대신 제거하려면 반대 작업인 [페이지 삭제](./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`)
|
||||
- **표 여러 개**: `table_1_page3.csv`, `table_2_page5.csv` 같은 이름의 파일을 담은 `filename_tables.zip`
|
||||
|
||||
## 사용 사례
|
||||
|
||||
- 문서 전체의 데이터를 가져오지 않고 긴 PDF 보고서에서 특정 표만 추출
|
||||
- GitHub 이슈, 위키 또는 문서에 바로 붙여 넣을 수 있도록 Markdown 형식으로 표 가져오기
|
||||
- API 연동이나 스크립트를 위해 PDF 표에서 구조화된 JSON 데이터 가져오기
|
||||
- 두 버전을 모두 CSV로 내보내 diff하여 서로 다른 PDF 버전의 표 비교
|
||||
|
||||
## 팁
|
||||
|
||||
- 이 도구는 표 단위로 제어할 수 있습니다. 모든 표를 하나의 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.5 x 11 대신 8.49 x 11.02 인치)
|
||||
|
||||
## 팁
|
||||
|
||||
- 콘텐츠 손실이 없어야 한다면 맞춤 모드를 사용하세요. 채움 모드는 더 깔끔해 보이지만 가장자리가 잘릴 수 있습니다.
|
||||
- 페이지 크기 정보 도구로 결과를 확인하여 모든 페이지가 목표 크기와 일치하는지 점검하세요.
|
||||
- 기본 배경색은 흰색입니다. 문서에 어두운 여백이 있다면 어두운 색으로 바꾸세요.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [페이지 크기 정보](./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 준비하기
|
||||
- 뷰어마다 주석이 다르게 표시되는 문제 해결하기
|
||||
- 서명된 문서가 서명 후 수정되지 않도록 보장하기
|
||||
- 양식 필드 정의와 주석 객체를 제거하여 파일 크기 줄이기
|
||||
|
||||
## 팁
|
||||
|
||||
- 모든 편집이 끝난 뒤에 평탄화하세요. 평탄화를 되돌릴 방법은 없습니다.
|
||||
- 평탄화와 함께 메타데이터, 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: XFA 양식을 포함한 PDF 양식을 내장 뷰어로 브라우저에서 바로 작성합니다.
|
||||
---
|
||||
|
||||
# PDF 양식 작성
|
||||
|
||||
양식 필드가 있는 PDF를 열어 내장 뷰어에서 바로 작성하세요. 표준 AcroForm 필드와 레거시 XFA(XML Forms Architecture) 양식을 모두 지원합니다. 양식 작성을 마치면 클릭 한 번으로 작성된 버전을 다운로드할 수 있습니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 양식 필드가 있는 PDF를 업로드하세요.
|
||||
2. 문서가 통합 PDF 뷰어에서 열리고 양식 필드가 대화형 입력란으로 표시됩니다.
|
||||
3. 텍스트 필드, 체크박스, 드롭다운, 라디오 버튼을 클릭해 내용을 입력하세요.
|
||||
4. **저장 및 작성된 양식 다운로드**를 클릭하면 완성된 PDF를 받을 수 있습니다.
|
||||
|
||||
## 기능
|
||||
|
||||
- 양식 필드를 완전히 조작할 수 있는 내장 PDF.js 뷰어
|
||||
- 표준 AcroForm 필드 지원(텍스트 입력, 체크박스, 드롭다운, 라디오 버튼)
|
||||
- XML 기반 레거시 양식을 위한 XFA 양식 지원
|
||||
- 페이지 크기에 맞춘 뷰어 자동 크기 조정
|
||||
- 이름과 크기 정보가 있는 파일 표시
|
||||
|
||||
## 옵션
|
||||
|
||||
추가 설정 옵션은 없습니다. 양식을 업로드하고 작성한 뒤 다운로드하면 됩니다.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 세금 양식, 보험 신청서, 관공서 서류 작성하기
|
||||
- PDF 첨부파일로 받은 입사 지원서 작성하기
|
||||
- 거래처 온보딩 양식이나 공급업체 설문지 작성하기
|
||||
- 체크박스 필드가 있는 규정 준수 체크리스트 승인하기
|
||||
- 진료 예약 전 문진표 작성하기
|
||||
|
||||
## 팁
|
||||
|
||||
- XFA 양식은 일부 PDF 뷰어에서만 지원되는 레거시 형식입니다. XFA PDF를 Chrome이나 대부분의 다른 도구에서 열었을 때 빈 페이지가 보인다면 해당 뷰어가 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 페이지의 여섯 위치(머리글 왼쪽, 가운데, 오른쪽, 바닥글 왼쪽, 가운데, 오른쪽)에 텍스트를 추가하세요. 페이지 번호와 전체 페이지 수를 나타내는 동적 변수를 지원하므로 "10페이지 중 3페이지"처럼 페이지마다 자동으로 바뀌는 템플릿을 만들 수 있습니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. PDF 파일을 업로드하세요.
|
||||
2. 서식 컨트롤과 여섯 개의 텍스트 입력란이 있는 옵션 패널이 나타납니다.
|
||||
3. 원하는 머리글/바닥글 위치에 텍스트를 입력하세요.
|
||||
4. 동적 페이지 번호에는 `{page}`와 `{total}` 자리 표시자를 사용하세요.
|
||||
5. 글꼴 크기와 글꼴 색상을 조정하고, 필요하면 특정 페이지 범위로 제한하세요.
|
||||
6. **머리글 및 바닥글 추가**를 클릭해 처리하고 다운로드하세요.
|
||||
|
||||
## 옵션
|
||||
|
||||
- **페이지 범위**: 머리글과 바닥글을 넣을 페이지를 제한할 수 있습니다. 비워 두면 모든 페이지에 적용됩니다. 형식: "1-3, 5"(쉼표로 구분한 범위).
|
||||
- **글꼴 크기**: 6~24포인트. 기본값은 10입니다.
|
||||
- **글꼴 색상**: 색상 선택기로 원하는 색을 고르세요.
|
||||
- **머리글 왼쪽 / 가운데 / 오른쪽**: 각 페이지 상단의 텍스트 필드.
|
||||
- **바닥글 왼쪽 / 가운데 / 오른쪽**: 각 페이지 하단의 텍스트 필드.
|
||||
|
||||
## 기능
|
||||
|
||||
- 페이지당 독립적인 여섯 개의 텍스트 위치
|
||||
- 현재 페이지 번호를 넣는 동적 `{page}` 변수
|
||||
- 전체 페이지 수를 넣는 동적 `{total}` 변수
|
||||
- 특정 페이지를 대상으로 하는 페이지 범위 필터링
|
||||
- 글꼴 크기와 색상 사용자 지정
|
||||
- 깔끔하고 전문적인 결과를 위한 Helvetica 글꼴
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 보고서 바닥글 가운데에 "{total}페이지 중 {page}페이지" 추가하기
|
||||
- 머리글 왼쪽에 회사 이름, 머리글 오른쪽에 문서 날짜 넣기
|
||||
- 법률 문서 바닥글에 기밀 유지 고지 추가하기
|
||||
- 특정 페이지 범위에 문서 개정 번호 찍기
|
||||
|
||||
## 팁
|
||||
|
||||
- `{page}`와 `{total}`을 한 필드에 함께 써서 "{total}페이지 중 {page}페이지"나 "{page}/{total}" 같은 형식을 만들 수 있습니다.
|
||||
- 필요한 위치만 채우고 나머지는 비워 두어도 됩니다. 빈 필드는 건너뜁니다.
|
||||
- 이미지나 로고가 들어가는 복잡한 머리글이 필요하면 페이지 상단에 배치한 [워터마크 추가](./add-watermark) 도구를 고려하세요.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [페이지 번호](./page-numbers)
|
||||
- [워터마크 추가](./add-watermark)
|
||||
- [베이츠 번호 매기기](./bates-numbering)
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: HEIC를 PDF로
|
||||
description: iPhone과 iPad의 HEIC 및 HEIF 이미지를 브라우저에서 바로 PDF로 변환합니다.
|
||||
---
|
||||
|
||||
# HEIC를 PDF로
|
||||
|
||||
HEIC/HEIF 이미지를 PDF로 변환합니다. HEIC는 iOS 11 이후 iPhone과 iPad의 기본 사진 형식입니다. 이 도구를 사용하면 데스크톱 소프트웨어를 설치하거나 서버에 파일을 업로드하지 않고도 사진을 PDF로 만들 수 있습니다.
|
||||
|
||||
## 지원 형식
|
||||
|
||||
| 형식 | 확장자 |
|
||||
| :--- | :------ |
|
||||
| HEIC | `.heic` |
|
||||
| HEIF | `.heif` |
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 업로드 영역을 클릭하거나 HEIC/HEIF 파일을 끌어다 놓으세요.
|
||||
2. 파일 목록을 확인하고 필요 없는 파일을 제거하세요.
|
||||
3. **PDF로 변환**을 클릭하세요. 결과는 `from_heic.pdf`로 다운로드됩니다.
|
||||
|
||||
각 HEIC 파일은 heic2any 라이브러리로 디코딩되어 품질 92%의 PNG로 변환됩니다. 이후 PNG는 pdf-lib를 통해 PDF에 삽입되며, 각 이미지는 원본 해상도 그대로 별도 페이지에 들어갑니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 추가 설정이 없습니다. HEIC 이미지는 삽입 전에 높은 품질(0.92)의 PNG로 변환됩니다.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 보험 청구서나 보고서에 첨부할 iPhone 사진으로 PDF 만들기
|
||||
- 부동산 매물용 HEIC 사진을 인쇄 가능한 문서 하나로 변환하기
|
||||
- iPad 스크린샷(HEIF 형식)을 공유 가능한 PDF로 만들기
|
||||
- 여행 일기용 휴가 사진 일괄 변환하기
|
||||
|
||||
## 팁
|
||||
|
||||
- HEIC 디코딩은 WebAssembly를 사용하여 전적으로 브라우저에서 이루어집니다. 디코더를 불러오는 동안 첫 변환은 시간이 조금 걸릴 수 있습니다.
|
||||
- HEIC를 다른 이미지 형식(JPG, PNG 등)과 함께 사용해야 한다면 HEIC를 포함한 모든 형식을 처리하는 [이미지를 PDF로](./image-to-pdf) 도구를 사용하세요.
|
||||
- iPhone의 HEIC 파일에는 GPS 좌표를 포함한 EXIF 데이터가 들어 있는 경우가 많습니다. 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는 PDF 작업을 위한 **130개 이상의 도구**를 제공합니다. 모든 도구는 전적으로 브라우저에서 실행되므로 파일이 기기 밖으로 나가지 않습니다.
|
||||
|
||||
---
|
||||
|
||||
## 편집 및 주석
|
||||
|
||||
다양한 편집 도구로 PDF 문서를 수정하고, 표시하고, 보강하세요.
|
||||
|
||||
<div class="tool-grid">
|
||||
|
||||
- [**PDF 편집기**](./edit-pdf): 주석, 하이라이트, 교정(가리기), 댓글, 도형/이미지 추가, 검색, PDF 보기.
|
||||
- [**북마크 편집**](./bookmark): PDF 북마크를 추가, 편집, 가져오기, 삭제, 추출합니다.
|
||||
- [**목차 생성**](./table-of-contents): PDF 북마크로 목차 페이지를 생성합니다.
|
||||
- [**페이지 번호**](./page-numbers): 문서에 페이지 번호를 삽입합니다.
|
||||
- [**페이지 레이블 추가**](./add-page-labels): 로마 숫자, 접두사, 사용자 지정 시작 번호로 PDF 페이지 레이블을 적용합니다.
|
||||
- [**베이츠 번호 매기기**](./bates-numbering): 하나 이상의 PDF 파일에 연속된 베이츠 번호를 추가합니다.
|
||||
- [**워터마크 추가**](./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): 만화 리더와 Calibre용으로 PDF를 CBZ(만화책 아카이브)로 변환합니다.
|
||||
- [**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): RAG/LLM 파이프라인용으로 PDF 내용을 LlamaIndex JSON으로 추출합니다.
|
||||
- [**PDF를 텍스트로**](./pdf-to-text): PDF 파일에서 텍스트를 추출해 일반 텍스트로 저장합니다.
|
||||
- [**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의 사용자 권한을 설정하거나 변경합니다.
|
||||
- [**PDF 디지털 서명**](./digital-sign-pdf): X.509 인증서로 암호화 디지털 서명을 추가합니다.
|
||||
- [**PDF 서명 검증**](./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뿐 아니라 JPEG 2000 파일(`.jp2`, `.jpx`)도 완전히 지원합니다. 의료 영상과 지리 공간 데이터에 유용합니다.
|
||||
- 휴대폰 카메라로 찍은 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. 결과는 입력한 JSON 파일마다 PDF 하나씩을 담은 `jsons-to-pdf.zip`으로 다운로드됩니다.
|
||||
|
||||
변환은 백그라운드 Web Worker에서 실행되므로 큰 파일에서도 UI가 계속 반응합니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 설정할 수 있는 옵션이 없습니다. JSON 구조가 출력 PDF를 완전히 결정합니다.
|
||||
|
||||
## 출력
|
||||
|
||||
여러 JSON 파일을 변환하면 결과가 ZIP 아카이브로 제공됩니다. 각 PDF는 원본 JSON 파일 이름을 따릅니다(예: `report.json`은 `report.pdf`가 됨).
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- JSON 기반 백업 또는 보관 파이프라인에서 PDF 복원하기
|
||||
- PDF를 JSON으로 변환해 확인한 뒤 다시 PDF로 되돌리기
|
||||
- JSON 구조를 프로그램으로 수정한 후 문서 다시 만들기
|
||||
- PDF를 JSON으로 내보낸 결과가 문서 내용을 모두 담았는지 다시 변환해 검증하기
|
||||
|
||||
## 팁
|
||||
|
||||
- API 응답이나 설정 파일 같은 임의의 JSON 데이터를 서식 있는 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를 올리거나 문서 포털로 제공한다면 선형화로 훨씬 빠르게 열리는 느낌을 줄 수 있습니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. PDF 파일을 하나 이상 업로드하세요.
|
||||
2. **PDF 선형화**를 클릭하세요.
|
||||
3. 선형화된 모든 파일이 담긴 ZIP 아카이브로 결과를 다운로드하세요.
|
||||
|
||||
설정할 항목은 없습니다. 이 도구는 QPDF의 `--linearize` 플래그를 사용하며, 시각적 콘텐츠는 바꾸지 않고 PDF의 내부 구조만 재배열합니다.
|
||||
|
||||
## 선형화가 하는 일
|
||||
|
||||
- 첫 페이지의 데이터가 파일 맨 앞에 오도록 PDF 객체 순서를 재정렬
|
||||
- 뷰어가 각 페이지의 위치를 알 수 있도록 선형화 사전과 힌트 테이블 추가
|
||||
- 바이트 범위 요청 지원: 브라우저가 파일 전체를 받지 않고 첫 페이지만 가져올 수 있음
|
||||
- 효율적인 임의 접근을 위해 상호 참조 테이블 정리
|
||||
|
||||
## 기능
|
||||
|
||||
- 한 번의 작업으로 여러 PDF 일괄 처리
|
||||
- 출력물이 모든 콘텐츠, 폰트, 이미지, 대화형 요소를 보존
|
||||
- 안정적이고 표준을 준수하는 선형화를 위해 QPDF(WebAssembly) 사용
|
||||
- 쉬운 다운로드를 위해 결과를 ZIP으로 묶음
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 사용자가 즉시 페이지가 표시되길 기대하는 웹사이트에 PDF 보고서 올리기
|
||||
- 브라우저 내 뷰어가 있는 웹 애플리케이션에 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로
|
||||
|
||||
실시간 미리보기와 원클릭 PDF 내보내기를 갖춘 다기능 Markdown 편집기입니다. 처음부터 작성하거나 기존 `.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`)으로 페이지 모드로 전환하지 않고도 원하는 페이지만 선택
|
||||
- 지연 로딩되는 페이지 썸네일로 큰 문서에서도 UI가 원활하게 동작
|
||||
- 파일 수나 전체 페이지 수에 제한 없음
|
||||
- 재인코딩 없이 원본 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로
|
||||
|
||||
Amazon 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-up, 4-up, 6-up, 8-up, 9-up, 16-up
|
||||
- 출력 페이지 크기와 방향 설정 가능
|
||||
- 배치된 페이지 사이의 간격 선택 가능
|
||||
- 배경색과 테두리 색상 설정
|
||||
- 맞추어 배율을 조정하면서도 원본 페이지의 가로세로 비율 유지
|
||||
|
||||
## 옵션
|
||||
|
||||
| 옵션 | 설명 |
|
||||
| --------------- | ---------------------------------------------------------- |
|
||||
| **장당 페이지** | 출력 페이지 한 장에 넣을 원본 페이지 수(2, 4, 6, 8, 9, 16) |
|
||||
| **페이지 크기** | 출력 시트 크기(A4, Letter, Legal 등) |
|
||||
| **방향** | 출력 시트의 세로 또는 가로 방향 |
|
||||
| **간격** | 배치된 페이지 사이의 간격(포인트 단위) |
|
||||
| **배경색** | 출력 시트 배경을 채우는 색상 |
|
||||
| **테두리 색상** | 배치된 각 페이지를 둘러싸는 테두리의 색상 |
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 용지를 아끼기 위해 한 장에 슬라이드 4개씩 넣어 유인물 인쇄하기
|
||||
- 한 장에 여러 참고 페이지를 담은 학습 자료 만들기
|
||||
- 서류 정리를 위한 간결한 문서 보관본 만들기
|
||||
- 긴 문서의 썸네일 개요 시트 생성하기
|
||||
|
||||
## 팁
|
||||
|
||||
- 2-up 레이아웃에는 가로 방향이 더 잘 맞는 경우가 많고, 4-up 이상에는 대개 세로 방향이 가장 좋습니다.
|
||||
- 간격을 늘리면 가독성은 좋아지지만 배치된 각 페이지에 쓸 수 있는 영역이 줄어듭니다.
|
||||
- 반대 작업(페이지 하나를 여러 장으로 나누기)은 [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 만들기
|
||||
- 스캔한 책이나 매뉴얼에서 텍스트 콘텐츠를 일괄 추출하기
|
||||
|
||||
## 팁
|
||||
|
||||
- 문서에 여러 언어가 섞여 있다면(예: 영어 제목과 일본어 본문) 언어를 여러 개 선택하세요.
|
||||
- 글자가 흐리거나 대비가 낮은 문서에는 이진화 옵션을 사용하세요. 인식 정확도가 크게 향상될 수 있습니다.
|
||||
- 청구서와 양식 화이트리스트 프리셋은 관련 없는 문자 모양을 무시하여 구조화된 문서의 오인식을 크게 줄여줍니다.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [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로 프레젠테이션 배포하기
|
||||
- ODP보다 PDF를 선호하는 사람들과 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 Spreadsheet 파일을 PDF로 변환합니다. ODS는 LibreOffice Calc의 기본 형식이며 Google Sheets에서도 흔히 내보내는 형식입니다. 이 도구는 스프레드시트의 데이터, 서식, 차트를 페이지로 나뉜 PDF로 렌더링하여 인쇄하거나 공유할 수 있게 해줍니다.
|
||||
|
||||
## 지원 형식
|
||||
|
||||
| 형식 | 확장자 | 비고 |
|
||||
| :----------------------- | :----- | :---------------------------------------- |
|
||||
| OpenDocument Spreadsheet | `.ods` | LibreOffice Calc / Google Sheets 내보내기 |
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 업로드 영역을 클릭하거나 ODS 파일을 끌어다 놓습니다. 여러 파일을 지원합니다.
|
||||
2. 파일 목록을 확인합니다. 휴지통 아이콘으로 파일을 제거하거나 **파일 더 추가**를 클릭해 일괄 작업을 확장할 수 있습니다.
|
||||
3. **PDF로 변환**을 클릭합니다. LibreOffice 기반 엔진이 브라우저에 로드되어 각 스프레드시트를 PDF 페이지로 렌더링합니다.
|
||||
4. 스프레드시트 하나는 PDF로 다운로드됩니다. 여러 파일은 `ods-to-pdf.zip`으로 묶입니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
별도 설정은 필요하지 않습니다. 변환기는 스프레드시트의 기존 인쇄 레이아웃, 셀 서식, 열 너비를 PDF 출력에 그대로 적용합니다.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- PDF만 받는 상대에게 LibreOffice Calc 예산표나 보고서 공유하기
|
||||
- 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 Text(ODT) 파일을 브라우저에서 PDF로 변환합니다.
|
||||
---
|
||||
|
||||
# ODT를 PDF로
|
||||
|
||||
OpenDocument Text 파일을 PDF로 변환합니다. ODT는 LibreOffice Writer, Apache OpenOffice 및 기타 오픈소스 워드 프로세서의 기본 형식입니다. 이 도구는 브라우저 기반 LibreOffice 엔진을 사용해 서식, 표, 이미지, 스타일을 그대로 유지하는 정확한 변환을 제공합니다.
|
||||
|
||||
## 지원 형식
|
||||
|
||||
| 형식 | 확장자 |
|
||||
| :---------------- | :----- |
|
||||
| OpenDocument Text | `.odt` |
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 업로드 영역을 클릭하거나 ODT 파일을 하나 이상 끌어다 놓습니다.
|
||||
2. 파일 목록을 확인합니다. 파일을 더 추가하거나 필요 없는 파일을 제거할 수 있습니다.
|
||||
3. **PDF로 변환**을 클릭합니다. LibreOffice 엔진이 초기화되고(진행 표시기에 로드 상태가 표시됩니다) 각 파일이 변환됩니다.
|
||||
4. 파일 하나는 PDF로 바로 다운로드됩니다. 여러 파일은 `odt-converted.zip`으로 묶입니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 추가 설정이 없습니다. 변환 시 원본 문서의 서식을 최대한 그대로 유지합니다.
|
||||
|
||||
## 출력
|
||||
|
||||
| 입력 수 | 출력 |
|
||||
| :------------ | :-------------------------------------------------------- |
|
||||
| 파일 1개 | PDF 한 개 다운로드 (예: `document.pdf`) |
|
||||
| 파일 2개 이상 | 파일당 PDF 하나가 담긴 ZIP 압축 파일(`odt-converted.zip`) |
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- LibreOffice Writer 문서를 Microsoft Office 사용자와 공유하기 위해 PDF로 변환하기
|
||||
- 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 보관소의 페이지 레이아웃을 메타데이터 기록으로 문서화하기
|
||||
- 보정이 필요한 회전된 페이지 찾기
|
||||
|
||||
## 팁
|
||||
|
||||
- 요약에 "크기 혼합"이 표시되면 인쇄 전에 페이지 크기 통일 도구로 크기를 맞추세요.
|
||||
- 회전 필드는 올바르게 표시되지만 회전 속성이 0이 아닌 페이지를 찾는 데 도움이 되며, 이런 페이지는 일부 워크플로우에서 문제를 일으킬 수 있습니다.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [페이지 크기 통일](./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-numbering)
|
||||
- [머리글 및 바닥글](./header-footer)
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: PDF 소책자
|
||||
description: 접고 스테이플로 고정해 실제 소책자를 만들 수 있도록 PDF 페이지를 소책자(중철) 순서로 재배열합니다.
|
||||
---
|
||||
|
||||
# PDF 소책자
|
||||
|
||||
PDF 페이지를 소책자 면부착 순서로 재배열합니다. 양면 인쇄 후 반으로 접으면 페이지가 올바른 읽기 순서가 됩니다. 중철 소책자와 진(zine)에 쓰이는 레이아웃입니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
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`
|
||||
- **여러 페이지**: `page_1.bmp`, `page_2.bmp` 등이 담긴 `filename_bmps.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- BMP 입력만 받는 레거시 시스템이나 장비에 PDF 페이지 전달하기
|
||||
- 특정 인쇄 워크플로우를 위한 비압축 이미지 준비하기
|
||||
- 원시 픽셀 데이터가 필요한 이미지 처리 도구의 입력으로 비트맵 출력 사용하기
|
||||
|
||||
## 팁
|
||||
|
||||
- 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를 Komga, Kavita, CDisplayEx, Calibre 같은 만화 리더용 CBZ(만화책 아카이브) 파일로 변환합니다.
|
||||
---
|
||||
|
||||
# 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 압축 파일입니다.
|
||||
|
||||
페이지 이미지는 0으로 채운 번호(`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가 표처럼 보이지만 실제 표로 구조화되지 않은 텍스트 레이아웃을 사용한다는 뜻입니다.
|
||||
- 개별 표를 더 세밀하게 제어하려면 CSV, JSON, Markdown 출력 형식 중에서 고를 수 있는 [PDF 표 추출](./extract-tables)을 사용하세요.
|
||||
- 표마다 별도 시트가 있는 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)" 등의 이름이 붙은 워크시트. 시트 이름은 Excel 제한인 31자로 잘립니다.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 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%로 고정되어 있습니다.
|
||||
|
||||
## 출력 형식
|
||||
|
||||
- 모든 페이지가 흑백 JPEG 이미지로 들어 있는 `greyscale.pdf` 파일 하나.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 컬러 잉크 비용을 아끼기 위해 흑백 인쇄용 문서 준비하기
|
||||
- 흑백을 요구하는 법률 또는 정부 제출 요건 충족하기
|
||||
- 컬러 비중이 큰 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는 페이지당 JPG 하나가 담긴 ZIP 압축 파일이 만들어집니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다. 도구에 파일 이름, 파일 크기, 페이지 수가 표시됩니다.
|
||||
2. **품질** 슬라이더로 JPG 압축을 조절합니다.
|
||||
3. **변환**을 클릭해 처리를 시작합니다.
|
||||
4. 결과가 자동으로 다운로드됩니다. 한 페이지 PDF는 JPG 하나, 여러 페이지 문서는 ZIP 파일입니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
- **품질**: 0%에서 100%까지의 슬라이더(기본값 90%). 값이 높을수록 이미지가 선명하고 파일이 커집니다. 값이 낮을수록 더 강하게 압축됩니다.
|
||||
|
||||
페이지는 내부적으로 2배 배율로 렌더링되므로 출력 해상도는 PDF 페이지 크기의 두 배입니다. 표준 Letter 크기 페이지는 약 1,224 x 1,584 픽셀 이미지가 됩니다.
|
||||
|
||||
## 출력 형식
|
||||
|
||||
- **한 페이지**: `filename.jpg`
|
||||
- **여러 페이지**: `page_1.jpg`, `page_2.jpg` 등이 담긴 `filename_jpgs.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 문서 관리 시스템용 미리보기 썸네일 생성하기
|
||||
- PDF를 지원하지 않는 채팅이나 이메일로 보고서의 한 페이지 공유하기
|
||||
- PDF 다이어그램이나 일러스트에서 이미지 자산 만들기
|
||||
- 스캔한 문서를 개별 이미지로 보관하기
|
||||
|
||||
## 팁
|
||||
|
||||
- 무손실 출력이 필요하면 [PDF를 PNG로](./pdf-to-png)를 대신 사용하세요.
|
||||
- 품질 80-90% 설정이 파일 크기와 시각적 충실도 사이의 좋은 균형입니다.
|
||||
- 페이지마다 특정 형식이 필요하면 PDF를 이미지로 내보내는 출력 노드가 있는 [PDF 워크플로우 빌더](./pdf-workflow)를 고려해 보세요.
|
||||
|
||||
## 관련 도구
|
||||
|
||||
- [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. **변환**을 클릭해 처리를 시작합니다. 변환은 백그라운드 웹 워커에서 실행됩니다.
|
||||
3. 입력한 PDF마다 JSON 파일 하나가 담긴 ZIP 압축 파일이 다운로드됩니다.
|
||||
|
||||
상태 표시줄에 변환과 ZIP 생성 단계의 진행 상황이 표시됩니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 설정 가능한 옵션이 없습니다. 각 PDF는 전체 JSON 표현으로 변환됩니다.
|
||||
|
||||
## 출력 형식
|
||||
|
||||
- 입력한 PDF마다 `filename.json`이 담긴 `pdfs-to-json.zip` 파일.
|
||||
|
||||
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`
|
||||
- **파일 여러 개**: 입력한 PDF마다 `.md` 하나가 담긴 `markdown-files.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- PDF 문서를 VitePress, Hugo, Jekyll 같은 정적 사이트 생성기용 Markdown으로 변환하기
|
||||
- PDF 연구 논문을 Obsidian 같은 노트 앱에서 쓸 수 있는 편집 가능한 Markdown으로 바꾸기
|
||||
- 레거시 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는 장기 디지털 보존을 위해 설계된 ISO 표준 PDF 하위 집합입니다. 이 도구는 브라우저에서 직접 실행되는 Ghostscript로 일반 PDF를 PDF/A 규격 문서로 변환합니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. PDF 파일을 하나 이상 업로드합니다.
|
||||
2. 드롭다운에서 **PDF/A 버전**을 선택합니다.
|
||||
3. 일반 변환이 실패하는 복잡한 파일이라면 **사전 평탄화**를 선택적으로 켭니다.
|
||||
4. **PDF/A로 변환**을 클릭합니다. 여러 파일은 ZIP 압축 파일로 만들어집니다.
|
||||
|
||||
## PDF/A 버전
|
||||
|
||||
| 버전 | 제한 사항 | 적합한 용도 |
|
||||
| ------------ | ---------------------------------------------- | -------------------------------------- |
|
||||
| **PDF/A-1b** | 가장 엄격함. 투명도와 레이어를 사용할 수 없음. | 오래된 보관 시스템과의 최대 호환성 |
|
||||
| **PDF/A-2b** | 투명도와 JPEG2000을 허용. | 범용 보관 (권장) |
|
||||
| **PDF/A-3b** | 모든 형식의 첨부 파일 포함을 허용. | 원본 데이터 파일이 함께 있는 문서 보관 |
|
||||
|
||||
PDF/A-2b가 기본으로 선택되어 있으며 대부분의 보관 요구를 충족합니다.
|
||||
|
||||
## 사전 평탄화 옵션
|
||||
|
||||
일부 PDF에는 특이한 글꼴 인코딩, 복잡한 투명도 스택, 손상된 내부 구조처럼 깔끔한 PDF/A 변환을 방해하는 요소가 있습니다. **사전 평탄화**를 켜면 변환 전에 PDF를 300 DPI로 래스터화하여 규정 준수를 보장하지만, 대신 텍스트를 선택할 수 없게 됩니다. 표준 변환에서 오류가 발생할 때의 대안으로 사용하세요.
|
||||
|
||||
사전 평탄화에는 PyMuPDF WASM 엔진이 필요합니다.
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 정부 또는 법률 보관 요건 충족하기 (많은 관할권이 법원 제출 문서에 PDF/A를 의무화합니다)
|
||||
- 기관 저장소나 디지털 도서관에 문서 제출하기
|
||||
- 10년 뒤에는 원본 소프트웨어가 없을 수 있는 업무 기록 보존하기
|
||||
- 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`
|
||||
- **여러 페이지**: `page_1.png`, `page_2.png` 등이 담긴 `filename_pngs.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 프레젠테이션용으로 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(Scalable Vector Graphics) 파일로 변환합니다. 래스터 형식과 달리 SVG는 벡터 경로, 텍스트, 도형을 유지하므로 출력이 어떤 크기로 확대해도 깨지지 않습니다. PyMuPDF를 기반으로 합니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 하나 이상 업로드합니다. 여러 파일을 추가하고 개별적으로 관리할 수 있습니다.
|
||||
2. **변환**을 클릭해 업로드한 모든 파일을 처리합니다.
|
||||
3. 파일 하나에 페이지 하나인 변환은 독립된 `.svg`로 다운로드됩니다. 그 외에는 ZIP 압축 파일로 다운로드됩니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 설정 가능한 옵션이 없습니다. 각 페이지는 PyMuPDF의 기본 벡터 내보내기로 SVG로 변환됩니다.
|
||||
|
||||
## 출력 형식
|
||||
|
||||
- **파일 하나, 페이지 하나**: `filename.svg`
|
||||
- **파일 하나, 페이지 여러 개**: `page_1.svg`, `page_2.svg` 등이 담긴 `filename_svg.zip`
|
||||
- **파일 여러 개**: 원본 문서 이름별로 정리된 파일이 담긴 `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마다 `.txt` 하나가 담긴 `pdf-to-text.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 전체 텍스트 검색 색인용으로 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: 인쇄, 팩스, 보관 워크플로우에서 흔히 쓰는 TIFF 이미지로 PDF 페이지를 변환합니다. 인코딩에 실패하면 PNG로 대체됩니다.
|
||||
---
|
||||
|
||||
# PDF를 TIFF로
|
||||
|
||||
PDF의 각 페이지를 TIFF 이미지로 변환합니다. TIFF는 인쇄 제작, 팩스 시스템, 문서 보관의 표준 형식입니다. 이 도구는 TIFF 인코딩에 PackBits 압축을 사용하며, 페이지 인코딩에 실패하면 PNG로 대체합니다.
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 드롭 영역을 클릭하거나 파일을 끌어다 놓아 PDF를 업로드합니다.
|
||||
2. **변환**을 클릭해 파일을 처리합니다.
|
||||
3. TIFF 파일 하나 또는 ZIP 압축 파일이 자동으로 다운로드됩니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 설정 가능한 옵션이 없습니다. 페이지는 고정된 2배 배율로 렌더링됩니다.
|
||||
|
||||
## 출력 형식
|
||||
|
||||
- **한 페이지**: `filename.tiff`
|
||||
- **여러 페이지**: `page_1.tiff`, `page_2.tiff` 등이 담긴 `filename_tiffs.zip`
|
||||
|
||||
특정 페이지의 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`
|
||||
- **여러 페이지**: `page_1.webp`, `page_2.webp` 등이 담긴 `filename_webps.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 대역폭이 중요한 웹사이트용 페이지 미리보기 준비하기
|
||||
- 소셜 미디어용으로 전단지나 브로슈어의 가벼운 이미지 버전 만들기
|
||||
- 여러 페이지 문서를 웹에 최적화된 이미지 세트로 일괄 변환하기
|
||||
|
||||
## 팁
|
||||
|
||||
- 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`
|
||||
- **파일 여러 개**: 입력한 PDF마다 `.docx` 하나가 담긴 `converted-documents.zip`
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 받은 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 보안** (장미색): 암호화, 복호화, 정리, 평탄화, 디지털 서명, 교정(Redact).
|
||||
- **출력** (청록): 다운로드(단일 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** (초록): 이미지 blob.
|
||||
|
||||
## 옵션
|
||||
|
||||
모든 노드에는 오른쪽 설정 패널로 접근하는 고유한 설정이 있습니다. 흔한 예는 다음과 같습니다.
|
||||
|
||||
- 분할, 페이지 추출, 페이지 삭제 노드의 **페이지 범위**
|
||||
- 이미지 변환 출력 노드의 **품질 슬라이더**
|
||||
- 암호화 및 복호화 노드의 **비밀번호 필드**
|
||||
- 워터마크, 머리글 및 바닥글, 메타데이터 편집의 **텍스트 입력**
|
||||
- 회전 노드의 **회전 각도**
|
||||
- 압축 노드의 **압축 수준**
|
||||
- OCR 노드의 **OCR 언어 선택**
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- **청구서 처리 파이프라인**: PDF 입력 -> OCR -> 표 추출 -> 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 Presentation 형식을 모두 지원합니다.
|
||||
|
||||
## 지원 형식
|
||||
|
||||
| 형식 | 확장자 |
|
||||
| :------------------------ | :------ |
|
||||
| PowerPoint (최신) | `.pptx` |
|
||||
| PowerPoint (구형) | `.ppt` |
|
||||
| OpenDocument Presentation | `.odp` |
|
||||
|
||||
## 사용 방법
|
||||
|
||||
1. 업로드 영역을 클릭하거나 프레젠테이션 파일을 끌어다 놓습니다.
|
||||
2. 파일 목록을 확인합니다. 필요에 따라 파일을 추가하거나 제거합니다.
|
||||
3. **PDF로 변환**을 클릭합니다. 처음 사용할 때 LibreOffice 엔진이 로드된 후 각 파일을 변환합니다.
|
||||
4. 파일이 하나면 PDF로 바로 다운로드됩니다. 여러 파일은 `powerpoint-converted.zip`으로 묶여 다운로드됩니다.
|
||||
|
||||
## 옵션
|
||||
|
||||
이 도구에는 추가 설정이 없습니다. 슬라이드는 원래 크기 그대로 렌더링됩니다.
|
||||
|
||||
## 출력
|
||||
|
||||
| 입력 수 | 출력 |
|
||||
| :------------ | :---------------------------------------------------------------- |
|
||||
| 파일 1개 | PDF 한 개 다운로드 (원본 파일명에 `.pdf` 확장자) |
|
||||
| 파일 2개 이상 | 파일당 PDF 하나를 담은 ZIP 압축 파일 (`powerpoint-converted.zip`) |
|
||||
|
||||
## 활용 사례
|
||||
|
||||
- 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마다 `_llm.json` 하나씩을 담은 `pdf-for-ai.zip`.
|
||||
|
||||
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비트 Advanced Encryption Standard)
|
||||
- **키 길이**: 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