Есть ли способ отформатировать преобразованный файл docx в текст в php?

Здравствуйте, я хочу красиво отформатировать преобразованный файл doc или docx в текст в php? Код ниже — это класс, который я использовал для преобразования файла docx в текст.

class DocxConversion{
    private $filename;

    public function __construct($filePath) {
        $this->filename = $filePath;
    }

    private function read_doc() {
        $fileHandle = fopen($this->filename, "r");
        $line = @fread($fileHandle, filesize($this->filename));   
        $lines = explode(chr(0x0D),$line);
        $outtext = "";
        foreach($lines as $thisline)
          {
            $pos = strpos($thisline, chr(0x00));
            if (($pos !== FALSE)||(strlen($thisline)==0))
              {
              } else {
                $outtext .= $thisline." ";
              }
          }
         $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
        return $outtext;
    }

    private function read_docx(){

        $striped_content = '';
        $content = '';

        $zip = zip_open($this->filename);

        if (!$zip || is_numeric($zip)) return false;

        while ($zip_entry = zip_read($zip)) {

            if (zip_entry_open($zip, $zip_entry) == FALSE) continue;

            if (zip_entry_name($zip_entry) != "word/document.xml") continue;

            $content .= zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

            zip_entry_close($zip_entry);
        }// end while

        zip_close($zip);

        $content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
        $content = str_replace('</w:r></w:p>', "\r\n", $content);
        $striped_content = strip_tags($content);

        return $striped_content;
    }

