2016-03-07 190 views
2

我試圖將圖片上傳到Google Drive以獲取光學字符識別(OCR)。這裏是我的代碼:將圖片上傳到Google Drive for OCR

require_once('vendor/autoload.php'); 

// Initialize Google Client 
$client_email = '[email protected]'; 
$private_key = file_get_contents('key.p12'); 
$scopes = array(
    'https://www.googleapis.com/auth/drive.file' 
); 
$credentials = new Google_Auth_AssertionCredentials(
    $client_email, 
    $scopes, 
    $private_key 
); 
$client = new Google_Client(); 
$client->setAssertionCredentials($credentials); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); 
} 

// Initialize Google Drive service 
$service = new Google_Service_Drive($client); 

// Upload File 
$file = new Google_Service_Drive_DriveFile(); 
$file->setName('Test Image for OCR'); 
$file->setDescription('Test Image for OCR'); 
$file->setMimeType('image/jpeg'); 
try { 
    $data = file_get_contents($filename); 
    $createdFile = $service->files->create($file, array(
     'data' => $data, 
     'mimeType' => 'image/jpeg', 
)); 
    var_dump($createdFile); 
    // =========== 
    // So, what's next? 
    // =========== 
} catch(Exception $e) { 
    echo 'Error occurred: ' . $e->getMessage(); 
} 

上面的代碼運行沒有錯誤,而$createdFileGoogle_Service_Drive_DriveFile對象形成有效的資源。

問題:

  1. 我想上傳成功,因爲create()函數不返回一個錯誤。但是,我看不到在我的Google雲端硬盤中上傳的文件。不應該將其上傳到Google雲端硬盤的根文件夾?

  2. 如何執行OCR?我可以從here讀取有一個名爲ocrLanguage的參數。我應該在哪裏放置它,以及如何獲得結果?

在此先感謝。

UPDATEvar_dump()結果如下:

object(Google_Service_Drive_DriveFile)#18 (55) { 
    ["collection_key":protected]=> 
    string(6) "spaces" 
    ["internal_gapi_mappings":protected]=> 
    array(0) { 
    } 
    ["appProperties"]=> 
    NULL 
    ["capabilitiesType":protected]=> 
    string(42) "Google_Service_Drive_DriveFileCapabilities" 
    ["capabilitiesDataType":protected]=> 
    string(0) "" 
    ["contentHintsType":protected]=> 
    string(42) "Google_Service_Drive_DriveFileContentHints" 
    ["contentHintsDataType":protected]=> 
    string(0) "" 
    ["createdTime"]=> 
    NULL 
    ["description"]=> 
    NULL 
    ["explicitlyTrashed"]=> 
    NULL 
    ["fileExtension"]=> 
    NULL 
    ["folderColorRgb"]=> 
    NULL 
    ["fullFileExtension"]=> 
    NULL 
    ["headRevisionId"]=> 
    NULL 
    ["iconLink"]=> 
    NULL 
    ["id"]=> 
    string(28) "0B_XXXXX1yjq7dENaQWp4ckZoRk0" 
    ["imageMediaMetadataType":protected]=> 
    string(48) "Google_Service_Drive_DriveFileImageMediaMetadata" 
    ["imageMediaMetadataDataType":protected]=> 
    string(0) "" 
    ["kind"]=> 
    string(10) "drive#file" 
    ["lastModifyingUserType":protected]=> 
    string(25) "Google_Service_Drive_User" 
    ["lastModifyingUserDataType":protected]=> 
    string(0) "" 
    ["md5Checksum"]=> 
    NULL 
    ["mimeType"]=> 
    string(10) "image/jpeg" 
    ["modifiedByMeTime"]=> 
    NULL 
    ["modifiedTime"]=> 
    NULL 
    ["name"]=> 
    string(18) "Test Image for OCR" 
    ["originalFilename"]=> 
    NULL 
    ["ownedByMe"]=> 
    NULL 
    ["ownersType":protected]=> 
    string(25) "Google_Service_Drive_User" 
    ["ownersDataType":protected]=> 
    string(5) "array" 
    ["parents"]=> 
    NULL 
    ["permissionsType":protected]=> 
    string(31) "Google_Service_Drive_Permission" 
    ["permissionsDataType":protected]=> 
    string(5) "array" 
    ["properties"]=> 
    NULL 
    ["quotaBytesUsed"]=> 
    NULL 
    ["shared"]=> 
    NULL 
    ["sharedWithMeTime"]=> 
    NULL 
    ["sharingUserType":protected]=> 
    string(25) "Google_Service_Drive_User" 
    ["sharingUserDataType":protected]=> 
    string(0) "" 
    ["size"]=> 
    NULL 
    ["spaces"]=> 
    NULL 
    ["starred"]=> 
    NULL 
    ["thumbnailLink"]=> 
    NULL 
    ["trashed"]=> 
    NULL 
    ["version"]=> 
    NULL 
    ["videoMediaMetadataType":protected]=> 
    string(48) "Google_Service_Drive_DriveFileVideoMediaMetadata" 
    ["videoMediaMetadataDataType":protected]=> 
    string(0) "" 
    ["viewedByMe"]=> 
    NULL 
    ["viewedByMeTime"]=> 
    NULL 
    ["viewersCanCopyContent"]=> 
    NULL 
    ["webContentLink"]=> 
    NULL 
    ["webViewLink"]=> 
    NULL 
    ["writersCanShare"]=> 
    NULL 
    ["modelData":protected]=> 
    array(0) { 
    } 
    ["processed":protected]=> 
    array(0) { 
    } 
} 

