【问题标题】:How to convert a non-UTF-8 encoding to a more readable/ UTF-8 encoding in PHP?如何在 PHP 中将非 UTF-8 编码转换为更具可读性/ UTF-8 编码?
【发布时间】: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 这是个好主意。但我正在寻找一种更简单、可以编写代码的程序化解决方案。不过谢谢...非常感谢。

标签: php laravel php-7


【解决方案1】:

在我的项目中,我遇到了与“PDF Parser”类似的错误。

但是我没有再遇到这个错误:https://github.com/spatie/pdf-to-text

你可以使用 composer 来安装它:

composer require spatie/pdf-to-text

它就是这样工作的:

use Spatie\PdfToText\Pdf;

$pdf = (new Pdf())->setPdf('sample.pdf');

$pdf->setOptions(['layout']);

dump($pdf->text());

【讨论】:

  • 大约一年前我在做这个项目,我记得在使用 PDF Parser 挣扎了一段时间后,我切换到了 PdfToText,它就像一个魅力。不过忘记在这里发了。无论如何,谢谢您的回复。干杯!
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 2011-06-26
  • 2014-02-02
  • 2012-01-25
  • 2012-01-15
  • 2015-08-15
  • 2015-02-17
  • 1970-01-01
相关资源
最近更新 更多