1

I'm trying to get the content of a Google Docs with the Google Drive API. I successfully fetched folder and got the Google Docs files id.

On the API documentation, it is said that I can download a file like this :

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.

So I tried to use an 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. 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.

When I try to write with the OutputStream into a txt file, I don't have any problem of characters not recognized.

I don't know what is the best way to achieve that. Can you help me ?

2
  • 1
    It is quite possible that your String contains correct data and that the console you print it to can't display the Japanese character (and thus replaces it with ?). Try serializing the String to some other format (like a JSON file or XML, using the appropriate libraries) and see if that's sufficient). Commented Aug 17, 2020 at 6:36
  • You are right it's just a problem of the console. When I display it in a JTextArea there is no problems. Commented Aug 17, 2020 at 9:01

1 Answer 1

1

The google Drive api is a file storage 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. You should consider using the Google docs api

Google Docs Java quickstart

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);
    }
}
Sign up to request clarification or add additional context in comments.

6 Comments

It is possible with the google drive api. It was just a problem with console as said in the first comment.
What is possible and what is the intended use are two different things. If you want to see the text in a google doc file you should consider using the proper api for that use case.
The problem is that I have several gdocs in google drive. I want to fetch all of them and I don't know how to get the files id using the google docs api.
A filel.ist from the Google drive api would return to you a file id that you could then use the tine Google Docs api. The file ids are the same. You would be using the two APIs together.
Ok thank you. I didn't thought about that. It is surely a better way to handle this problem.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.