feat: translate all pages, UI messages and docs and fix SEO redirects and indexing

This commit is contained in:
alam00000 committed 2026-10-25 12:55:21 +05:30
1 parent 5e019de5ae
commit 4edb1718cc
3344 files changed
+415643 -4759

No files matched your search

+136
View File
@@ -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)
기여하면 기여한 내용이 위 조건에 따라 라이선스된다는 데 동의하는 것으로 간주됩니다.
+80
View File
@@ -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)
+42
View File
@@ -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/)을 참고하세요.
+92
View File
@@ -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.
+275
View File
@@ -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
```
+200
View File
@@ -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"
}
}
```
+154
View File
@@ -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)를 참고하세요.
+180
View File
@@ -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
- 전체 체인을 직접 조립한 인증서
+622
View File
@@ -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
```
+266
View File
@@ -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 파일을 따로 업로드하세요.
+538
View File
@@ -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는 정적 사이트이므로 데이터베이스나 백엔드 서버가 필요 없습니다!
:::
+211
View File
@@ -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#특정-도구-비활성화)를 참고하세요.
+139
View File
@@ -0,0 +1,139 @@
# Netlify에 배포하기
[Netlify](https://netlify.com)는 넉넉한 무료 요금제와 함께 훌륭한 정적 사이트 호스팅을 제공합니다.
## 원클릭 배포
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](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에서 에셋 최적화를 활성화하세요.
+232
View File
@@ -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
```
+122
View File
@@ -0,0 +1,122 @@
# Vercel에 배포하기
[Vercel](https://vercel.com)은 정적 사이트를 가장 쉽게 배포할 수 있는 환경을 제공합니다.
## 원클릭 배포
[![Deploy with Vercel](https://vercel.com/button)](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`가 반환되어야 합니다.
+49
View File
@@ -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)
+40
View File
@@ -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)
+53
View File
@@ -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)
+45
View File
@@ -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)
+79
View File
@@ -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)
+55
View File
@@ -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)
+42
View File
@@ -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)
+45
View File
@@ -0,0 +1,45 @@
---
title: 배경색 변경
description: PDF 모든 페이지의 배경색을 바꾸면서 위에 있는 내용은 그대로 유지합니다.
---
# 배경색 변경
PDF의 기존 내용 뒤에 단색 배경을 설정합니다. 각 페이지에 색 사각형을 만들고 원본 내용을 그 위에 겹치므로, 텍스트, 이미지, 그래픽이 새 배경 위에서도 완전히 보입니다.
## 사용 방법
1. PDF 파일을 업로드합니다.
2. 색상 선택기로 배경색을 고릅니다. 기본값은 연한 노랑(#FFFFCC)입니다.
3. **배경색 변경**을 클릭하여 처리합니다.
4. 업데이트된 PDF가 자동으로 다운로드됩니다.
## 옵션
- **배경색** -- 원하는 단색을 고르는 표준 색상 선택기입니다. 기본값은 연한 노랑입니다.
## 기능
- 모든 페이지에 균일한 배경색 적용
- 색 레이어 위에 모든 원본 내용(텍스트, 이미지, 벡터 그래픽) 유지
- 원본 페이지 크기 유지
- 페이지 수에 상관없이 사용 가능
## 활용 사례
- 연한 크림색이나 아이보리 배경으로 문서에 종이 같은 부드러운 느낌 부여
- 분류별로 다른 배경색을 적용해 문서 세트를 색으로 구분
- 대상 독자별로 시각적으로 구분되는 같은 문서의 버전 만들기
- 화면에 문서를 띄울 때 가독성을 높이기 위해 연한 배경 색조 추가
## 팁
- 연하고 차분한 색이 가장 잘 어울립니다. 텍스트가 이미 밝은 색이 아니라면 매우 어두운 배경은 글자를 읽기 어렵게 만들 수 있습니다.
- 배경과 텍스트 색을 모두 바꾸려면 먼저 배경색을 적용한 뒤 결과물에 [텍스트 색상 변경](./text-color)을 사용하세요.
- 이 도구는 래스터화가 아닌 PDF 구조 수준에서 작동하므로 출력에서도 텍스트를 선택하고 검색할 수 있습니다.
## 관련 도구
- [텍스트 색상 변경](./text-color)
- [색상 반전](./invert-colors)
- [색상 조정](./adjust-colors)
+62
View File
@@ -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)
+44
View File
@@ -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)
+57
View File
@@ -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)
+47
View File
@@ -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)
+61
View File
@@ -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): 소유자 비밀번호가 있을 때 모든 제한 제거
+55
View File
@@ -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)
+60
View File
@@ -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)
+73
View File
@@ -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): 개인정보 보호를 위해 숨겨진 데이터 제거
+44
View File
@@ -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)
+51
View File
@@ -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)
+42
View File
@@ -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)
+46
View File
@@ -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의 구조 문제 수정
+65
View File
@@ -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): 서명 전에 메타데이터 제거
+42
View File
@@ -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)
+55
View File
@@ -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)
+43
View File
@@ -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)
+58
View File
@@ -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)
+48
View File
@@ -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)
+50
View File
@@ -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)
+44
View File
@@ -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)
+55
View File
@@ -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)
+42
View File
@@ -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)
+45
View File
@@ -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)
+41
View File
@@ -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)
+46
View File
@@ -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)
+43
View File
@@ -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)
+44
View File
@@ -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): 자동 배율 조정 대신 직접 페이지 자르기
+51
View File
@@ -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를 비밀번호로 잠그기
+52
View File
@@ -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): 폰트 독립성을 확보한 뒤 보관용으로 변환
+76
View File
@@ -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)
+47
View File
@@ -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)
+53
View File
@@ -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)
+46
View File
@@ -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)
+65
View File
@@ -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)
+183
View File
@@ -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>
+42
View File
@@ -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)
+48
View File
@@ -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)
+53
View File
@@ -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)
+49
View File
@@ -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): 온라인 게시 전에 메타데이터 제거
+59
View File
@@ -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)
+54
View File
@@ -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)
+43
View File
@@ -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)
+54
View File
@@ -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)
+54
View File
@@ -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)
+43
View File
@@ -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)
+44
View File
@@ -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)
+44
View File
@@ -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)
+51
View File
@@ -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)
+45
View File
@@ -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)
+53
View File
@@ -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): 회전된 페이지 보정
+48
View File
@@ -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)
+43
View File
@@ -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)
+46
View File
@@ -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)
+52
View File
@@ -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)
+40
View File
@@ -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)
+77
View File
@@ -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)
+44
View File
@@ -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)
+44
View File
@@ -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)
+42
View File
@@ -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)
+46
View File
@@ -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)
+45
View File
@@ -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)
+43
View File
@@ -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)
+50
View File
@@ -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): 보관 전에 메타데이터 제거
+42
View File
@@ -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)
+43
View File
@@ -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)
+43
View File
@@ -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)
+43
View File
@@ -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)
+43
View File
@@ -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)
+42
View File
@@ -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)
+41
View File
@@ -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)
+95
View File
@@ -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)
+49
View File
@@ -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)
+53
View File
@@ -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)
+55
View File
@@ -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)
+47
View File
@@ -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)
+64
View File
@@ -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): 암호화 전에 숨겨진 내용 제거
+44
View File
@@ -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