vaites/php-apache-tika

PHP Apache Tika绑定:从文档和图像(带OCR)中提取文本、元数据等...

v1.3.2 2024-05-28 22:00 UTC

README

Current release Package at Packagist Build status Code coverage Code quality Code insight License

PHP Apache Tika

此工具提供了Apache Tika的PHP绑定,允许从文档、图像和其他格式中提取文本和元数据。

支持以下模式

  • 应用程序模式:通过命令行界面运行应用程序JAR
  • 服务器模式:向JSR 311网络服务器发送HTTP请求

建议使用服务器模式,因为它比应用程序模式快5倍,但一些共享主机不允许在后台运行进程。

尽管库包含支持的版本列表,但只要Tika团队保持向后兼容性,任何版本的Apache Tika都应该是兼容的。因此,无需等待库更新即可与工具的新版本一起工作。

特性

  • Apache Tika特性的简单类接口
    • 文本和HTML提取
    • 元数据提取
    • OCR识别
  • 文档的标准化元数据
  • 支持本地和远程资源
  • 无重量级库依赖
  • 兼容Apache Tika 1.15或更高版本
    • 已测试到1.28.5和2.9.2
  • 适用于Linux、macOS、Windows,可能也适用于FreeBSD

需求

  • PHP 7.3或更高版本
  • Apache Tika 1.15或更高版本
  • Oracle Java或OpenJDK
    • Java 8用于Tika 1.19或更高版本
    • Java 7用于Tika 1.15至1.18
  • Tesseract(用于OCR识别,可选)

注意:支持的PHP版本将与PHP团队支持的最新版本保持同步

安装

使用Composer安装

composer require vaites/php-apache-tika

