【发布时间】:2018-05-23 11:28:43
【问题描述】:
我在 Laravel 5.4 项目中使用“PDF Parser”来获取 pdf 文件的内容。但是当我转储内容时,我会得到一些编码文本,当将其悬停在上面时,会显示“5868 个二进制或非 UTF-8 字符”。
这是应该读取文件内容的代码。
$file = $request->file('file');
$parser = new \Smalot\PdfParser\Parser();
$pdf = $parser->parseFile($file);
$scannedText = $pdf->getText();
dd($scannedText);
它会转储这样的东西:
x00i\x00n\x00g\x00ª\x00t\x00h\x00i
当“编码类型”设置为“自动”时,PHP 的 mb_detect_encoding() 函数返回 false。
utf8_encode() 也不起作用,所以我知道它不是 ISO-8859-1 编码。
这就是我现在卡住的地方。任何帮助表示赞赏。
【问题讨论】:
-
将原始字节放入十六进制/文本编辑器并为其选择不同的编码来解释内容,直到找到文本看起来正确的编码。如果每隔一个字节是
00,您可能正在查看 UTF-16 编码的文本。 -
这很棘手。在您知道原始编码是什么之前,您无法转换编码。我想看看是否可以从原始 PDF 文件本身中提取编码信息。您正在使用的抽象库
Smalot\PdfParser\Parser可能能够提供此信息?如果不是,您需要查看其他 PDF 解析解决方案。这是一个有趣的问题 - 请随时通知我们您的最终解决方案! :) -
感谢您的快速回复,伙计们。 @kieranpotts 我检查了 pdf 文件,字体采用 Identity-H 编码。另外,当我使用 Laravel 的内置文件系统来检索内容(而不是 PdfParser 包),然后转储内容时,会显示一些不可读的文本,但现在编码似乎不同了。所以我继续做一个
mb_detect_encoding,我得到'UTF-8'。这一次,我相信问题在于试图转储文件内容。如果我错了,请纠正我。 -
@deceze 这是个好主意。但我正在寻找一种更简单、可以编写代码的程序化解决方案。不过谢谢...非常感谢。