我一直在寻找可以将 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/