翼度科技»论坛 编程开发 PHP 查看内容

PHP实现识别复杂pdf文档的示例代码

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
PHP识别复杂pdf文档
使用阿里云的pdf文档识别
阿里云视觉智能平台开通文字识别-PDF识别
  1. /**
  2.      * 使用AK&SK初始化账号Client
  3.      * @param string $accessKeyId
  4.      * @param string $accessKeySecret
  5.      * @return Ocrapi Client
  6.      */
  7.     public function createClient($accessKeyId, $accessKeySecret){
  8.         $config = new Config([
  9.             // 必填,您的 AccessKey ID
  10.             "accessKeyId" => 'AccessKey ID',
  11.             // 必填,您的 AccessKey Secret
  12.             "accessKeySecret" => 'AccessKey Secret'
  13.         ]);
  14.         // Endpoint 请参考 https://api.aliyun.com/product/ocr
  15.         $config->endpoint = "ocr.cn-shanghai.aliyuncs.com";
  16.         $model = new Ocr($config);
  17.         return $model;
  18.     }
  19.     /**
  20.      * @param string[] $args
  21.      * @return void
  22.      * 阿里云一次智能识别5页pdf,所以需要对原文件进行拆分,分别取请求
  23.      */
  24.     public function getContent($param){
  25.         set_time_limit(0);
  26.         $inputPdf = $param['url'];
  27.         // 计算需要拆分成多少个PDF文件
  28.         $totalPages = intval(shell_exec("pdftk $inputPdf dump_data | grep NumberOfPages | awk '{print $2}'"));
  29.         $numFiles = intval(ceil($totalPages / 5));
  30.         $domain = request()->domain();
  31.         $param['is_delete'] = $param['is_delete'] ?? 0;
  32.         // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
  33.         // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/311677.html
  34.         $client = self::createClient(getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'));
  35.         $runtime = new RuntimeOptions([]);
  36.         try {
  37.             // 使用循环拆分PDF并保存为单独的文件
  38.             $str = '';
  39.             for ($i=0; $i<$numFiles; $i++) {
  40.                 $startPage = ($i * 5) + 1;
  41.                 $endPage = min(($startPage + 4), intval($totalPages));
  42.                 //执行拆分
  43.                 exec("pdftk A=$inputPdf cat A$startPage-$endPage output {$param['path']}_{$i}.pdf",$output, $returnVar);
  44.                 $del_url = $param['path'].'_'.$i.'.pdf';
  45.                 //执行pdf识别
  46.                 $recognizePdfRequest = new RecognizePdfRequest([
  47.                     "fileURL" => $domain.'/'.$del_url
  48.                 ]);
  49.                 // 复制代码运行请自行打印 API 的返回值
  50.                 $result = $client->recognizePdfWithOptions($recognizePdfRequest, $runtime);
  51.                 $content = $result->body->data->wordsInfo;
  52.                 //拼接识别内容
  53.                 foreach ($content as &$vv){
  54.                     $word = get_object_vars($vv);
  55.                     if(substr($word['word'],0,1) == '>' || substr($word['word'],0,1) == '<'){
  56.                         $word['word'] = substr($word['word'],1);
  57.                     }
  58.                     $str .= $word['word']."\n ";
  59.                 }
  60.             }
  61.             $data['code'] = 200;
  62.             $data['content'] = $str;
  63.         }
  64.         catch (Exception $error) {
  65.             if (!($error instanceof TeaError)) {
  66.                 $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
  67.             }
  68.             $data['code'] = 400;
  69.             $data['content'] = $error->message;
  70.             //unset($del_url);
  71.             // 错误 message
  72. //            var_dump($error->message);
  73. //            // 诊断地址
  74. //            var_dump($error->data["Recommend"]);
  75. //            Utils::assertAsString($error->message);
  76.         }
  77.         //识别成功删除原文件
  78.         if($param['is_delete']){
  79.             unlink($param['url']);
  80.         }
  81.         //删除生成的文件
  82.         for ($i=0; $i<$numFiles; $i++) {
  83.             $del_url = $param['path'].'_'.$i.'.pdf';
  84.             if (file_exists($del_url)) {
  85.                 unlink($del_url);
  86.             }
  87.         }
  88.         return $data;
  89.     }
复制代码
方法补充
除了上文的方法,小编还为大家整理了PHP识别普通PDF文件的相关方法,希望对大家有所帮助
1. 安装依赖库
在使用PHP处理PDF文件之前,我们需要先安装一些依赖库。对于本教程,我们将使用两个主要的库:smalot/pdfparser和setasign/Fpdi。
首先,通过Composer安装这两个库:
  1. composer require setasign/fpdicomposer require smalot/pdfparser
复制代码
2. 读取PDF文件
接下来,我们将展示如何使用smalot/pdfparser库来读取PDF文件的内容。
  1. <?php
  2. require 'vendor/autoload.php';

  3. use Smalot\PdfParser\Parser;

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

  6. foreach ($pdf->getPages() as $page) {
  7.     echo $page['text']."\n";
  8. }
  9. ?>
复制代码
在上述代码中,我们首先创建了一个Parser对象,然后使用parseFile方法读取了PDF文件。最后,我们遍历了PDF文件的每一页,并打印出了每一页的文本内容。
3. 编辑PDF文件
除了读取PDF文件的内容,我们还可以使用setasign/Fpdi库来编辑PDF文件。以下是一个简单的示例,展示了如何添加一个新的页面到PDF文件中:
  1. <?php
  2. require 'vendor/autoload.php';

  3. use Setasign\Fpdi\Fpdi;

  4. $fpdi = new Fpdi();
  5. $fpdi->AddPage();
  6. $fpdi->SetFont('Arial', '', 12);
  7. $fpdi->Cell(40, 10, 'Hello World!', 1, 0, 'C');
  8. $fpdi->Output('path_to_output_pdf_file.pdf', 'I');
  9. ?>
复制代码
在上述代码中,我们首先创建了一个Fpdi对象,然后添加了一个新的页面。接着,我们设置了字体和字号,并添加了一些文本内容。最后,我们使用Output方法将PDF文件输出到了指定的路径。
4. 转换PDF文件
除了编辑PDF文件,我们还可以使用setasign/Fpdi库来转换PDF文件。以下是一个简单的示例,展示了如何将PDF文件转换为图片:
  1. <?php
  2. require 'vendor/autoload.php';

  3. use Setasign\Fpdi\Fpdi;

  4. $fpdi = new Fpdi();
  5. $fpdi->AddPage();
  6. $fpdi->SetSourceFile('path_to_input_pdf_file.pdf');
  7. $fpdi->SetTargetFile('path_to_output_image_file.png');
  8. $fpdi->ExportImage();
  9. ?>
复制代码
在上述代码中,我们首先创建了一个Fpdi对象,然后添加了一个新的页面。接着,我们设置了输入和输出的文件路径,并使用ExportImage方法将PDF文件转换为图片。
到此这篇关于PHP实现识别复杂pdf文档的示例代码的文章就介绍到这了,更多相关PHP识别pdf内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/program/314384me4.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具