2016-03-07 6 views
2

Я пытаюсь загрузить изображение на Google Drive для оптического распознавания символов (OCR). Вот мои коды:Загрузить изображение на Google Диск для 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(); 
} 

Вышеуказанные коды работают без ошибок, и $createdFile является допустимым ресурсом в Google_Service_Drive_DriveFile формы объекта.

Вопросы:

  1. Я предполагаю, что загрузка прошла успешно, так как функция create() не возвращает ошибку. Однако я не вижу, как файлы загружались на моем Google Диске. Не следует ли загружать его в корневую папку Google Диска?

  2. Как я могу выполнить OCR? Я могу читать с here, что есть параметр с именем ocrLanguage. Где я должен это поставить и как получить результат?

Заранее благодарен.

UPDATE В var_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);, но невидимая в моем Google Drive. Возвращаемый объект File Resource также не содержит ничего полезного.

+0

С помощью учетной записи службы вы загрузили файл в учетную запись службы учетных записей google, которую вы не видите в веб-версии Google Drive. что я не пропустил код, в который вы загрузили его в каталог на вашем личном диске. – DaImTo

+0

Оба правильные. Я использую учетную запись службы и пытаюсь загрузить на личный счет. Итак, как мне изменить мои коды? какие полномочия следует использовать? Я планирую использовать этот код как задание cron/как API, который получает загрузки файлов изображений. – Raptor

ответ

1

Учетная запись службы больше не похожа на фиктивного пользователя. У этого есть своя собственная учетная запись привода.

Если вы хотите загрузить в свой личный кабинет. Возьмите адрес электронной почты учетной записи службы и поделитесь ею с каталогом на вашем личном диске. Так же, как и любой другой пользователь, которому вы хотите поделиться каталогом или файлом.

Затем вам нужно выяснить идентификатор каталога только так, как я нашел, чтобы это сделать, чтобы учетная запись службы создала файл.list, чтобы получить список всего, к чему у него теперь есть доступ. После того, как вы нашли идентификатор каталога или родительский идентификатор вы можете изменить свой код, чтобы что-то вроде

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

Я думаю, что, судя по вашему коду вы используете V3 апи у меня не было время, чтобы играть с ним , 'parents' => 'the directory id' < - это образованная догадка. Если это не помогает, дайте мне знать, и я немного погуляю, чтобы выяснить, как передать родителя на v3.

Вариант NR 2:

Другого варианта для учетной записи службы поделиться папкой с вами, то вы будете иметь доступ к его приводу учетной записи, и вы будете иметь возможность увидеть эту папку в вашей сети версии Диска. Повторите поиск по разрешениям. Я думаю, что вы используете V3. Я еще не посмотрел на него. Разница заключается в том, где хранятся данные и с кем подсчитывается хранилище.

+0

Спасибо за ввод. Думаю, я поеду на вариант 1, который хранит файлы в учетной записи службы. Как насчет части OCR? Есть ли способ получить результаты OCR, т. Е. Распознанный текст? – Raptor

+0

Я никогда не слышал об OCR, прежде чем начал работать над документацией для вас. Похоже, он должен автоматически преобразовать его в тип документа google. У V2 была опция для конвертации V3, похоже, нет. Возможно, мне придется испытать эту забавную функцию. – DaImTo

+0

Спасибо. Google только что выпустил еще один API для OCR, называемый Cloud Vision API, который является несвободным решением. Я думаю, что способность OCR к API-интерфейсу Drive уменьшена/удалена из-за этого нового API, но не может быть уверенной, поскольку никакой документации нет. – Raptor

0

Не используйте учетную запись службы. Если вы хотите загрузить свою учетную запись, вам просто нужно получить соответствующий токен доступа для своей учетной записи. Использование промежуточной учетной записи с использованием общих папок действительно уродливое (imho).

+0

На самом деле мне не нужно сохранять файл вообще. Я просто хочу получить результаты OCR. – Raptor

+0

Я знаю, что вы хотите. Перед тем, как Drive сможет распознать ваш образ, вам необходимо загрузить его. Прежде чем вы сможете загрузить его, вам нужен токен доступа для вашей учетной записи. Все это довольно просто, как только вы получите его. – pinoyyid

+0

Я в порядке, чтобы получить токен доступа. Однако я не могу получить какие-либо тексты OCR из ответа API (какое поле следует читать?). – Raptor

2

Я только что нашел способ OCR в V3.

  1. Загрузить изображение
  2. Скопируйте изображения в Google Документ с помощью MIMETYPE "приложение/vnd.google-apps.document"
  3. экспорта документа в виде обычного текста с использованием MIMETYPE «текст/обычный "

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

Смежные вопросы