常見問題

thinkphp5 編輯器上傳word轉html

常見問題

2381

字體:

php 使用PhpOffice\PhpWord 將word文檔生成html 以及圖片本地化處理 html處理

use think\Db;

use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\Style\Font;
use PhpOffice\PhpWord\Shared\ZipArchive;
use PhpOffice\PhpWord\Settings;
use PhpOffice\PhpWord\Shared\Converter;
use PhpOffice\PhpWord\Style\TablePosition;
use think\Env;
private $savePath = '/upload/word/';
public function woedjx(){

    $file = request()->file('file');
    $fileurl='http://x.hbsjsd.cn/static/conf/33';
    if($file){
        $info = $file->move(ROOT_PATH .$fileurl. DS . 'word');
        $wordr= $info->getSaveName();
        $word=$fileurl.DS.'word'.DS.$wordr;
        $objWriter = IOFactory::createWriter(IOFactory::load(ROOT_PATH.$word), 'HTML');
        $tempHtml = ROOT_PATH. '/public/static/' .substr($info->getFilename(), 0, strpos($info->getFilename(), '.')) . '.html';
        $objWriter->save($tempHtml);
        $html = file_get_contents($tempHtml);

        $html = $this->getHtmlBody($html);

        if ($html == '') {
            throw new \Exception('上傳文件內容為空');
        }
        $html = $this->saveImage($html);
        $html = $this->clearStyle($html);
        $html = $this->clearSpan($html);
    }else{
        // 上傳失敗獲取錯誤信息
        echo $file->getError();
    }

    return json(['code'=>1,"msg"=>$html]);
}

/**
 * @param $html
 * [url=home.php?mod=space&uid=155549]@Return[/url] string
 * 匹配出body的內容
 */
private function getHtmlBody($html) {
    preg_match('/([\s\S]*)/', $html,$matches);
    return isset($matches[1]) ? $matches[1] : '';
}

/**
 * @param $html
 * @return mixed
 * 圖片處理
 */
private function saveImage($html){
    //匹配圖片
    ini_set('pcre.backtrack_limit', 9999999);
    preg_match_all('/]*src="([\s\S]*?)"\/>/', $html,$imageMatches);
    if (!$imageMatches[1]) {
        return $html;
    }
    //print_r($imageMatches[1]);exit;
    $imageUrl = [];
    foreach ($imageMatches[1] as $image) {
        $imageUrl[] = $this->saveLocalBase64Image($image);
    }
    return str_replace($imageMatches[1], $imageUrl, $html);
}

/**
 * @param $base64_image_content
 * @return string
 * 保存圖片到本地
 */
private function saveLocalBase64Image($base64_image_content){
    $imge_web_url = '';
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
        //圖片后綴
        $type = $result[2];
        //保存位置--圖片名
        $image_name = date('His') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT). '.' . $type; //圖片名稱
        $image_file_path ='http://x.hbsjsd.cn/static/conf/33/word/img/'.date('Ymd'); //static/upload/word/image/20200522
        $image_file = ROOT_PATH. $image_file_path;
        $imge_real_url = $image_file . '/' . $image_name;
        $imge_web_url = $image_file_path .  '/' . $image_name;

        if (!file_exists($image_file)){
            mkdir($image_file, 0700, true);
        }
        //解碼
        $decode = base64_decode(str_replace($result[1], '', $base64_image_content));
        $res = file_put_contents($imge_real_url, $decode);

        return $imge_web_url;
    }
    return $imge_web_url;
}

/**
 * @param $content
 * @return null|string|string[]
 * 清除p,span標簽的樣式
 */
private function clearStyle($content)
{
    $patterns = array (
        '//i',
    );
    return preg_replace($patterns, '', $content);
}

/**
 * @param $content
 * @return null|string|string[]
 * 清除span標簽
 */
private function clearSpan($content)
{
    $patterns = array (
        '//i',
        '//i',
    );
    return preg_replace($patterns, '', $content);
}

/**
 * @return mixed
 */
public function getErrorMsg()
{
    return $this->errorMsg;
}

[聲明]原創(chuàng)不易,請轉發(fā)者備注下文章來源(hbsjsd.cn)【速建時代】。