Develop의 Tistory

Language/PHP

[PHP]구글드라이브를 이용한 OCR 기능

소소한 늙은 개발자의 메모장 2021. 9. 9. 09:33
반응형
(追記) (追記ここまで)

본글은 PHPSCHOOL 오랜만에 들어갔다가 Tip&Tech에 유용해 보이는 정보가 있어 일단 스크랩 목적으로 글을 가져와 봅니다.

자세한 글이나, 댓글들을 보실려면 출처로 들어가 확인해보시길 추천합니다.

출처 : 구글드라이브를 이용한 OCR 기능(PHP) (https://phpschool.com/link/tipntech/82695)

=====================================

<?php 
// 제가 사용하는 서버의 PHP가 구닥다리 5.2라서 
// https://github.com/alchemy-fr/google-plus-api-client 여기에서 가져왔음
include "libraries/google_api/Google_Client.php";
include "libraries/google_api/contrib/Google_DriveService.php";
 
$client = new Google_Client();
$client->setClientId('XXXXXXXXXX.apps.googleusercontent.com');
$client->setClientSecret('XXXXXXXXXXXX');
$client->setRedirectUri('https://XXXXXXXXX/google_drive/google_drive.php');
 
$scope = array(
 'https://www.googleapis.com/auth/drive',
 'https://www.googleapis.com/auth/drive.readonly.metadata',
 'https://www.googleapis.com/auth/drive.file',
 'https://www.googleapis.com/auth/drive.appdata',
 'https://www.googleapis.com/auth/drive.scripts',
 'https://www.googleapis.com/auth/drive.metadata',
 'https://www.googleapis.com/auth/spreadsheets',
);
 
$client->setScopes($scope);
$client->setAccessType('offline');
 
// auth 토큰 유지 로직 시작 - 토큰 가져오기 방법은 각자 알아서 하세요~
// (https://github.com/googleapis/google-api-php-client 예제가 있음)
$hostname = "XXXXX";
$username = "XXXX";
$userpass = "XXXXXXX";
$dbname = "XXXXX";
$connect = mysqli_connect($hostname, $username, $userpass, $dbname);
 
/**
CREATE TABLE token2 (
 seq INT(11) NOT NULL AUTO_INCREMENT,
 type VARCHAR(255) DEFAULT NULL,
 token TEXT DEFAULT NULL,
 PRIMARY KEY (seq)
)
*/
 
$tokenquery="SELECT * FROM token2 WHERE type='original'";
$tokenresult = mysqli_query($connect,$tokenquery);
$tokenrow=mysqli_fetch_assoc($tokenresult);
 
if($tokenrow) {
 extract($tokenrow);
}
$time_created = json_decode($token)->created;
$t=time();
$timediff=$t-$time_created;
$refreshToken = json_decode($token)->refresh_token;
 
if(($timediff>360)&&($token!=''))
{
 $refreshquery="SELECT * FROM token2 WHERE type='refresh'";
 $refreshresult = mysqli_query($connect,$refreshquery);
 $refreshrow=mysqli_fetch_assoc($refreshresult);
 
 if($refreshrow)
 {
 extract($refreshrow);
 $refresh_created = json_decode($token)->created;
 $refreshtimediff=$t-$refresh_created;
 if($refreshtimediff>3600)
 {
 $client->refreshToken($refreshToken);
 $newtoken=$client->getAccessToken();
 $tokenupdate="UPDATE token2 SET token='$newtoken' WHERE type='refresh'";
 mysqli_query($connect,$tokenupdate);
 $token=$newtoken;
 }
 else
 {
 $client->setAccessToken($token);
 }
 }
 else
 {
 $client->refreshToken($refreshToken);
 $newtoken=$client->getAccessToken();
 $tokenupdate="INSERT INTO token2 (type,token) VALUES ('refresh','$newtoken')";
 mysqli_query($connect,$tokenupdate);
 $token=$newtoken;
 }
}
 
//if token is still good.
if(($timediff<3600)&&($token!=''))
{
 $client->setAccessToken($token); 
}
 
mysqli_close($connect);
// 여기까지 auth 토큰 유지 로직
 
$drive = new Google_DriveService($client);
// 업로드할 파일명
$filename = './PICK.pdf_page_1.jpg';
 
// 업로드할 파일의 상세정보
$title = 'test'; // 파일명
$filedata = file_get_contents($filename);
$size = getimagesize($filename);
$mimeType = $size['mime'];
$imgfile = new Google_DriveFile();
$imgfile->setTitle($title);
$imgfile->setMimeType($mimeType);
 
// 드라이브에 올림
$createdFile = $drive->files->insert($imgfile, array(
 'ocr' => true,
 'ocrLanguage' => 'kr',
 'data' => $filedata,
 'mimeType' => $mimeType,
));
 
$req = new Google_HttpRequest($createdFile->exportLinks['text/plain']);
$val = $client->getIo()->authenticatedRequest($req);
$response = $val->getResponseBody(); 
// Temporary Redirect The document has moved here. 페이지이므로 href만 가져온다
preg_match('/href=(["\'])([^1円]*)1円/i', $response, $m);
 
$req = new Google_HttpRequest($m[2]);
$val = $client->getIo()->authenticatedRequest($req);
// html태그랑 스타일 모두 제거
$response = strip_tags(preg_replace('~\<style(.*)\>(.*)\<\/style\>~', '', $val->getResponseBody()),'<p>');
 
// 처리가 완료된 파일은 삭제. 삭제 안하면 계속 누적되어 보기에 안 좋음
$drive->files->delete($createdFile->id);
 
echo nl2br($response);
?>

(注記) PHPSCHOOL 및 작성글에 CC정보가 없어 복사는 해왔으나 문제가 될 경우 삭제하겠습니다.

반응형
(追記) (追記ここまで)

티스토리툴바

AltStyle によって変換されたページ (->オリジナル) /