thikdev / pdf_parser
此包的最新版本(v1.1.0)没有可用的许可证信息。
解析pdf文件为对象
v1.1.0
2024-08-29 10:25 UTC
Requires
- symfony/console: ^5.0|^6.0|^7.0
- symfony/process: ^5.0|^6.0|^7.0
- voku/portable-utf8: ^5.0|^6.0
Requires (Dev)
- symfony/var-dumper: ^5.0|^6.0
This package is auto-updated.
Last update: 2024-08-29 10:26:07 UTC
README
将pdf文件转换为Object Document格式,其子组件也是Object类型:Component
、Line
、Page
等。
流程
Pdf ----> XML ----> Simple Document ----> Perfect Document
| | |
pdftohtml Parse Page DetectMargin
Parse Fonts FontClassify
Parse Text DetectExtraContent
MergeComponents
DetectColumns
DetectToc
DetectTable
MergeLines
DetectHeading
PdfToHtml
- 使用poppler-utils中的pdftohtml将pdf文件转换为xml
制作简单文档
- 此步骤只是将xml行(不解析dom)解析成最基本的对象
- 页面
- 字体
- 文本
处理器
一些国家制作标准化的文档,称为Process,process的顺序对输出有很大影响
核心过程
- 检测边距
- 字体分类
- 检测额外内容
- 合并组件
1. 检测边距
边距的目的是确定包含所有Text Component的最小框架,边距存储在每一页中。
2. 字体分类
计算不同字体流行程度,以确定最流行的字体大小,最流行的字体大小被认为是常规字体。因此,在打印html时,可以使用百分比来显示与pdf相似的大小
3. 检测额外内容
此功能计算找到header/footer,extra left/right(尚未实现)。简单来说,是检查属于偶数/奇数页的页面组。对于组中的每一页,从顶部开始逐渐向下移动,确定该区域内的文本,比较差异,如果差异不超过两个位置,并且不同的字符只是数字或ivx(罗马数字),则认为是合适的header,然后继续向下扩展,直到不再满足条件,那么之前的满足条件点是header的界限。footer的处理方式相同,但是从底部向上。
注意
- 使用FineDiff base找到不同的位置 https://github.com/gorhill/PHP-FineDiff
- "不同不超过两个位置"是由于一些文档,header/footer被提取了两次
- 对于非拉丁语系的文字,有表示数字的其他字符,例如日本语的123与123不同
4. 合并组件
用法
简单
<?php $parser = new \ThikDev\PdfParser\Parser( $file ); $document = $parser->process();// run pipeline processes $text = $document->getText();// get text $html = $document->getHtml();// get html
添加自定义process
- 扩展
AbstractProcess
- 通过
addProcessBefore
、addProcessAfter
或replaceProcess
将process添加到管道中
添加自定义组件
- 扩展
Component
类并在你的process类中使用它