Files
KnowledgeBase/docs/DOCUMENT_CONVERSION_GUIDE.md
Knowledge Base System acf549c43c feat: 初始化知识库系统项目
- 实现基于 Laravel 11 和 Filament 3.X 的文档管理系统
- 添加用户认证和分组管理功能
- 实现文档上传、分类和权限控制
- 集成 Word 文档自动转换为 Markdown
- 集成 Meilisearch 全文搜索引擎
- 实现文档在线预览功能
- 添加安全日志和审计功能
- 完整的简体中文界面
- 包含完整的项目文档和部署指南

技术栈:
- Laravel 11.x
- Filament 3.X
- Meilisearch 1.5+
- Pandoc 文档转换
- Redis 队列系统
- Pest PHP 测试框架
2025-12-05 14:44:44 +08:00

172 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 文档转换服务使用指南
## 概述
DocumentConversionService 负责将上传的 Word 文档(.doc/.docx转换为 Markdown 格式。转换过程是异步的,通过队列系统处理。
## 功能特性
1. **自动转换**: 文档上传后自动触发转换
2. **异步处理**: 使用队列系统,不阻塞用户操作
3. **错误处理**: 转换失败时记录错误,但不影响文档的基本功能
4. **重试机制**: 转换失败后自动重试(默认 3 次)
5. **预览生成**: 自动生成 Markdown 内容的预览(前 500 字符)
## 使用方法
### 1. 队列转换(推荐)
```php
use App\Services\DocumentConversionService;
use App\Models\Document;
$document = Document::find($id);
$conversionService = app(DocumentConversionService::class);
// 将转换任务加入队列
$conversionService->queueConversion($document);
```
### 2. 同步转换(不推荐用于生产环境)
```php
use App\Services\DocumentConversionService;
use App\Models\Document;
$document = Document::find($id);
$conversionService = app(DocumentConversionService::class);
try {
// 转换文档
$markdown = $conversionService->convertToMarkdown($document);
// 保存 Markdown 文件
$markdownPath = $conversionService->saveMarkdownToFile($document, $markdown);
// 更新文档信息
$conversionService->updateDocumentMarkdown($document, $markdownPath);
} catch (\Exception $e) {
// 处理转换失败
$conversionService->handleConversionFailure($document, $e);
}
```
## 转换状态
文档的 `conversion_status` 字段有以下几种状态:
- `pending`: 等待转换
- `processing`: 正在转换
- `completed`: 转换完成
- `failed`: 转换失败
## 配置
转换相关的配置在 `config/documents.php` 文件中:
```php
'conversion' => [
'driver' => 'pandoc', // 转换驱动
'pandoc_path' => '/usr/local/bin/pandoc', // Pandoc 路径
'timeout' => 300, // 超时时间(秒)
'queue' => 'documents', // 队列名称
'retry_times' => 3, // 重试次数
'retry_delay' => 60, // 重试延迟(秒)
],
```
## 队列工作进程
确保队列工作进程正在运行:
```bash
# 启动队列工作进程
php artisan queue:work --queue=documents
# 或者使用 Supervisor 管理队列进程
```
## 依赖要求
### Pandoc
系统需要安装 Pandoc 才能进行文档转换:
**macOS:**
```bash
brew install pandoc
```
**Ubuntu/Debian:**
```bash
sudo apt-get install pandoc
```
**验证安装:**
```bash
pandoc --version
```
## 错误处理
转换失败时,系统会:
1. 记录详细的错误日志
2. 更新文档的 `conversion_status``failed`
3.`conversion_error` 字段中保存错误信息
4. 保留原始 Word 文档,用户仍可下载
## 监控和调试
### 查看转换日志
```bash
tail -f storage/logs/laravel.log | grep "文档转换"
```
### 查看队列任务
```bash
php artisan queue:failed
```
### 重试失败的任务
```bash
# 重试所有失败的任务
php artisan queue:retry all
# 重试特定任务
php artisan queue:retry {job-id}
```
## 性能优化
1. **使用 Redis 队列**: 比数据库队列更快
2. **增加队列工作进程**: 并行处理多个转换任务
3. **调整超时时间**: 根据文档大小调整 `timeout` 配置
4. **监控队列长度**: 避免队列积压
## 故障排查
### 转换一直处于 processing 状态
- 检查队列工作进程是否运行
- 检查 Pandoc 是否正确安装
- 查看错误日志
### 转换失败
- 检查 Pandoc 路径配置是否正确
- 检查文档文件是否存在
- 检查文档文件是否损坏
- 查看 `conversion_error` 字段的错误信息
### 队列任务不执行
- 确认队列连接配置正确Redis/Database
- 确认队列工作进程正在运行
- 检查队列名称是否匹配