76 lines
3.3 KiB
PHP
Executable File
76 lines
3.3 KiB
PHP
Executable File
<?php
|
||
|
||
namespace App\Containers\Dashboard\Tasks\AI;
|
||
|
||
use ZipArchive;
|
||
use Illuminate\Support\Facades\Log;
|
||
|
||
class ParseDocxTask
|
||
{
|
||
/**
|
||
* Извлекает текст из .docx файла с подробным логированием ошибок
|
||
*/
|
||
public function run(string $filePath): ?string
|
||
{
|
||
// 1. Проверяем, существует ли физически файл по этому пути
|
||
if (!file_exists($filePath)) {
|
||
Log::channel('ai')->error('Файл не найден по пути: {$filePath}");
|
||
return "ОШИБКА ДЕБАГА: Файл не найден на сервере.";
|
||
}
|
||
|
||
$zip = new ZipArchive();
|
||
|
||
// 2. Пытаемся открыть архив
|
||
$res = $zip->open($filePath);
|
||
|
||
// Если не true, значит произошла ошибка
|
||
if ($res !== true) {
|
||
$errorMsg = $this->getZipError($res);
|
||
Log::channel('ai')->error('Ошибка ZipArchive: {$errorMsg} | Путь: {$filePath}");
|
||
|
||
// Возвращаем текст ошибки прямо на фронт, чтобы сразу увидеть причину!
|
||
return "ОШИБКА ДЕБАГА ZipArchive: {$errorMsg}";
|
||
}
|
||
|
||
// 3. Пытаемся достать нужный XML файл
|
||
$xmlString = $zip->getFromName('word/document.xml');
|
||
|
||
// Обязательно закрываем архив, чтобы не было утечек памяти
|
||
$zip->close();
|
||
|
||
if ($xmlString === false) {
|
||
Log::channel('ai')->error('Файл word/document.xml не найден внутри архива. Возможно, это не настоящий DOCX.");
|
||
return "ОШИБКА ДЕБАГА: Внутри архива нет word/document.xml";
|
||
}
|
||
|
||
// 4. Парсим XML
|
||
try {
|
||
$text = str_replace('</w:p>', " \n", $xmlString);
|
||
$text = strip_tags($text);
|
||
return trim($text);
|
||
} catch (\Exception $e) {
|
||
Log::channel('ai')->error('Ошибка очистки тегов: " . $e->getMessage());
|
||
return "ОШИБКА ДЕБАГА при очистке текста.";
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Превращает числовой код ошибки ZipArchive в текст
|
||
*/
|
||
private function getZipError(int $code): string
|
||
{
|
||
$errors = [
|
||
ZipArchive::ER_EXISTS => 'Файл уже существует.',
|
||
ZipArchive::ER_INCONS => 'Несовместимый ZIP-архив.',
|
||
ZipArchive::ER_INVAL => 'Недопустимый аргумент.',
|
||
ZipArchive::ER_MEMORY => 'Ошибка выделения памяти (Malloc).',
|
||
ZipArchive::ER_NOENT => 'Нет такого файла.',
|
||
ZipArchive::ER_NOZIP => 'Это НЕ ZIP-архив (Скорее всего файл переименован или битый).',
|
||
ZipArchive::ER_OPEN => 'Невозможно открыть файл (Проблема с правами).',
|
||
ZipArchive::ER_READ => 'Ошибка чтения.',
|
||
ZipArchive::ER_SEEK => 'Ошибка поиска (Seek error).',
|
||
];
|
||
|
||
return $errors[$code] ?? "Неизвестная ошибка с кодом: {$code}";
|
||
}
|
||
} |