PHP實現(xiàn)識別復雜pdf文檔的示例代碼
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;
// 請確保代碼運行環(huán)境設置了環(huán)境變量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致 AccessKey 泄露,并威脅賬號下所有資源的安全性。以下代碼示例使用環(huán)境變量獲取 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 {
// 使用循環(huán)拆分PDF并保存為單獨的文件
$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識別
$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";
}
?>
在上述代碼中,我們首先創(chuàng)建了一個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');
?>
在上述代碼中,我們首先創(chuàng)建了一個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();
?>
在上述代碼中,我們首先創(chuàng)建了一個Fpdi對象,然后添加了一個新的頁面。接著,我們設置了輸入和輸出的文件路徑,并使用ExportImage方法將PDF文件轉換為圖片。
到此這篇關于PHP實現(xiàn)識別復雜pdf文檔的示例代碼的文章就介紹到這了,更多相關PHP識別pdf內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PHP使用數(shù)組實現(xiàn)矩陣數(shù)學運算的方法示例
這篇文章主要介紹了PHP使用數(shù)組實現(xiàn)矩陣數(shù)學運算的方法,結合具體實例形式分析了php基于數(shù)組實現(xiàn)矩陣表示與運算的相關操作技巧,需要的朋友可以參考下2017-05-05
PHP單例模式模擬Java Bean實現(xiàn)方法示例
這篇文章主要介紹了PHP單例模式模擬Java Bean實現(xiàn)方法,涉及php面向對象程序設計相關操作技巧,需要的朋友可以參考下2018-12-12