的文件可以通過$service->files->get($file_id);獲得,但它在我的谷歌驅動器不可見。返回的文件資源對象不包含任何有用的內容。

+0

您使用的服務帳戶,您上傳文件到服務帳戶谷歌驅動器帳戶,你不能看到從谷歌驅動器的網頁版本。假設我沒有錯過將代碼上傳到個人雲端硬盤帳戶目錄中的代碼。 – DaImTo

+0

兩者都正確。我正在使用服務帳戶並嘗試上傳到個人帳戶。那麼,我應該如何更改我的代碼呢?我應該使用哪種憑據?我打算將此代碼用作cron作業/作爲接收圖像文件上傳的API。 – Raptor

回答

1

一個服務帳戶不是你更像一個虛擬用戶。它有自己的驅動器帳戶。

如果你想上傳到你的個人帳戶。以服務帳戶電子郵件地址並在您的個人驅動器帳戶中共享一個目錄。就像你想與其他用戶共享目錄或文件一樣。

然後,你需要找出目錄ID的唯一方法,我發現要做的就是讓服務帳戶做一個files.list來獲取它現在有權訪問的所有東西的列表。一旦你找到的目錄編號或父ID 你可以改變你的代碼上面類似

'data' => $data, 
'mimeType' => 'image/jpeg', 
'parents' => 'the directory id' 

我認爲你正在使用的V3 API我還沒來得及發揮它通過你的代碼的外觀。 'parents' => 'the directory id' < - 這是一個受過教育的猜測。如果它不起作用,讓我知道,我會谷歌了一下,弄清楚如何將父母傳遞給v3。

選項NR 2:

另一種辦法是服務帳戶與您共享的文件夾,那麼你將有機會獲得它的驅動器帳戶,你就可以看到你的網絡文件夾Drive版本。再次搜索權限我認爲你正在使用V3我還沒有看過它。差異在於數據存儲的位置以及存儲的計數對象。

+0

感謝您的輸入。我想我會選擇將選項1存儲在服務帳戶中的文件。 OCR部分如何?有什麼方法可以獲得OCR結果,即識別文本? – Raptor

+0

在我開始使用Google搜索文檔之前,我從來沒有聽說過OCR。它看起來應該自動將其轉換爲Google文檔類型。 V2有一個轉換爲V3的選項似乎沒有。我可能需要測試它的一個有趣的功能。 – DaImTo

