PHP识别复杂pdf文档

使用阿里云的pdf文档识别

阿里云视觉智能平台开通文字识别-PDF识别

/**
     * 使用AK&SK初始化账号Client
     * @param string $accessKeyId
     * @param string $accessKeySecret
     * @return Ocrapi Client
     */
    public function createClient($accessKeyId, $accessKeySecret){
        $config = new Config([
            // 必填,您的 AccessKey ID
            "accessKeyId" => 'AccessKey ID',
            // 必填,您的 AccessKey Secret
            "accessKeySecret" => 'AccessKey Secret'
        ]);
        // Endpoint 请参考 https://api.aliyun.com/product/ocr
        $config->endpoint = "ocr.cn-shanghai.aliyuncs.com";
        $model = new Ocr($config);
        return $model;
    }
    /**
     * @param string[] $args
     * @return void
     * 阿里云一次智能识别5页pdf,所以需要对原文件进行拆分,分别取请求
     */
    public function getContent($param){
        set_time_limit(0);
        $inputPdf = $param['url'];
        // 计算需要拆分成多少个PDF文件
        $totalPages = intval(shell_exec("pdftk $inputPdf dump_data | grep NumberOfPages | awk '{print $2}'"));
        $numFiles = intval(ceil($totalPages / 5));
        $domain = request()->domain();
        $param['is_delete'] = $param['is_delete'] ?? 0;
        // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
        $client = self::createClient(getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'));
        $runtime = new RuntimeOptions([]);
        try {
            // 使用循环拆分PDF并保存为单独的文件
            $str = '';
            for ($i=0; $i<$numFiles; $i++) {
                $startPage = ($i * 5) + 1;
                $endPage = min(($startPage + 4), intval($totalPages));
                //执行拆分
                exec("pdftk A=$inputPdf cat A$startPage-$endPage output {$param['path']}_{$i}.pdf",$output, $returnVar);
                $del_url = $param['path'].'_'.$i.'.pdf';
                //执行pdf识别
                $recognizePdfRequest = new RecognizePdfRequest([
                    "fileURL" => $domain.'/'.$del_url
                ]);
                // 复制代码运行请自行打印 API 的返回值
                $result = $client->recognizePdfWithOptions($recognizePdfRequest, $runtime);
                $content = $result->body->data->wordsInfo;
                //拼接识别内容
                foreach ($content as &$vv){
                    $word = get_object_vars($vv);
                    if(substr($word['word'],0,1) == '>' || substr($word['word'],0,1) == '<'){
                        $word['word'] = substr($word['word'],1);
                    }
                    $str .= $word['word']."\n ";
                }
            }
            $data['code'] = 200;
            $data['content'] = $str;
        }
        catch (Exception $error) {
            if (!($error instanceof TeaError)) {
                $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
            }
            $data['code'] = 400;
            $data['content'] = $error->message;
            //unset($del_url);
            // 错误 message
//            var_dump($error->message);
//            // 诊断地址
//            var_dump($error->data["Recommend"]);
//            Utils::assertAsString($error->message);
        }
        //识别成功删除原文件
        if($param['is_delete']){
            unlink($param['url']);
        }
        //删除生成的文件
        for ($i=0; $i<$numFiles; $i++) {
            $del_url = $param['path'].'_'.$i.'.pdf';
            if (file_exists($del_url)) {
                unlink($del_url);
            }
        }
        return $data;
    }

方法补充

除了上文的方法,小编还为大家整理了PHP识别普通PDF文件的相关方法,希望对大家有所帮助

1. 安装依赖库

在使用PHP处理PDF文件之前,我们需要先安装一些依赖库。对于本教程,我们将使用两个主要的库:smalot/pdfparser和setasign/Fpdi。

首先,通过Composer安装这两个库:

composer require setasign/fpdi
composer require smalot/pdfparser

2. 读取PDF文件

接下来,我们将展示如何使用smalot/pdfparser库来读取PDF文件的内容。

<?php
require 'vendor/autoload.php';

use Smalot\PdfParser\Parser;

$parser = new Parser();
$pdf = $parser->parseFile('path_to_your_pdf_file.pdf');

foreach ($pdf->getPages() as $page) {
    echo $page['text']."\n";
}
?>

在上述代码中,我们首先创建了一个Parser对象,然后使用parseFile方法读取了PDF文件。最后,我们遍历了PDF文件的每一页,并打印出了每一页的文本内容。

3. 编辑PDF文件

除了读取PDF文件的内容,我们还可以使用setasign/Fpdi库来编辑PDF文件。以下是一个简单的示例,展示了如何添加一个新的页面到PDF文件中:

<?php
require 'vendor/autoload.php';

use Setasign\Fpdi\Fpdi;

$fpdi = new Fpdi();
$fpdi->AddPage();
$fpdi->SetFont('Arial', '', 12);
$fpdi->Cell(40, 10, 'Hello World!', 1, 0, 'C');
$fpdi->Output('path_to_output_pdf_file.pdf', 'I');
?>

在上述代码中,我们首先创建了一个Fpdi对象,然后添加了一个新的页面。接着,我们设置了字体和字号,并添加了一些文本内容。最后,我们使用Output方法将PDF文件输出到了指定的路径。

4. 转换PDF文件

除了编辑PDF文件,我们还可以使用setasign/Fpdi库来转换PDF文件。以下是一个简单的示例,展示了如何将PDF文件转换为图片:

<?php
require 'vendor/autoload.php';

use Setasign\Fpdi\Fpdi;

$fpdi = new Fpdi();
$fpdi->AddPage();
$fpdi->SetSourceFile('path_to_input_pdf_file.pdf');
$fpdi->SetTargetFile('path_to_output_image_file.png');
$fpdi->ExportImage();
?>

在上述代码中,我们首先创建了一个Fpdi对象,然后添加了一个新的页面。接着,我们设置了输入和输出的文件路径,并使用ExportImage方法将PDF文件转换为图片。

到此这篇关于PHP实现识别复杂pdf文档的示例代码的文章就介绍到这了,更多相关PHP识别pdf内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部