# PDF プレビュー機能の修正に関する説明 ## 問題の分析 これまでの PDF プレビュー機能には、以下の問題がありました: 1. プレビューボタンをクリックした際、PDF のステータスチェックのみが行われ、変換処理が能動的に実行されていませんでした。 2. フロントエンドで HEAD リクエストによるプリロードを行っていましたが、これではバックエンドの変換ロジックをトリガーできませんでした。 3. LibreOffice サービスから返されるパスの処理が不適切でした。 4. エラー処理が不足しており、ユーザーへのフィードバックが不十分でした。 ## 修正内容 ### 1. バックエンドの修正 (knowledge-base.service.ts) - `ensurePDFExists` メソッドを修正し、PDF ファイルのパスを正しく処理するようにしました。 - `getPDFStatus` メソッドを改善し、ステータスチェックの正確性を確保しました。 - LibreOffice の変換ロジックを最適化し、PDF ファイルが正しい場所に保存されるようにしました。 ### 2. LibreOffice サービスの修正 (libreoffice.service.ts) - 変換ロジックを修正し、PDF ファイルがローカルファイルシステムに保存されるようにしました。 - 重複した変換を避けるため、PDF ファイルの存在チェックを追加しました。 - インターフェース定義を更新し、多様なレスポンス形式に対応しました。 ### 3. フロントエンドの修正 (PDFPreview.tsx) - ステータスチェックのロジックを変更し、`pending` 状態の際、能動的に変換をトリガーするようにしました。 - エラー処理を改善し、ダウンロードや新しいウィンドウでの表示オプションを追加しました。 - ユーザー体験向上のため、iframe のエラーハンドリングを追加しました。 - UI へのフィードバックを最適化し、変換の進捗を分かりやすく表示するようにしました。 ### 4. サービス層の修正 (pdfPreviewService.ts) - プリロードメソッドを GET リクエストに変更し、変換をトリガーするようにしました。 - 長時間の待機を避けるため、タイムアウト制御を追加しました。 ## 新しいワークフロー 1. **ユーザーがプレビューボタンをクリック** - PDF プレビューのポップアップが開きます。 - 「PDF を変換する準備をしています...」と表示されます。 2. **PDF ステータスのチェック** - `/api/knowledge-bases/:id/pdf-status` を呼び出します。 - ステータスが `pending` の場合、次のステップに進みます。 3. **変換のトリガー** - `/api/knowledge-bases/:id/pdf` を呼び出します(GET リクエスト)。 - バックエンドが `ensurePDFExists` メソッドを実行します。 - 変換が必要な場合、LibreOffice サービスを呼び出します。 4. **ステータスのポーリング** - 3秒ごとにステータスをチェックします。 - 「PDF を変換しています...」と表示されます。 - ステータスが `ready` または `failed` になるまで継続します。 5. **結果の表示** - 成功:iframe 内に PDF を表示します。 - 失敗:エラーメッセージと代替案(ダウンロード、新しいウィンドウで開く)を表示します。 ## テスト手順 1. すべてのサービスを起動します: ```bash docker-compose up -d elasticsearch tika libreoffice yarn dev ``` 2. PDF 以外のファイル(Word 文書、PPT など)をアップロードします。 3. ファイルの横にある「目」のアイコンをクリックします。 4. 変換プロセスを確認します: - 「PDF を変換しています...」と表示されるはずです。 - 数分後、PDF の内容が表示されます。 - 失敗した場合は、エラーメッセージと代替案が表示されます。 ## サポートされるファイル形式 - Microsoft Office: .doc, .docx, .ppt, .pptx, .xls, .xlsx - OpenDocument: .odt, .odp, .ods - その他: .rtf, .txt ## 注意事項 - 大容量ファイルの場合、変換には数分かかることがあります。 - 変換に失敗した場合は、元のファイルのダウンロードを試みてください。 - 重複した変換を避けるため、一度変換された PDF はキャッシュ(保存)されます。