title: PHPWord read word documents preserving the styles
body: <p>I have successfully extracted the text content in a word file using phpWord and the following code:</p>
  
  <pre><code>&lt;?php
  require_once 'vendor/autoload.php';
  
  // Read contents
  $name = 'linux';
  $source = "{$name}.docx";
  echo date('H:i:s'), " Reading contents from {$source} &lt;hr&gt;";
  $phpWord = \PhpOffice\PhpWord\IOFactory::load($source);
  
  $sections = $phpWord-&gt;getSections();
  foreach ($sections as $key =&gt; $value) {
      $sectionElement = $value-&gt;getElements();
      foreach ($sectionElement as $elementKey =&gt; $elementValue) {
          if ($elementValue instanceof \PhpOffice\PhpWord\Element\TextRun) {
              $secondSectionElement = $elementValue-&gt;getElements();
              foreach ($secondSectionElement as $secondSectionElementKey =&gt; $secondSectionElementValue) {
                  if ($secondSectionElementValue instanceof \PhpOffice\PhpWord\Element\Text) {
                      echo $secondSectionElementValue-&gt;getText();
                      echo "&lt;br&gt;";
                  }
              }
          }
      }
  }
  </code></pre>
  
  <p>This displays plain text. Also I tried pure php "zip" functions to fetch the text using the following code which also gives me the plain text:</p>
  
  <pre><code>function read_docx($filename){
  
      $striped_content = '';
      $content = '';
  
      if(!$filename || !file_exists($filename)) return false;
  
      $zip = zip_open($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);
      }
      zip_close($zip);      
      //$content = str_replace('&lt;/w:r&gt;&lt;/w:p&gt;&lt;/w:tc&gt;&lt;w:tc&gt;', " ", $content);
      //$content = str_replace('&lt;/w:r&gt;&lt;/w:p&gt;', "\r\n", $content);
      $striped_content = strip_tags($content);
  
      return $striped_content;
  </code></pre>
  
  <p>I want to extract the word contents and display them in ckeditor/tinymce with preserved styles, as if I copy from word document into ckeditor directly it preserves the styles, I want similar feature but in code. I also want the same function for the following file formats too:</p>
  
  <pre><code>1) LibreOffice/OpenOffice (.odt, .sxw)
  2) Microsoft Works (.wps)
  3) WinWord, WordPad (.rtf)
  4) WordPerfect (.wp, .wpd)
  5) HTML (.htm, .html)
  </code></pre>
  
  <p>What is the best way to do this in PHP ? Are there libraries which can achieve this ?</p>
  
  <p>This is the output I am getting from the zip function code:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
  &lt;w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14"&gt;&lt;w:body&gt;&lt;w:p w14:paraId="676FD033" w14:textId="77777777" w:rsidR="00E43633" w:rsidRPr="007E5F00" w:rsidRDefault="007E5F00" w:rsidP="007E5F00"&gt;&lt;w:pPr&gt;&lt;w:jc w:val="center"/&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;w:sz w:val="28"/&gt;&lt;/w:rPr&gt;&lt;/w:pPr&gt;&lt;w:r w:rsidRPr="007E5F00"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;w:sz w:val="28"/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;Introduction to Linux&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="47931EDA" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRDefault="007E5F00" w:rsidP="007E5F00"&gt;&lt;w:pPr&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;/w:pPr&gt;&lt;w:r w:rsidRPr="007E5F00"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt;Linux &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;commands:&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="7213615E" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRPr="007E5F00" w:rsidRDefault="007E5F00" w:rsidP="007E5F00"&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;mkdir&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; - &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidRPr="007E5F00"&gt;&lt;w:t&gt;This command is used to create a new directory.&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="6C8B3A9F" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRDefault="007E5F00"&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt;Syntax: &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:t&gt;mkdir&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt; [directory name]&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="3454E01F" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRDefault="007E5F00"&gt;&lt;w:pPr&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;/w:pPr&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;rmdir&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; – This &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;commnd&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; is used to remove a directory. &lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="3726D091" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRPr="00E07056" w:rsidRDefault="007E5F00"&gt;&lt;w:r w:rsidRPr="00E07056"&gt;&lt;w:t xml:space="preserve"&gt;Syntax: &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r w:rsidRPr="00E07056"&gt;&lt;w:t&gt;rmdir&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r w:rsidRPr="00E07056"&gt;&lt;w:t xml:space="preserve"&gt; [directory name]&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="671C1334" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRDefault="00644552"&gt;&lt;w:pPr&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;/w:pPr&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;c&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="007E5F00"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;at – This command is used to create a file.&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="007E5F00"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:br/&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="007E5F00"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:br/&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="007E5F00" w:rsidRPr="00E07056"&gt;&lt;w:t&gt;Syntax: cat &amp;gt; [file name]&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="3B19AB80" w14:textId="781534E0" w:rsidR="007E5F00" w:rsidRDefault="007E5F00"&gt;&lt;w:pPr&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;/w:pPr&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;rm – This command is used to delete a file.&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="62D51FC5" w14:textId="77777777" w:rsidR="007E5F00" w:rsidRPr="00E07056" w:rsidRDefault="007E5F00"&gt;&lt;w:r w:rsidRPr="00E07056"&gt;&lt;w:t&gt;Syntax: rm [file name]&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="2530B357" w14:textId="77777777" w:rsidR="00644552" w:rsidRDefault="00644552"&gt;&lt;w:pPr&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;/w:pPr&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt;ls – This command is used to show the list of files. &lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="34187575" w14:textId="20F3787A" w:rsidR="007E5F00" w:rsidRDefault="00644552"&gt;&lt;w:r w:rsidRPr="00E07056"&gt;&lt;w:t&gt;Syntax: ls&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="3761997E" w14:textId="50B84C05" w:rsidR="005F3884" w:rsidRDefault="005F3884"&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;nano&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; – &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t&gt;This command is used to edit a file.&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="494935E1" w14:textId="59787D6D" w:rsidR="005F3884" w:rsidRPr="005F3884" w:rsidRDefault="005F3884"&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt;Syntax: &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:t&gt;nano&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt; [file name]&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="5E9230F7" w14:textId="1AFCF21C" w:rsidR="005F3884" w:rsidRDefault="005F3884"&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt;cd – &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt;This command is used to change the &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="008D2F14"&gt;&lt;w:t&gt;current working directory.&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="74E0E24D" w14:textId="0434C3B6" w:rsidR="00584224" w:rsidRPr="005F3884" w:rsidRDefault="00584224"&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt;Syntax: &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t&gt;cd&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt; [&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t&gt;directory name&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t&gt;]&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="44838DE3" w14:textId="00375B7C" w:rsidR="005F3884" w:rsidRDefault="00584224"&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;p&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="005F3884"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;wd&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;w:r w:rsidR="005F3884"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; present working directory&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="008D2F14"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; – &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="008D2F14"&gt;&lt;w:t&gt;This command is used to display the present working directory.&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="270B9CFF" w14:textId="0D62DC9E" w:rsidR="00584224" w:rsidRPr="008D2F14" w:rsidRDefault="00584224"&gt;&lt;w:r&gt;&lt;w:t xml:space="preserve"&gt;Syntax: &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellStart"/&gt;&lt;w:r&gt;&lt;w:t&gt;pwd&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="spellEnd"/&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="67F33FB5" w14:textId="2680AAEB" w:rsidR="005F3884" w:rsidRDefault="008D2F14"&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;c&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r w:rsidR="005F3884"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t&gt;d&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="gramStart"/&gt;&lt;w:r w:rsidR="005F3884"&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; ..&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:proofErr w:type="gramEnd"/&gt;&lt;w:r&gt;&lt;w:rPr&gt;&lt;w:b/&gt;&lt;/w:rPr&gt;&lt;w:t xml:space="preserve"&gt; – &lt;/w:t&gt;&lt;/w:r&gt;&lt;w:r&gt;&lt;w:t&gt;This command is used to move a directory back.&lt;/w:t&gt;&lt;/w:r&gt;&lt;/w:p&gt;&lt;w:p w14:paraId="3129D383" w14:textId="53F5569B" w:rsidR="00376F17" w:rsidRPr="00376F17" w:rsidRDefault="00376F17"&gt;&lt;w:r&gt;&lt;w:t&gt;Syntax: cd ..&lt;/w:t&gt;&lt;/w:r&gt;&lt;w:bookmarkStart w:id="0" w:name="_GoBack"/&gt;&lt;w:bookmarkEnd w:id="0"/&gt;&lt;/w:p&gt;&lt;w:sectPr w:rsidR="00376F17" w:rsidRPr="00376F17" w:rsidSect="004F205D"&gt;&lt;w:pgSz w:w="12240" w:h="15840"/&gt;&lt;w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="720" w:footer="720" w:gutter="0"/&gt;&lt;w:cols w:space="720"/&gt;&lt;w:docGrid w:linePitch="360"/&gt;&lt;/w:sectPr&gt;&lt;/w:body&gt;&lt;/w:document&gt;
  </code></pre>
  
  <p>I just want the underline, bold, italic, and text centering formatting.</p>