绵阳动力网站建设

PHP调用阿里云PDF文档识别的方法及代码

时间:2024-03-11

最近在做一个网站建设项目时,后台系统要求对前台用户上传的PDF文档进行内容识别,考虑到用户有可能通过拍照的方式上传,上传的文档清晰度和完整度可能会参差不齐,通过PHP自带的识别功能来识别可能会出现识别不完整不正确的情况,为了解决识别复杂的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文档的方法就是这些内容了,看完后喜欢的话记得收藏哦!

Copyright © 绵阳动力网站建设 www.kf51.cn All Rights Reserved 蜀ICP备08100083号

客服微信
客服微信
0816-6339181
客服微信
my_dongli