werk365/identitydocuments

用于解析护照等身份证件的包


README

Latest Version on Packagist Total Downloads StyleCI

有关一般问题和建议,请加入gitter

Join the chat at https://gitter.im/werk365/identitydocuments

允许您处理护照和其他包含机器可读区域(MRZ)的文档的包。

此包允许您处理文档的图片以找到MRZ,解析MRZ,解析视觉检查区(VIZ),并且还可以找到并返回护照照片的裁剪图(使用人脸检测)。

⚠️ 版本2.x是包的完整重写,具有新的MRZ检测算法,且与版本1.x不兼容

安装

通过Composer

$ composer require werk365/identitydocuments

发布配置(可选)

$ php artisan vendor:publish --provider="Werk365\IdentityDocuments\IdentityDocumentsServiceProvider"

配置

服务

了解此包的第一件重要的事情是,您可以使用任何想要的OCR和或人脸检测API。此包本身不执行这些操作。

Google Vision Service

包中包含一个默认用于OCR和人脸检测的Google服务类。如果您想使用Google服务,除了提供凭证外无需进一步配置。为此,创建一个服务帐户并下载JSON密钥文件。然后,将JSON转换为PHP数组,以便将其用作正常的Laravel配置文件。您的配置文件应命名为google_key.php,放置在配置文件夹中,如下所示

return [
"type" => "service_account",
"project_id" => "",
"private_key_id" => "",
"private_key" => "",
"client_email" => "",
"client_id" => "",
"auth_uri" => "",
"token_uri" => "",
"auth_provider_x509_cert_url" => "",
"client_x509_cert_url" => "",
];

创建自定义服务

如果您想使用任何其他API进行OCR和/或人脸检测,可以创建自己的服务,或者查看主包(WIP)中未包含的可用服务列表。

创建服务相对简单,如果您想创建执行OCR的服务,只需创建一个实现Werk365\IdentityDocuments\Interfaces\OCR的类。同样,也存在一个Werk365\IdentityDocuments\Interfaces\FaceDetection接口。为了使创建自定义服务更加简单,您可以使用以下命令

$ php artisan id:service <name> <type>

其中 name 是您要创建的服务的ClassName,而 typeOCRFaceDetectionBoth。这将为您在 App\Services 命名空间中创建一个新的(空)服务,实现 OCRFaceDetection 或两者的接口。

使用方法

基本用法

创建一个新的身份证明文件,最多包含2张图片(可选),在此示例中,我们将在我们的示例控制器中使用包含2张图片的POST请求。

use Illuminate\Http\Request;
use Werk365\IdentityDocuments\IdentityDocument;

class ExampleController {
	public function id(Request $request){
		$document = new IdentityDocument($request->front, $request->back);
	}
}

⚠️ 在此示例中,我使用上传的文件,但您可以使用Intervention支持的任何文件

现在我们可以用这个新创建的身份证明文件做一些事情。首先,找到并返回MRZ

$mrz = $document->getMrz();

然后我们可以通过使用以下方式获取解析后的MRZ版本

$parsed = $document->getParsedMrz();

由于MRZ只允许A-Z和0-9字符,因此具有重音符号的人名将无法从MRZ中正确获取姓名。为了(尝试)从文档的VIZ部分找到正确的前缀和姓氏,使用以下方法

$viz = $document->getViz();

这将返回一个包含找到的前缀和姓氏以及置信度分数的数组。置信度分数是一个介于0和1之间的数字,显示MRZ和VIZ版本姓名之间的相似度。请注意,结果可能取决于您系统中的iconv()实现。

要从文档中获取护照照片,请使用以下方法

$face = $document->getFace()

此函数返回一个 Intervention\Image\Image

获取上述所有内容

如果您想以简化的方式使用所有这些功能,您也可以使用静态的 all() 方法,该方法也期望最多两个图像作为参数。例如

use Illuminate\Http\Request;
use Werk365\IdentityDocuments\IdentityDocument;

class ExampleController {
  public function id(Request $request){
  	$response = IdentityDocument::all($request->front, $request->back);
  	return response()->json($response);
  }
}

all() 方法返回一个类似以下的数组

[
	'type' => 'string', // TD1, TD2, TD3, MRVA, MRVB
	'mrz' => 'string', // Full MRZ
	'parsed' => [], // Array containing parsed MRZ
	'viz' => [], // Array containing parsed VIZ
	'face' => 'string', // Base64 image string
]

如你所见,这包括上述所有提到的方法,以及 $document->type 变量。检测到的面部将以 200px 高度的 base64 图像字符串返回。

合并图像

有几个方法可以配置如何处理身份证件。首先,有 mergeBackAndFrontImages() 方法。此方法可以用来减少 OCR API 调用的次数。当使用此方法时,图像将堆叠在一起。请注意,此方法必须在 getMrz() 方法之前使用。示例

use Illuminate\Http\Request;
use Werk365\IdentityDocuments\IdentityDocument;

class ExampleController {
	public function id(Request $request){
		$document = new IdentityDocument($request->front, $request->back);
		$document->mergeBackAndFrontImages();
		$mrz = $document->getMrz();
	}
}

⚠️请注意,合并图像可能会根据图像的大小导致高内存使用

如果您想使用静态的 all() 方法并合并图像,请发布包的配置文件并在其中启用它。请注意,更改配置中的选项将应用于 all() 方法。默认配置值

	'mergeImages' => false, // bool

设置 OCR 服务

如果您已经创建了一个自定义 OCR 服务或使用了一个不同于默认的 Google 服务,您可以使用 setOcrService() 方法。例如,假设我们已经使用上述方法创建了一个新的 TesseractService,我们可以像这样使用它进行 OCR

use Illuminate\Http\Request;
use App\Services\TesseractService;
use Werk365\IdentityDocuments\IdentityDocument;

class ExampleController {
	public function id(Request $request){
		$document = new IdentityDocument($request->front, $request->back);
		$document->setOcrService(TesseractService::class);
		$mrz = $document->getMrz();
	}
}

如果您想使用 all() 方法,请发布包的配置文件并在其中设置正确的服务类。

设置面部检测服务

这可以通过使用 setFaceDetectionService() 方法以类似 OCR 服务的方式完成。例如

use Illuminate\Http\Request;
use App\Services\AmazonFdService;
use Werk365\IdentityDocuments\IdentityDocument;

class ExampleController {
	public function id(Request $request){
		$document = new IdentityDocument($request->front, $request->back);
		$document->setFaceDetectionService(AmazonFdService::class);
		$mrz = $document->getFace();
	}
}

如果您想使用 all() 方法,请发布包的配置文件并在其中设置正确的服务类。

其他方法

addBackImage() 设置 IdentityDocument 的背面图像。addFrontImage() 设置 IdentityDocument 的正面图像。setMrz() 设置 IdentityDocument 的 MRZ,如果您只想使用解析功能。

更多信息

如果您对内部如何工作感兴趣,或者想看如何在包内构建自定义服务的示例,我已经写了一篇关于这些内容的博客文章,您可以在以下链接找到:[hergen.nl](https://hergen.nl/processing-identity-documents-in-laravel)

变更日志

请参阅变更日志以获取最近更改的更多信息。

贡献

请参阅contributing.md以获取详细信息和一个待办事项列表。

安全性

如果您发现任何与安全相关的问题,请通过电子邮件hergen.dillema@gmail.com联系,而不是使用问题跟踪器。

致谢

许可

请参阅许可文件以获取更多信息。