 /************************excel sheet************************************/

function xlsx_to_text($input_file){
    $xml_filename = "xl/sharedStrings.xml"; //content file name
    $zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $zip_handle->open($input_file)){
        if(($xml_index = $zip_handle->locateName($xml_filename)) !== false){
            $xml_datas = $zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text = strip_tags($xml_handle->saveXML());
        }else{
            $output_text .="";
        }
        $zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}

/*************************power point files*****************************/
function pptx_to_text($input_file){
    $zip_handle = new ZipArchive;
    $output_text = "";
    if(true === $zip_handle->open($input_file)){
        $slide_number = 1; //loop through slide files
        while(($xml_index = $zip_handle->locateName("ppt/slides/slide".$slide_number.".xml")) !== false){
            $xml_datas = $zip_handle->getFromIndex($xml_index);
            $xml_handle = DOMDocument::loadXML($xml_datas, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            $output_text .= strip_tags($xml_handle->saveXML());
            $slide_number++;
        }
        if($slide_number == 1){
            $output_text .="";
        }
        $zip_handle->close();
    }else{
    $output_text .="";
    }
    return $output_text;
}


    public function convertToText() {

        if(isset($this->filename) && !file_exists($this->filename)) {
            return "File Not exists";
        }

        $fileArray = pathinfo($this->filename);
        $file_ext  = $fileArray['extension'];
        if($file_ext == "doc" || $file_ext == "docx" || $file_ext == "xlsx" || $file_ext == "pptx")
        {
            if($file_ext == "doc") {
                return $this->read_doc();
            } elseif($file_ext == "docx") {
                return $this->read_docx();
            } elseif($file_ext == "xlsx") {
                return $this->xlsx_to_text();
            }elseif($file_ext == "pptx") {
                return $this->pptx_to_text();
            }
        } else {
            return "Invalid File Type";
        }
    }

}

Образец вывода похож на текст без пробелов, отступов, заголовков и многого другого. Это пример вывода, который появляется, когда я успешно конвертирую его.

СПИСОК СОПРОВОЖДЕНИЯ Исполняющий обязанности пастора Родители пастора Рона Эгегрума г-н Марио Кабунок мл. Родители Сусаны КабунокБрайд: г-н Эдильберто Марукут (умерший) г-жа. Иоланда МарукатОсновные спонсоры: капитан Немезио Десалес III, г-н Эдвин Гинес, г-н. Валентино Кабунок Mr. Фелипе МарукутMr. Нило Кабунок г-н. Фройлан Дульсе Г-н Хосе Фаби КабунокГ-н. Рамон Наварро Г-н Альфонсо Фернандес Г-н Исагани КабунокГ-н. Аллан Кабунок г-н. Юлиус ОрпиллаMrs. Родора ДесалесMrs. Кларита Алонсо, миссис Нинья Кабунок, миссис. Робелита Ана Миссис Марифе КабунокMrs. Джуви Дульсе, миссис Имельда де Гиамс. Имельда ФураггананMrs. Мадамуазель Гранада Миссис Майет Идальго Миссис Аналин Кабида Миссис Лус Игнасио Шафер Марио Кабунок III Подружка невесты Маривик Марукат Грумсман Уоррен Ван КабунокПодружка невесты Кристель Джой КабунокВторичные спонсоры Свечи Кристиан Пауло ДивинаАланис Джойс АльбисоВейл Винсент Аллен ФернандесШила Мэй КабунокКорд Курт Джейсон АльбсоСирилл Оллсо Rain FacunlaBible Bearer Ralph Jacob Dulce Ring Bearer Caleb Joshua MarucutFlowergirlsShekinah Irish CabunocYurie Ysabelle MarucutElisha Bernice Cajandig

Этот текст ниже - это формат, который я хочу сделать так же, как в файле docx.

СПИСОК АНТУРАЖА

Исполняющий обязанности пастор Пастор Рон Эге

Родители жениха г-н Марио Кабунок-младший г-жа Сусана Кабунок Родители невесты: г-н Эдильберто Марукут (умерший) г-жа Иоланда Марукут

Основные спонсоры:

Капитан Немесио Десалес III Г-н Эдвин Хинес Г-н Валентино Кабунок Г-н Фелипе Марукут Г-н Нило Кабунок Г-н Фройлан Дульсе Г-н Хосе Фаби Кабунок Г-н Рамон Наварро Г-н Альфонсо Фернандес Г-н Исагани Кабунок Г-н Аллан Кабунок Г-н Джулиус Орпилья Г-жа Родора Десалес Г-жа Кларита Алонсо Г-жа Нинья Кабунок Г-жа Робелита Ана Г-жа Марифе Кабунок Г-жа Жюви Дульсе Г-жа Имельда де Гия Г-жа Имельда Фурагганан Г-жа Мадамуазель Гранада Г-жа Майет Идальго Г-жа Аналин Кабида Г-жа Лус Игнасио

Я хочу отредактировать вывод формата файла docx в php. Кто-нибудь может помочь? Заранее спасибо!!


person Eys    schedule 23.09.2019    source источник
comment
Каков ожидаемый результат?   -  person Felippe Duarte    schedule 23.09.2019
comment
@FelippeDuarte Ожидаемый результат, который я хочу, - отформатировать так же, как в файле docx. Я собираюсь отредактировать это.   -  person Eys    schedule 23.09.2019
comment
Простой текстовый файл вряд ли можно отформатировать так же, как документ Word. Word был разработан не просто так: редактирование текста не лучше, чем использование пишущей машинки (если вы вообще знаете, что это такое...). Единственное форматирование, которое вы можете сделать в обычном тексте, — это изменить количество пробелов.   -  person Cindy Meister    schedule 23.09.2019
comment
почему вы не используете phpword?   -  person Robert    schedule 23.09.2019
comment
@Robert Роберт, я не могу понять, как использовать phpword, это так сложно, даже если я ищу его, в моем коде всегда есть ошибка. Можете ли вы легко научить меня, как использовать PHPWORD?   -  person Eys    schedule 23.09.2019
comment
начните использовать его, если у вас есть проблемы с поиском в Интернете, если вы не найдете решения, задайте вопрос здесь. Это лучший способ учиться.   -  person Robert    schedule 24.09.2019


Ответы (1)


Этот

$content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
$content = str_replace('</w:r></w:p>', "\r\n", $content);
$striped_content = strip_tags($content);

удаляет все p и br

Вам нужно сначала защитить их, а затем заменить

$content = str_replace('</w:r></w:p></w:tc><w:tc>', " ", $content);
$content = str_replace('</w:r></w:p>', "#BR#", $content);
$content = str_replace('<w:br/>', "#BR#", $content);
$content = str_replace('<w:jc w:val="center"/>', "#BR##BR#", $content);
$content = str_replace('<w:jc w:val="both"/>', "#BR##BR#", $content);
$content = str_replace('<w:jc w:val="left"/>', "#BR##BR#", $content);
$content = str_replace('<w:jc w:val="right"/>', "#BR##BR#", $content);
$striped_content = strip_tags($content);
$striped_content = str_replace("#BR#","\r\n", $striped_content);

Я использую раздельную замену для каждого типа абзаца, потому что вы также можете
заменить ‹w:jc w:val=center/› чем-то вроде #CENTER# и замените его дополнительными пробелами. Как я сделал. Если нет, то лучше объединить их в один.

person ABelikov    schedule 19.08.2020