从 doc 和 docx 中提取文本

2024-10-28 08:37:00
admin
原创
213
摘要:问题描述:我想知道如何读取 doc 或 docx 的内容。我使用的是 Linux VPS 和 PHP,但如果有使用其他语言的更简单的解决方案,请告诉我,只要它可以在 Linux 网络服务器下运行。解决方案 1:在这里我添加了从.doc、.docx word 文件中获取文本的解决方案如何从 word 文件 .d...

问题描述:

我想知道如何读取 doc 或 docx 的内容。我使用的是 Linux VPS 和 PHP,但如果有使用其他语言的更简单的解决方案,请告诉我,只要它可以在 Linux 网络服务器下运行。


解决方案 1:

在这里我添加了从.doc、.docx word 文件中获取文本的解决方案

如何从 word 文件 .doc、docx php 中提取文本

对于 .doc

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-9s,.-

    @/_()]/","",$outtext);
    return $outtext;
}

对于 .docx

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>', "
", $content);
        $striped_content = strip_tags($content);

        return $striped_content;
    }

解决方案 2:

这仅适用于 .DOCX 解决方案。对于 .DOC 或 .PDF,您需要使用其他解决方案,例如适用于 PDF 的pdf2text.php

function docx2text($filename) {
   return readZippedXML($filename, "word/document.xml");
 }

function readZippedXML($archiveFile, $dataFile) {
// Create new ZIP archive
$zip = new ZipArchive;

// Open received archive file
if (true === $zip->open($archiveFile)) {
    // If done, search for the data file in the archive
    if (($index = $zip->locateName($dataFile)) !== false) {
        // If found, read it to the string
        $data = $zip->getFromIndex($index);
        // Close archive file
        $zip->close();
        // Load XML from a string
        // Skip errors and warnings
        $xml = new DOMDocument();
    $xml->loadXML($data, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
        // Return data without XML formatting tags
        return strip_tags($xml->saveXML());
    }
    $zip->close();
}

// In case of failure return empty string
return "";
}

echo docx2text("test.docx"); // Save this contents to file

解决方案 3:

解析 .docx、.odt、.doc 和 .rtf 文档

我编写了一个库,根据这里和其他地方的答案来解析 docx、odt 和 rtf 文档。

我对 .docx 和 .odt 解析所做的主要改进是,该库处理描述文档的 XML 并尝试使其符合 HTML 标签,即emstrong标签。这意味着如果您将该库用于 CMS,则文本格式不会丢失

您可以在此处获取

解决方案 4:

我的解决方案是.doc 使用Antiword , .docx 使用docx2txt

假设您控制一个 Linux 服务器,下载每个程序,解压然后安装。我在系统范围内安装了每个程序:

反词:make global_install

docx2txt:make install

然后使用这些工具将文本提取为 php 中的字符串:

//for .doc
$text = shell_exec('/usr/local/bin/antiword -w 0 ' . 
    escapeshellarg($docFilePath));

//for .docx
$text = shell_exec('/usr/local/bin/docx2txt.pl ' . 
    escapeshellarg($docxFilePath) . ' -');

docx2txt 需要 perl

no_freedom 的解决方案确实能从 docx 文件中提取文本,但它会破坏空格。我测试的大多数文件都存在应分开的单词之间没有空格的情况。当您想要对正在处理的文档进行全文搜索时,这不太好。

解决方案 5:

尝试ApachePOI。它对 Java 很有效。我想你在 Linux 上安装 Java 不会遇到任何困难。

解决方案 6:

我建议使用 apache Tika 提取文本,您可以提取多种类型的文件内容,如 .doc/.docx 和 pdf 等。

解决方案 7:

我使用docxtotxt来提取docx文件内容,我的代码如下:

if($extention == "docx")
{   
    $docxFilePath = "/var/www/vhosts/abc.com/httpdocs/writers/filename.docx";
    $content = shell_exec('/var/www/vhosts/abc.com/httpdocs/docx2txt/docx2txt.pl     
    '.escapeshellarg($docxFilePath) . ' -');
}

解决方案 8:

我对 doc 到 txt 转换器功能做了一些改进

private function read_doc() {
    $line_array = array();
    $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 )  {

        } else {
            $line_array[] = preg_replace( "/[^a-zA-Z0-9s,.-

    @/_()]/", "", $thisline );

        }
    }

    return implode("
",$line_array);
}

现在它保存空行并且 txt 文件逐行查看。

解决方案 9:

您可以使用Apache Tika作为完整的解决方案,它提供 REST API。

另一个不错的库是RawText,因为它可以对图像进行 OCR,并从任何文档中提取文本。它不是免费的,并且通过 REST API 工作。

使用 RawText 提取文件的示例代码:

$result = $rawText->extract($your_file)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2606  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1558  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   40  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   38  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   33  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用