thikdev/pdf_parser

此包的最新版本(v1.1.0)没有可用的许可证信息。

解析pdf文件为对象

v1.1.0 2024-08-29 10:25 UTC

This package is auto-updated.

Last update: 2024-08-29 10:26:07 UTC


README

将pdf文件转换为Object Document格式,其子组件也是Object类型:ComponentLinePage等。

流程


        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
  • 通过addProcessBeforeaddProcessAfterreplaceProcess将process添加到管道中

添加自定义组件

  • 扩展Component类并在你的process类中使用它