dscke/identitydocuments

用于解析护照等身份证明文档的包

3 2024-03-29 16:49 UTC

This package is auto-updated.

Last update: 2024-09-29 18:10:08 UTC


README

Latest Version on Packagist Total Downloads StyleCI

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

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

⚠️ 版本 3.x 是对包的完全重写,包含新的MRZ检测算法,与版本 1.x 不兼容

安装

通过Composer

$ composer require dscke/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支持的文件 http://image.intervention.io/api/make

现在我们可以对创建的新身份证明文档做几件事情。首先,查找并返回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()方法,请发布包的配置并设置正确的服务类。

设置面部检测服务

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

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()设置IdentityDcoument MRZ,如果您只想使用解析功能。

更多信息

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

更改日志

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

贡献

请参阅contributing.md以获取详细信息和学习清单。

安全

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

鸣谢

许可

。有关更多信息,请参阅许可文件