2016-10-05 93 views
0

在谷歌文档中,您可以看到并浏览文档大纲。我试图通过Google Drive API访问此大纲,但找不到相关文档。这是我现在的代码:谷歌驱动器API - 获取文档大纲

//authenticate 
    $this->authenticate(); 

    $Service = new Google_Service_Drive($this->Client); 
    $File = $Service->files->get($FileID); 

    return $File; 

我得到文档对象回来,但我找不到任何函数返回大纲。我需要大纲链接从我的应用程序访问文档的特定部分。任何想法如何能够实现?

回答

0

我终于用DaImTo解决了这个问题,指着我朝着正确的方向前进。获得file resource后,我用它获取文档HTML代码的导出链接,然后使用该链接使用Google_Http_Request检索该文档的HTML内容。 (Google documentation这部分)

public function retrive_file_outline($FileID) { 
    //authenticate 
    $this->authenticate(); 

    $Service = new Google_Service_Drive($this->Client); 
    $File = $Service->files->get($FileID); 

    $DownloadUrl = $File->getExportLinks()["text/html"]; 

    if ($DownloadUrl) { 
     $Request = new Google_Http_Request($DownloadUrl, 'GET', null, null); 
     $HttpRequest = $Service->getClient()->getAuth()->authenticatedRequest($Request); 
     if ($HttpRequest->getResponseHttpCode() == 200) { 
      return array($File, $HttpRequest->getResponseBody()); 
     } else { 
      // An error occurred. 
      return null; 
     } 
    } else { 
     // The file doesn't have any content stored on Drive. 
     return null; 
    } 
} 

之后,我解析使用DOMDocument HTML内容。所有标题都有id属性,用作anchor链接。我检索了所有标题(h1到h6)的id,并将其与我的文档编辑网址连接起来。这给了我所有的大纲链接。这里是解析和连接部分:

public function test($FileID) { 
    $File = $this->model_google->retrive_file_outline($FileID); 

    $DOM = new DOMDocument; 
    $DOM->loadHTML($File[1]); 

    $TagNames = ["h1", "h2", "h3", "h4", "h5", "h6"]; 
    foreach($TagNames as $TagName) { 
     $Items = $DOM->getElementsByTagName($TagName); 
     foreach($Items as $Item) { 
      $ID = $Item->attributes->getNamedItem("id"); 
      echo "<a target='_blank' href='" . $File[0]->alternateLink ."#heading=". $ID->nodeValue . "'>" . $Item->nodeValue . "</a><br />"; 
     } 
    } 
    //echo $File; 
} 

编辑: 我合并功能retrieve_file_outline和考不上retrieve_file_outline,我得到一个返回的链接和IDS文档标题的阵列功能:

public function retrive_file_outline($FileID) { 
    //authenticate 
    $this->authenticate(); 

    $Service = new Google_Service_Drive($this->Client); 
    $File = $Service->files->get($FileID); 

    $DownloadUrl = $File->getExportLinks()["text/html"]; 

    if ($DownloadUrl) { 
     $Request = new Google_Http_Request($DownloadUrl, 'GET', null, null); 
     $HttpRequest = $Service->getClient()->getAuth()->authenticatedRequest($Request); 
     if ($HttpRequest->getResponseHttpCode() == 200) { 
      $DOM = new DOMDocument; 
      $DOM->loadHTML($HttpRequest->getResponseBody()); 

      $TagNames = ["h1", "h2", "h3", "h4", "h5", "h6"]; 
      $Headings = array(); 
      foreach($TagNames as $TagName) { 
       $Items = $DOM->getElementsByTagName($TagName); 
       foreach($Items as $Item) { 
        $ID = $Item->attributes->getNamedItem("id"); 
        $Heading = array(
         "link" => $File->alternateLink . "#heading=" . $ID->nodeValue, 
         "heading_id" => $ID->nodeValue, 
         "title" => $Item->nodeValue 
        ); 

        array_push($Headings, $Heading); 
       } 
      } 

      return $Headings; 
     } else { 
      // An error occurred. 
      return null; 
     } 
    } else { 
     // The file doesn't have any content stored on Drive. 
     return null; 
    } 
} 
1

File.get返回一个file resource所有文件资源只是文件的元数据。其关于存储在谷歌驱动器上的文件的信息。

您将需要在某个文档应用程序中加载它以查找任何大纲链接。元数据不包含有关存储在文件中的数据的任何内容。