2016-12-06 4 views
0

私はdocとdocxファイルをPHPの文字列に変換するための何かを探してきました。ワードファイルのヘッダーを読む問題

もGithubの誰か上のクラスには、作られた:

は、これまでのところ私はのようにSOなどに答えからコードを使用してかなり良い成功を収めてきました:

私も試したことがありますアンチワードしかし、それはdocファイル(docxではない)しか読み込めず、ヒットするか見逃します。

私が直面している問題は、ほとんどの場合、ドキュメントにヘッダーが含まれている場合、上記の解決方法のいずれもヘッダーを読み取らないということです。返される文字列からは省略されます。

ワードドキュメントヘッダを読み込んで文字列に変換するものはありますか?

PHPWordがよく提案されていますが、私の理解からは、Word文書を作成したり読んだりしないようにしています。

これは、私が現在doc/docxをPHPの文字列に変換するために使用しているクラスです。それはうまく動作しますが、ヘッダーを解析していないよう:

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 = ""; 
     $content_started=false; 
     foreach($lines as $thisline){ 
      $pos = strrpos($thisline, chr(0x00)); 
      if (($pos !== FALSE)||(strlen($thisline)==0)){   
      } 
      else { 
       if(!$content_started){ 
        $outtext.=substr($lastline,$lastpos)." "; 
       } 
       $content_started=true; 
       $outtext .= $thisline." "; 
      } 
       $lastline=$thisline; 
       $lastpos=$pos; 
      } 
     $outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\[email protected]\/\_\(\)]/"," ",$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"; 
     } 
    } 

} 

答えて

1

PHPWordは、文書を読むことができる、私は、問題の投稿をコードでクラスを修正することによって、私の問題を解決してきましたhere

+0

任意の最新のリソースへのWord文書を読んだ上であるかどう例はPHPWordの古いバージョンを使用しているように見える、あなたが知っていること? – dlofrodloh

0

を見ます(それが存在する場合、それは今のdocx zipファイルにヘッダを読み込む)、次のとおりです。

private function read_docx(){ 

    $striped_content = ''; 
    $content = ''; 
    $header_content=''; 
    $main_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; 

     //Can be header1.xml or header2.xml etc., determine if it's a header 
     $header_substr=substr(zip_entry_name($zip_entry),0,11); 
     //If it's not an xml file we want, skip 
     if (zip_entry_name($zip_entry) != "word/document.xml" AND $header_substr!="word/header") continue; 

     //Allocate to the relevant content 
     $sub_content=zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 
     if($header_substr=="word/header"){ 
      $header_content .= $sub_content; 
     } 
     else { 
      $main_content .= $sub_content; 
     } 
     zip_entry_close($zip_entry); 
    } 

    zip_close($zip); 

    $content=$header_content." ".$main_content; 

    $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; 
}