我使用了一个名为pdfparser的库从PDF中提取文本。我已经成功地做到了,但是我对提取的文本有一些更棘手的问题。字符串如下:
Invoice
Date
1/8/2016
Invoice #
1679105
Bill To
etc...
当我使用preg_match
来匹配单个字符时,比如字母I,我会得到一个大写的I作为回报,如果我使用preg_match_all
,我会按照你期望的顺序得到一个大小写字母I的数组。但如果我尝试"in",我什么都得不到,而它应该在"Invoice"中返回"in"。这适用于我在搜索中尝试的任何字母组合。
这就是将PDF数据(来自电子邮件附件)转换为ASCII字符串的方法:
$parser = new SmalotPdfParserParser();
$pdf = $parser->parseContent($body);
$pages = $pdf->getPages();
$pdfText = "";
foreach ($pages as $pageNum => $page)
$pdfText .= "ntPage $pageNumn".$page->getText();
这就是在文档中搜索的内容:
$regex = "/invoice/i";
preg_match_all($regex, $pdfText, $test);
echo "<h2>PDF Text</h2><pre>$pdfText</pre>";
echo "<pre><b>Search Results for $regex</b>".print_r($test,1)."</pre>";
这将返回0个结果。即使是像$regex = "/[0-9]{2,}/"
这样简单的东西也不会返回任何结果
编辑:我复制并粘贴了$pdfText在浏览器中显示的文本,然后将其作为字符串粘贴到我的php文件中,并使用完全相同的代码进行搜索。搜索效果非常好。
编辑2:发现问题但我仍然需要帮助。我使用了函数bin2hex( $pdfText )
,发现单词"invoice"的十六进制代码为"0049006e0076006f006900630065"。如果正确表示,它实际上是"496e766f696365"。因此,在我的PDF字符串中,每个字母之间都有一个十六进制值为"00"的字符。我该怎么把他们都赶走?
要修复包含不需要的十六进制值的字符,可以使用此方法替换它。
preg_replace('/x00/', '', $string);