nystronsolar / electric-bill-extractor
从电费单中提取数据
Requires
- smalot/pdfparser: ^2.3
- thedevick/precise-money: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.21
- phpunit/phpunit: ^10.2
- symfony/var-dumper: ^6.2
- vimeo/psalm: ^5.13
README
Logo由Canva制作
入门
首先,使用composer安装此包
composer require nystronsolar/electric-bill-extractor
然后,从电费单中提取数据
<?php use NystronSolar\ElectricBillExtractor\ExtractorFactory; require_once __DIR__.'/vendor/autoload.php'; $bill = ExtractorFactory::extractFromFile('bill.pdf');
这个库是如何工作的?
提取器
每种类型的账单都需要一个自定义提取器。每个提取器扩展了Extractor抽象类,在实例化时,你需要提供账单的解析内容。之后,你可以使用extract()
方法提取其内容,该方法将返回账单对象或错误情况下的false。
所有提取器的列表
提取器工厂
提取器工厂是一个帮助创建提取器的类
使用提取器工厂,你可以
- 使用
identifyExtractorClassFromContent()
或identifyExtractorClassFromFile()
方法从字符串内容或文件路径中识别提取器类 - 使用
instantiateExtractorClassFromFile()
和instantiateExtractorClassFromFile()
方法从字符串内容或文件路径中实例化提取器类 - 使用
extractFromFile()
和extractFromFile()
方法从字符串内容或文件路径中提取账单
<?php use NystronSolar\ElectricBillExtractor\ExtractorFactory; require_once __DIR__.'/vendor/autoload.php'; // Returns an class-string of an extractor that can be used or false ExtractorFactory::identifyExtractorClassFromFile('bill.pdf'); ExtractorFactory::identifyExtractorClassFromContent('An parsed bill content'); // Return an new extractor instance or false ExtractorFactory::instantiateExtractorFromFile('bill.pdf'); ExtractorFactory::instantiateExtractorFromContent('An parsed bill content'); // Extract an Bill - Return an bill object or false ExtractorFactory::extractFromFile('bill.pdf'); ExtractorFactory::extractFromContent('An parsed bill content');
测试
电费提取器的测试非常棒!
内容
为了测试文件提取器库,我们需要许多文件来提取并检查结果。这是因为,在电费提取器中,在tests/Content/bills/
目录下,你可以找到许多代表许多假账的.txt
文件,遵循每个提取器的模式。
要比较提取器与实际账单的结果,你可以在tests/Content/expected/
中找到.json
文件,当测试运行时,它将比较预期的(json)与实际的账单(txt)
为什么不使用PDF文件?
在大多数实际情况中,项目将从PDF文件中提取数据。在这种方法中,电费提取器工厂将使用https://github.com/smalot/pdfparser将PDF文件解析为文本。
解析后,库将使用解析器返回的文本提取账单的所有数据。
但在测试中,我们可以跳过所有的解析。这是因为我们使用.txt
而不是.pdf
测试用例
由于提取器有这种“奇怪”的方式来断言类,我们构建了Extractor Test Case,这是一个自定义PHPUnit测试用例。这个测试用例有一个assertByContentFolder
方法,你需要提供文件夹名称和提取器类。
上传新的测试账单
在tests/Content/bills
下的账单通常是真实的账单,但一些值已被更改。如果你发现你的账单有错误,并想将其上传到存储库,更改一些值非常重要,例如真实姓名、CPF、安装代码等,因为这个项目是开源的,所以任何人都可以看到账单。
你可以使用composer upload-bill
命令来帮助你添加新的账单,但你仍然需要删除所有秘密并填写JSON预期文件。
在这里,你可以看到所有账单中必须更改的值。
RGE V3
数值按葡萄牙语命名,顺序排列。
- 名称
- 街道和门牌号
- 区
- 邮编,城市和州
- 地块
- 读数地址
- 表号
- CPF
- 安装代码
- 发票
- 发票二维码访问密钥
- 发票授权协议
- “重要通知”框内的秘密值
- 电表
- 电力账户(ID号)
- 银行自动扣款代码
RGE V2
数值按葡萄牙语命名,顺序排列。
-
名称
-
街道和门牌号
-
区
-
邮编,城市和州
-
发票 - 声明行为
-
电力账户(ID号)和系列号
-
合同账户
-
地块
-
读数路线
-
表号
-
PN
-
“尊敬的客户”框内的秘密值
-
RG
-
安装代码
-
代码
-
操作描述
-
CPF
-
安装代码
-
发票
-
发票二维码访问密钥
-
发票授权协议
-
“重要通知”框内的秘密值
-
电表
-
银行自动扣款代码