有一种doc文件,office word可以正常打开,但当你想像其他doc文件一样使用libreoffice去操作它的时候会发现里面全是字符串,使用一个编辑器(比如Sublime Text)打开后发现,里面的内容是这样的:
From:
Subject: Resume
MIME-Version:1.0
X-51JOB-FLAG:EhireExport_20190527_15590388
Content-Type:multipart/related;boundary="--boundary_0_9ed30801b0c180c69b3c5d74fede848e"
----boundary_0_9ed30801b0c180c69b3c5d74fede848e
Content-Type:text/html;charset="gb2312"
Content-Transfer-Encoding:base64
PGh0bWw+PGJvZHk+PHRhYmxlIHdpZHRoPSc3MDInIGhlaWdodD0nNjInIGJvcmRlcj0nMCcgYWxp
Z249J2NlbnRlcicgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkIHdpZHRo
PSc2MiUnIGhlaWdodD0nNTAnIGFsaWduPSdsZWZ0JyB2YWxpZ249J2JvdHRvbScgY2xhc3M9J3Rv
cCc+PGJyIC8+uPzQwsqxvOSjujxzcGFuIHN0eWxlPSJjb2xvcjojMjU2ZmI4OyI+MjAxOS0wNS0y
Mzwvc3Bhbj48L3RkPjx0ZCB3aWR0aD0nMzclJyBhbGlnbj0ncmlnaHQnIHZhbGlnbj0nYm90dG9t
Jz48aW1nIHdpZHRoPScxMjAnIGhlaWdodD0nNTAnIHNyYz0iY2lkOjZjM2U4MmRjLTNhZGEtNDNj
MS05NDdjLTc3OWY2YzI5MWRjZiIgLz48L3RkPjwvdHI+PC90YWJsZT48dGFibGUgd2lkdGg9Ijcw
MyIgYm9yZGVyPSIwIiBhbGlnbj0iY2VudGVyIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9
IjAiID48dHI+PHRkPjxodG1sIHhtbG5zOmNvZGU9InVybjplaGlyZS54c2x0LmV4dGVuc2lvbiI+
PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
IGNoYXJzZXQ9Z2IyMzEyIj48c3R5bGU+DQogICAgICAgICAgI3RvcENoYXJ0eyBiYWNrZ3JvdW5k
...
经过一番探究,这是一份被编码的邮件格式文件,既然邮件格式,当然是有东西可以把它解码的,又经过一番探究,我找到了这个包php-mime-mail-parser/php-mime-mail-parser,于是就有了办法。
注意,在使用php-mime-mail-parser之前,需要安装php的mailparse扩展,请参考项目GitHub,上代码:
public function actionMht()
{
$file = Yii::getAlias('@runtime') . '/20190527.doc';
if($this->isMht($file)) {
$parser = new PhpMimeMailParser\Parser();
$parser->setText(file_get_contents($file));
$body = $parser->getMessageBody('html');
$body = str_replace(['charset=gb2312','charset=gbk'], 'charset=utf-8', $body);
$htmlFile = Yii::getAlias('@runtime') . '/20190527.html';
file_put_contents($htmlFile, $body);
}
}
public function isMht($file)
{
$fileData = fopen($file, "r");
$header = '';
while(!feof($fileData))
{
$data = str_replace(["\n", "\s", "\r\n"], '', fgets($fileData));
$header .= $data;
if($data == '') {
break;
}
}
fclose($fileData);
return strpos($header, 'MIME-Version') !== false;
}
先通过MIME-Version特征去判断是不是这种格式,然后使用php-mime-mail-parser解析,然后将其存储为html文件并将编码html转换成utf-8完成转换,这些特征提取和编码转换只是根据项目中的文件来判断,如果你也是这种文件,可以针对自己待处理的文件做出相应的调整以达到更好的效果。
这个解析器还有很多其他内容提取的方法,非常方便,更多用法参考GitHub。
使用php-mime-mail-parser解析邮件扩展格式的doc文件
更多精彩,敬请关注本博微信公众号:hsu1943