PHP實(shí)現(xiàn)識(shí)別復(fù)雜pdf文檔的示例代碼
PHP識(shí)別復(fù)雜pdf文檔
使用阿里云的pdf文檔識(shí)別
阿里云視覺智能平臺(tái)開通文字識(shí)別-PDF識(shí)別
/** * 使用AK&SK初始化賬號(hào)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 請(qǐng)參考 https://api.aliyun.com/product/ocr $config->endpoint = "ocr.cn-shanghai.aliyuncs.com"; $model = new Ocr($config); return $model; } /** * @param string[] $args * @return void * 阿里云一次智能識(shí)別5頁pdf,所以需要對(duì)原文件進(jìn)行拆分,分別取請(qǐng)求 */ public function getContent($param){ set_time_limit(0); $inputPdf = $param['url']; // 計(jì)算需要拆分成多少個(gè)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; // 請(qǐng)確保代碼運(yùn)行環(huán)境設(shè)置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 // 工程代碼泄露可能會(huì)導(dǎo)致 AccessKey 泄露,并威脅賬號(hào)下所有資源的安全性。以下代碼示例使用環(huán)境變量獲取 AccessKey 的方式進(jìn)行調(diào)用,僅供參考,建議使用更安全的 STS 方式,更多鑒權(quán)訪問方式請(qǐng)參見: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 { // 使用循環(huán)拆分PDF并保存為單獨(dú)的文件 $str = ''; for ($i=0; $i<$numFiles; $i++) { $startPage = ($i * 5) + 1; $endPage = min(($startPage + 4), intval($totalPages)); //執(zhí)行拆分 exec("pdftk A=$inputPdf cat A$startPage-$endPage output {$param['path']}_{$i}.pdf",$output, $returnVar); $del_url = $param['path'].'_'.$i.'.pdf'; //執(zhí)行pdf識(shí)別 $recognizePdfRequest = new RecognizePdfRequest([ "fileURL" => $domain.'/'.$del_url ]); // 復(fù)制代碼運(yùn)行請(qǐng)自行打印 API 的返回值 $result = $client->recognizePdfWithOptions($recognizePdfRequest, $runtime); $content = $result->body->data->wordsInfo; //拼接識(shí)別內(nèi)容 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); // 錯(cuò)誤 message // var_dump($error->message); // // 診斷地址 // var_dump($error->data["Recommend"]); // Utils::assertAsString($error->message); } //識(shí)別成功刪除原文件 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; }
方法補(bǔ)充
除了上文的方法,小編還為大家整理了PHP識(shí)別普通PDF文件的相關(guān)方法,希望對(duì)大家有所幫助
1. 安裝依賴庫
在使用PHP處理PDF文件之前,我們需要先安裝一些依賴庫。對(duì)于本教程,我們將使用兩個(gè)主要的庫:smalot/pdfparser和setasign/Fpdi。
首先,通過Composer安裝這兩個(gè)庫:
composer require setasign/fpdi
composer require smalot/pdfparser
2. 讀取PDF文件
接下來,我們將展示如何使用smalot/pdfparser庫來讀取PDF文件的內(nèi)容。
<?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"; } ?>
在上述代碼中,我們首先創(chuàng)建了一個(gè)Parser對(duì)象,然后使用parseFile方法讀取了PDF文件。最后,我們遍歷了PDF文件的每一頁,并打印出了每一頁的文本內(nèi)容。
3. 編輯PDF文件
除了讀取PDF文件的內(nèi)容,我們還可以使用setasign/Fpdi庫來編輯PDF文件。以下是一個(gè)簡單的示例,展示了如何添加一個(gè)新的頁面到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'); ?>
在上述代碼中,我們首先創(chuàng)建了一個(gè)Fpdi對(duì)象,然后添加了一個(gè)新的頁面。接著,我們?cè)O(shè)置了字體和字號(hào),并添加了一些文本內(nèi)容。最后,我們使用Output方法將PDF文件輸出到了指定的路徑。
4. 轉(zhuǎn)換PDF文件
除了編輯PDF文件,我們還可以使用setasign/Fpdi庫來轉(zhuǎn)換PDF文件。以下是一個(gè)簡單的示例,展示了如何將PDF文件轉(zhuǎn)換為圖片:
<?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(); ?>
在上述代碼中,我們首先創(chuàng)建了一個(gè)Fpdi對(duì)象,然后添加了一個(gè)新的頁面。接著,我們?cè)O(shè)置了輸入和輸出的文件路徑,并使用ExportImage方法將PDF文件轉(zhuǎn)換為圖片。
到此這篇關(guān)于PHP實(shí)現(xiàn)識(shí)別復(fù)雜pdf文檔的示例代碼的文章就介紹到這了,更多相關(guān)PHP識(shí)別pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP查詢大量數(shù)據(jù)內(nèi)存耗盡問題的解決方法
這篇文章主要為大家詳細(xì)介紹了PHP查詢大量數(shù)據(jù)內(nèi)存耗盡問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10PHP基于openssl實(shí)現(xiàn)非對(duì)稱加密代碼實(shí)例
這篇文章主要介紹了PHP基于openssl實(shí)現(xiàn)非對(duì)稱加密代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06PHP使用數(shù)組實(shí)現(xiàn)矩陣數(shù)學(xué)運(yùn)算的方法示例
這篇文章主要介紹了PHP使用數(shù)組實(shí)現(xiàn)矩陣數(shù)學(xué)運(yùn)算的方法,結(jié)合具體實(shí)例形式分析了php基于數(shù)組實(shí)現(xiàn)矩陣表示與運(yùn)算的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05微信公眾號(hào)用戶與網(wǎng)站用戶的綁定解決方案分析
這篇文章主要介紹了微信公眾號(hào)用戶與網(wǎng)站用戶的綁定解決方案,結(jié)合實(shí)例形式分析了微信公眾號(hào)用戶與網(wǎng)站用戶綁定的原理、操作步驟、技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-04-04PHP單例模式模擬Java Bean實(shí)現(xiàn)方法示例
這篇文章主要介紹了PHP單例模式模擬Java Bean實(shí)現(xiàn)方法,涉及php面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)操作技巧,需要的朋友可以參考下2018-12-12PHP調(diào)用API接口的方法及實(shí)現(xiàn)過程
隨著互聯(lián)網(wǎng)、云計(jì)算和大數(shù)據(jù)時(shí)代的到來,越來越多的應(yīng)用程序需要調(diào)用第三方的API接口來獲取數(shù)據(jù),本文將給大家介紹PHP調(diào)用API接口的方法及實(shí)現(xiàn)過程,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-03-03