+0

謝謝。 Google剛剛發佈了另一個用於OCR的API,稱爲Cloud Vision API,這是一種非免費解決方案。我認爲由於這個新的API,Drive API的OCR功能被減少/刪除,但無法確定,因爲沒有任何文檔。 – Raptor

0

請勿使用服務帳戶。如果您想上傳到自己的帳戶,那麼您只需爲您的帳戶獲取適當的訪問令牌。使用共享文件夾使用中間帳戶非常難看(imho)。

+0

我實際上並不需要保存文件。我只想獲得OCR結果。 – Raptor

+0

我知道你想要做什麼。在雲端硬盤可以對您的圖片進行OCR處理之前,您需要先上傳。在您上傳之前,您需要爲您的帳戶設置訪問令牌。一旦你掌握了它,這一切都很簡單。 – pinoyyid

+0

我很好,獲得訪問令牌。但是,我無法從API響應中獲得任何OCR文本(我應該閱讀哪個字段?)。 – Raptor

2

我剛剛在V3中找到了OCR的方法。

  1. 將圖像上傳
  2. 複製使用mime類型「應用/ vnd.google-apps.document」
  3. 出口使用mime類型「文本文檔作爲純文本/純圖像到谷歌文檔「

PS看起來像第2步不適用於「appDataFolder」。

UserCredential credential = null; 
try 
{ 
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
     new Uri("ms-appx:///Assets/client_secret.json"), 
     new[] { DriveService.Scope.DriveFile }, "user", CancellationToken.None); 
} 
catch (AggregateException ex) 
{ 
    Debug.Write("Credential failed, " + ex.Message); 
} 

// Create Drive API service. 
var service = new DriveService(new BaseClientService.Initializer() 
{ 
    HttpClientInitializer = credential, 
    ApplicationName = "TestApp", 
}); 

// Create folder 
var folderMetadata = new Google.Apis.Drive.v3.Data.File(); 
folderMetadata.Name = "NewFolder"; 
folderMetadata.MimeType = "application/vnd.google-apps.folder"; 
var request = service.Files.Create(folderMetadata); 
request.Fields = "id"; 
var folder = request.Execute(); 
Debug.WriteLine("Folder ID: " + folder.Id); 

// Upload the image file 
var fileMetadata = new Google.Apis.Drive.v3.Data.File(); 
fileMetadata.Name = inputFile.Name; 
fileMetadata.Parents = new List<string> { folder.Id }; 
FilesResource.CreateMediaUpload requestUpload; 
using (var stream = new System.IO.FileStream(inputFile.Path, System.IO.FileMode.Open)) 
{ 
    requestUpload = service.Files.Create(fileMetadata, stream, "image/jpeg"); 
    requestUpload.Fields = "id"; 
    requestUpload.Upload(); 
} 
var imgFile = requestUpload.ResponseBody; 
Debug.WriteLine("File ID: " + imgFile.Id); 

// Copy image and paste as document 
var textMetadata = new Google.Apis.Drive.v3.Data.File(); 
textMetadata.Name = inputFile.Name; 
textMetadata.Parents = new List<string> { folderId }; 
textMetadata.MimeType = "application/vnd.google-apps.document"; 
FilesResource.CopyRequest requestCopy = service.Files.Copy(textMetadata, imgFile.Id); 
requestCopy.Fields = "id"; 
requestCopy.OcrLanguage = "zh"; 
var textFile = requestCopy.Execute(); 

// Now we export document as plain text 
FilesResource.ExportRequest requestExport = service.Files.Export(textFile.Id, "text/plain"); 
string output = requestExport.Execute(); 
+0

你能分享你的代碼嗎? – Raptor

+0

我正在開發一個Win10項目,所以它是C#,希望有所幫助。 – Ramius

+0

感謝您的示例,但我標記了PHP的問題,而不是C#。 – Raptor