当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2024-03-24 17:59:00 浏览: 评论:0 

这篇文章主要为大家详细介绍了如何使用PHP实现识别复杂pdf文档的功能,文中的示例代码讲解详细,感兴趣的徐海波可以跟随小编一起学习一下

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安装这两个库:

composer require setasign/fpdi

composer require smalot/pdfparser

2. 读取PDF文件

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

  1. <?php 
  2. require 'vendor/autoload.php'
  3.  
  4. use Smalot\PdfParser\Parser; 
  5.  
  6. $parser = new Parser(); 
  7. $pdf = $parser->parseFile('path_to_your_pdf_file.pdf'); 
  8.  
  9. foreach ($pdf->getPages() as $page) { 
  10.     echo $page['text']."\n"
  11. ?> 

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

3. 编辑PDF文件

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

  1. <?php 
  2. require 'vendor/autoload.php'
  3.  
  4. use Setasign\Fpdi\Fpdi; 
  5.  
  6. $fpdi = new Fpdi(); 
  7. $fpdi->AddPage(); 
  8. $fpdi->SetFont('Arial''', 12); 
  9. $fpdi->Cell(40, 10, 'Hello World!', 1, 0, 'C'); 
  10. $fpdi->Output('path_to_output_pdf_file.pdf''I'); 
  11. ?> 

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

4. 转换PDF文件

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

  1. <?php 
  2. require 'vendor/autoload.php'
  3.  
  4. use Setasign\Fpdi\Fpdi; 
  5.  
  6. $fpdi = new Fpdi(); 
  7. $fpdi->AddPage(); 
  8. $fpdi->SetSourceFile('path_to_input_pdf_file.pdf'); 
  9. $fpdi->SetTargetFile('path_to_output_image_file.png'); 
  10. $fpdi->ExportImage(); 
  11. ?> 

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

Tags: PHP识别pdf文档

分享到: