php - 读取word文件标题的问题

标签 php ms-word

我一直在寻找可以将 doc 和 docx 文件转换为 PHP 字符串的东西。

到目前为止,我在使用 SO 答案中的代码方面取得了相当大的成功,例如:

还有一个人在 Github 上制作的类(class):

我也尝试过 Antiword,但它只能读取 doc 文件(不是 docx),而且时好时坏。

我面临的问题是,大多数时候,当文档包含标题时,上述解决方案都不会读取标题。它将从返回的字符串中省略。

有什么东西可以读取Word文档标题并转换为字符串吗?

PHPWord经常被建议,但据我了解,它用于创建而不是读取Word文档。

注意,这是我当前用于将 doc/docx 转换为 PHP 字符串的类。它运行良好,但似乎无法解析 header :

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\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";
        }
    }

}

最佳答案

我通过修改问题中发布的代码中的类解决了我的问题,如下所示(它现在读取 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;
}

关于php - 读取word文件标题的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997155/

相关文章:

algorithm - 旧的Word文件格式*.doc,MS在其旧文档格式中使用了哪种压缩算法?

php - 如何摆脱 PHP 表单重定向

php - 如何在 Windows 10 主机上的 Ubuntu 16 Virtual Box guest 中安装 PHP5?

html中的php脚本

VBA 电源运算符 (^) 在 64 位 VBA 中未按预期工作

vba - 如何将Word 2010宏部署给其他人?

javascript - Office.js : ContentControl in table broken after inserting row

ms-access - MS Access 中的 VBA 链接到 Word - 错误代码 5981

php - 通过 ORM 将数据导入 Magento 的性能是否可以接受,或者直接 SQL 是唯一的选择吗?

php - 如何在 PHP 中检查文件是 ASCII 还是二进制