如果您想使用OCR,必须安装Tesseract

  • Fedora/CentOS:`sudo yum install tesseract`(在Fedora 22或更高版本上使用dnf代替yum)
  • Debian/Ubuntu:`sudo apt-get install tesseract-ocr`
  • macOS:`brew install tesseract`(使用Homebrew
  • Windows:`scoop install tesseract`(使用Scoop

库假设`tesseract`二进制文件在路径中,因此您可以自己编译它或使用任何其他方法安装。

用法

请谨慎启动Apache Tika服务器

java -jar tika-server-x.xx.jar

如果您使用的是JRE而不是JDK,并且具有Java 9或更高版本,则必须运行

java --add-modules java.se.ee -jar tika-server-x.xx.jar

实例化类,检查JAR是否存在或服务器是否正在运行

$client = \Vaites\ApacheTika\Client::make('localhost', 9998);           // server mode (default)
$client = \Vaites\ApacheTika\Client::make('/path/to/tika-app.jar');     // app mode 

如果您想使用依赖注入,则序列化类或仅延迟检查

$client = \Vaites\ApacheTika\Client::prepare('localhost', 9998);
$client = \Vaites\ApacheTika\Client::prepare('/path/to/tika-app.jar'); 

您也可以使用URL

$client = \Vaites\ApacheTika\Client::make('http://localhost:9998');
$client = \Vaites\ApacheTika\Client::prepare('http://localhost:9998');

使用该类从文档中提取文本

$language = $client->getLanguage('/path/to/your/document');
$metadata = $client->getMetadata('/path/to/your/document');

$html = $client->getHTML('/path/to/your/document');
$text = $client->getText('/path/to/your/document');

或从图像中提取文本

$client = \Vaites\ApacheTika\Client::make($host, $port);
$metadata = $client->getMetadata('/path/to/your/image');

$text = $client->getText('/path/to/your/image');

您可以使用URL而不是文件路径,库将下载文件并将其传递给Apache Tika。在启动服务器时,无需将-enableUnsecureFeatures -enableFileUrl添加到命令行,具体说明请参阅此处

如果您使用Apache Tika >= 2.0.0,您可以定义一个HttpFetcher并使用选项-enableUnsecureFeatures -enableFileUrl在启动服务器时,使服务器在传递URL而不是文件名时下载远程文件。为此,您必须使用$client->setFetcherName('yourFetcherName')设置HttpFetcher的名称。

方法

以下是可用的方法完整列表

常见

Tika文件相关方法

$client->getMetadata($file);
$client->getRecursiveMetadata($file, 'text');
$client->getLanguage($file);
$client->getMIME($file);
$client->getHTML($file);
$client->getXHTML($file); // only CLI mode
$client->getText($file);
$client->getMainText($file);

其他Tika相关方法

$client->getSupportedMIMETypes();
$client->getIsMIMETypeSupported('application/pdf');
$client->getAvailableDetectors();
$client->getAvailableParsers();
$client->getVersion();

编码方法

$client->getEncoding();
$client->setEncoding('UTF-8');

支持版本相关方法

$client->getSupportedVersions();
$client->isVersionSupported($version);

设置/获取响应顺序读取的回调

$client->setCallback($callback);
$client->getCallback();

设置/获取顺序读取的块大小

$client->setChunkSize($size);
$client->getChunkSize();

启用/禁用内部远程文件下载器

$client->setDownloadRemote(true);
$client->getDownloadRemote();

设置fetcher名称

$client->setFetcherName($fetcher); // one of FileSystemFetcher, HttpFetcher, S3Fetcher, GCSFetcher, or SolrFetcher
$client->getFetcherName();

命令行客户端

设置/获取JAR/Java路径(仅限CLI模式)

$client->setPath($path);
$client->getPath();

$client->setJava($java);
$client->getJava();

$client->setJavaArgs('-JXmx4g');
$client->getJavaArgs();

$client->setEnvVars(['LANG' => 'es_ES.UTF-8']);
$client->getEnvVars();

Web客户端

设置/获取主机属性

$client->setHost($host);
$client->getHost();

$client->setPort($port);
$client->getPort();

$client->setUrl($url);
$client->getUrl();

$client->setRetries($retries);
$client->getRetries();

设置/获取cURL客户端选项

$client->setOptions($options);
$client->getOptions();
$client->setOption($option, $value);
$client->getOption($option);

设置/获取超时

$client->setTimeout($seconds);
$client->getTimeout();

设置/获取HTTP头(见TikaServer

$client->setHeader('Foo', 'bar');
$client->getHeader('Foo');
$client->setHeaders(['Foo' => 'bar', 'Bar' => 'baz']);
$client->getHeaders();

设置/获取OCR语言(见TikaOCR

$client->setOCRLanguage($language);
$client->setOCRLanguages($languages);
$client->getOCRLanguages();

设置HTTP fetcher名称(仅限Tika >= 2.0.0,见https://cwiki.apache.org/confluence/display/TIKA/tika-pipes

$client->setFetcherName($fetcherName)

破坏性更改

从1.0版本开始有一些破坏性更改

  • 不支持Apache Tika版本1.15之前的版本(使用0.x版本用于1.14和更早版本)
  • PHP最低要求为7.3或更高(使用0.x版本用于7.1和更早版本)
  • $client->getRecursiveMetadata()返回一个预期的数组
  • Client::getSupportedVersions()Client::isVersionSupported()方法不能静态调用
  • Client::getAvailableDetectors()Client::getAvailableParsers()返回的值相同,并且有新的定义

有关更多详细信息,请参阅CHANGELOG.md

故障排除

空响应或意外结果

此库仅是一个代理,因此如果您收到空响应或意外结果,最常见的原因是Tika本身。一个简单的测试是使用GUI来检查响应

  1. 不带参数运行Tika应用程序:java -jar tika-app-x.xx.jar
  2. 放下您的文件或使用文件 -> 打开选择它
  3. 等待直到元数据出现
  4. 使用查看菜单获取文本或HTML

如果结果相同,您必须查看Tika的Jira并在必要时打开一个问题。

编码

默认情况下,返回的文本使用UTF-8编码,而Client::setEncoding()方法允许设置预期的编码。

测试

测试旨在覆盖Apache Tika在app模式和服务器模式下的所有功能的所有支持版本。有几个样本用于测试

  • sample1:文档元数据和文本提取
  • sample2:图像元数据
  • sample3:文本识别
  • sample4:不支持的媒体
  • sample5:用于回调的大文本
  • sample6:远程调用
  • sample7:文本编码
  • sample8:递归元数据

已知问题

测试过程中发现了一些问题,这些问题与该库无关

  • Apache Tika 1.17及以下版本无法按照描述从OCR中提取文本,详情请见TIKA-2509
  • Tesseract会减慢文档解析速度,详情请见TIKA-2359

集成