简体   繁体   English

如何从 Java 中的 Google Drive API 获取 Gdoc 内容?

[英]How to get Gdoc content from Google Drive API in Java?

I'm trying to get the content of a Google Docs with the Google Drive API.我正在尝试使用 Google Drive API 获取 Google Docs 的内容。 I successfully fetched folder and got the Google Docs files id.我成功获取了文件夹并获得了 Google Docs 文件 ID。

On the API documentation, it is said that I can download a file like this:在API文档上,据说可以下载这样的文件:

private String getGdoc(String id) throws Exception {
        if(service == null) throw new Exception();
        OutputStream outputStream = new ByteArrayOutputStream();
        service.files().export(id, "text/plain")
            .executeMediaAndDownloadTo(outputStream);
        
        return null;
    }

My problem is that I don't want to write it into a file with an OutputStream but I want to get the content of the file into a String .我的问题是我不想将它写入带有OutputStream的文件,但我想将文件的内容放入String

So I tried to use an InputStream :所以我尝试使用InputStream

private String getGdoc(String id) throws Exception {
        if(service == null) throw new Exception();
        InputStream inputStream = service.files().export(id, "text/plain")
            .executeMediaAsInputStream();
        
        System.out.println(IOUtils.toString(inputStream, StandardCharsets.UTF_8));
        
        return null;
    }

With an InputStream I get the content of the file, however I have some Japanese characters in my documents and they are not displayed.使用InputStream我可以获取文件的内容,但是我的文档中有一些日文字符并且它们没有显示出来。 I only get ?我只得到? for these Japanese characters in the console.对于控制台中的这些日文字符。 I don't know where it can come from since I specified to use the UTF-8 charset.我不知道它来自哪里,因为我指定使用 UTF-8 字符集。

When I try to write with the OutputStream into a txt file, I don't have any problem of characters not recognized.当我尝试将OutputStream写入 txt 文件时,我没有任何字符无法识别的问题。

I don't know what is the best way to achieve that.我不知道实现这一目标的最佳方法是什么。 Can you help me?你能帮助我吗?

The google Drive api is a file storage api. google Drive api是一个文件存储api。 It will let you upload and download files stored within google drive.它可以让您上传和下载存储在谷歌驱动器中的文件。 When downloading the file it is intended that you would save it to your machine and then open it in a third party application.下载文件时,您打算将其保存到您的机器上,然后在第三方应用程序中打开它。

If you want to examine and manipulate the contents of a google document file stored on Google drive.如果您想检查和操作存储在 Google 驱动器上的 google 文档文件的内容。 You should consider using the Google docs api您应该考虑使用Google 文档 api

Google Docs Java quickstart Google 文档 Java 快速入门

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.docs.v1.Docs;
import com.google.api.services.docs.v1.DocsScopes;
import com.google.api.services.docs.v1.model.Document;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class DocsQuickstart {
    private static final String APPLICATION_NAME = "Google Docs API Java Quickstart";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";
    private static final String DOCUMENT_ID = "195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE";

    /**
     * Global instance of the scopes required by this quickstart.
     * If modifying these scopes, delete your previously saved tokens/ folder.
     */
    private static final List<String> SCOPES = Collections.singletonList(DocsScopes.DOCUMENTS_READONLY);
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

    /**
     * Creates an authorized Credential object.
     * @param HTTP_TRANSPORT The network HTTP Transport.
     * @return An authorized Credential object.
     * @throws IOException If the credentials.json file cannot be found.
     */
    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
        // Load client secrets.
        InputStream in = DocsQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

    public static void main(String... args) throws IOException, GeneralSecurityException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();

        // Prints the title of the requested doc:
        // https://docs.google.com/document/d/195j9eDD3ccgjQRttHhJPymLJUCOUjs-jmwTrekvdjFE/edit
        Document response = service.documents().get(DOCUMENT_ID).execute();
        String title = response.getTitle();

        System.out.printf("The title of the doc is: %s\n", title);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM