Files
Developer 0a9588abb7 feat: implement QuestionBank CRUD with pagination and template query
- Add pagination support to findAll (page, limit query params)
- Add findByTemplateId method to service
- Add GET /by-template/:templateId endpoint to controller
- Service already includes CRUD for QuestionBank and QuestionBankItem
2026-04-23 17:19:11 +08:00

215 lines
5.6 KiB
Markdown

# LibreOffice FastAPI ドキュメント変換サービス
## 📋 概要
これは FastAPI ベースの独立したドキュメント変換サービスで、Word、PPT、Excel などのドキュメントを PDF に変換するために使用されます。RAG の高精度モードにおけるドキュメント処理パイプラインをサポートします。
## 🎯 コア機能
- **形式変換**: Word/PPT/Excel → PDF
- **PDF スルーパス**: PDF ファイルは変換せずにそのまま返却
- **自動ドキュメント生成**: `/docs` にアクセスしてインタラクティブな API ドキュメントを確認可能
- **ヘルスチェック**: `/health` エンドポイントによるサービス状態の監視
- **非同期処理**: FastAPI の非同期アーキテクチャによる高性能な処理
## 🚀 クイックスタート
### ローカル開発
```bash
# 1. 依存関係のインストール
pip install -r requirements.txt
# 2. サービスの起動
uvicorn main:app --reload --port 8100
# 3. ドキュメントへのアクセス
open http://localhost:8100/docs
```
### Docker デプロイ
```bash
# 1. イメージのビルド
docker build -t libreoffice-server .
# 2. コンテナの実行
docker run -d \
--name lo-converter \
-p 8100:8100 \
-v ./uploads:/uploads \
-v ./temp:/temp \
libreoffice-server
# 3. ヘルスチェック
curl http://localhost:8100/health
```
## 📡 API エンドポイント
### POST /convert
ドキュメントを PDF に変換します。
**リクエスト**:
```bash
curl -X POST -F "file=@test.docx" http://localhost:8100/convert
```
**レスポンス**:
```json
{
"pdf_path": "/uploads/test.pdf",
"converted": true,
"original": "test.docx",
"file_size": 102400
}
```
**サポートされている形式**:
- `.pdf` - そのまま返却
- `.doc`, `.docx` - Word ドキュメント
- `.ppt`, `.pptx` - PowerPoint プレゼンテーション
- `.xls`, `.xlsx` - Excel スプレッドシート
### GET /health
ヘルスチェックを行います。
**レスポンス**:
```json
{
"status": "healthy",
"service": "libreoffice-converter",
"version": "1.0.0",
"uptime": 123.45
}
```
### GET /docs
自動生成される API ドキュメント (Swagger UI) です。
## 🐳 Docker Compose との統合
メインプロジェクトの `docker-compose.yml` に以下を追加してください:
```yaml
services:
libreoffice:
build: ./libreoffice-server
container_name: lo-converter
volumes:
- ./uploads:/uploads
- ./temp:/temp
ports:
- "8100:8100"
restart: unless-stopped
deploy:
resources:
limits:
memory: 1G
cpus: '1.0'
```
## 🔧 環境変数
サービス自体に特別な環境変数は必要ありませんが、ボリュームのマウントによって以下のディレクトリを構成できます:
- `/uploads` - ドキュメントの保存ディレクトリ
- `/temp` - 一時ファイルのディレクトリ
## 📊 パフォーマンスの目安
| ドキュメント形式 | ページ数 | 変換時間 | 備考 |
|---------|------|---------|------|
| Word | 50ページ | 約10秒 | 書式を保持 |
| PPT | 50ページ | 約15秒 | 各ページを画像として処理 |
| Excel | 10ページ | 約8秒 | 表として変換 |
| PDF | 任意 | 約0秒 | 直接返却 |
## 🛠️ デバッグのヒント
### ログの確認
```bash
docker logs -f lo-converter
```
### 変換テスト
```bash
# テストファイルの準備
echo "test" > test.docx
# 変換テストの実行
curl -X POST -F "file=@test.docx" http://localhost:8100/convert | jq
```
### コンテナ内でのデバッグ
```bash
docker exec -it lo-converter sh
```
## 🔗 依存関係の説明
- **FastAPI**: モダンな Python Web フレームワーク
- **Uvicorn**: ASGI サーバー
- **LibreOffice**: ドキュメント変換エンジン
- **Pydantic**: データバリデーション
## 📝 注意事項
1. **ファイルサイズ**: 100MB 以内に制限することを推奨します。
2. **タイムアウト**: デフォルトは 300 秒です。必要に応じてコード内で調整してください。
3. **並列処理**: 2〜3 個のワーカーを推奨します。
4. **メモリ制限**: 1GB を推奨します。
5. **一時ファイル**: 定期的なクリーンアップが必要です。
## 🎯 メインシステムとの連携
### サーバー側の呼び出し例
```typescript
// server/src/libreoffice/libreoffice.service.ts
async convertToPDF(filePath: string): Promise<string> {
const fileName = path.basename(filePath);
const fileBuffer = await fs.readFile(filePath);
const formData = new FormData();
formData.append('file', fileBuffer, fileName);
const response = await axios.post(
`${this.baseUrl}/convert`,
formData,
{ timeout: 300000 }
);
return response.data.pdf_path;
}
```
## 📚 関連ドキュメント
- [メインプロジェクト README](../README.md)
- [Vision Pipeline の設計](../docs/VISION_PIPELINE_COMPLETE.md)
- [デプロイガイド](../docs/DEPLOYMENT.md)
## 🚨 故障診断
| 問題 | 原因 | 解決策 |
|------|------|---------|
| 変換失敗 | LibreOffice がインストールされていない | Dockerfile の依存関係を確認してください |
| タイムアウト | ファイルが大きすぎる | タイムアウト時間を増やすか、ファイルを分割してください |
| ポート競合 | 8100 ポートが既に使用されている | ポートマッピングを変更してください |
| 権限エラー | ディレクトリの権限不足 | ボリュームの権限を確認してください |
## 📄 ライセンス
MIT License