将文件保存为.pdf,如http响应错误中所述

时间:2015-10-24 14:51:07

标签: java pdf google-drive-api pdf-generation httpresponse

对于我的项目,我需要使用java从谷歌驱动器下载pdf文件 我得到了我的httpresponse代码200,并使用以下方法将其存储在abc.pdf文件中

String url = "https://docs.google.com/uc?id="+fileid+"&export=download";

    URL obj = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) obj.openConnection();

    // optional default is GET
    conn.setRequestMethod("GET");

    //add request header
    conn.setRequestProperty("User-Agent", USER_AGENT);

    int responseCode = conn.getResponseCode();
    System.out.println("\nSending 'GET' request to URL : " + url);
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(
            new InputStreamReader(conn.getInputStream()));
    String inputLine;
    OutputStream f0 = new FileOutputStream("C:\\Users\\Darshil\\Desktop\\abc.pdf",true);
    while ((inputLine = in.readLine()) != null) {
                //System.out.println(inputLine);
                byte b[]=inputLine.getBytes();
                //System.out.println(b);
                f0.write(b);
    }
    in.close();
            f0.close();

但是当我尝试在我的adobe reader x中打开abc.pdf时,我得到以下错误:

There was an error opening this document.The file is damaged and could not be repaired

1 个答案:

答案 0 :(得分:1)

您似乎使用原始HTTP请求直接访问Google云端硬盘。

您可能更擅长使用Google Drive SDK。 This link包含很好的示例,可以解决您在问题中说明的用例。

但是,如果您确实想坚持自己的技术,那么就不应该使用BufferedReader.readLine()。这是因为PDF文件最终是二进制文件,它取决于要保留的正确字节序列,以便PDF阅读器软件正确读取。希望以下技术可以帮助您:

//read in chunks of 2KB
byte[] buffer = new byte[2048];
int bytesRead = 0;
try(InputStream is = conn.getInputStream())
{

     try(DataOutputStream os = new DataOutputStream(new FileOutputStream("file.pdf"))
     {
         while((bytesRead = is.read(buffer)) != -1)
         {
            os.write(buffer, 0, bytesRead);
         }     
     }
}
catch(Exception ex)
{
    //handle exception
}

请注意,我在Java 7中使用try-with-resources语句

希望这有帮助。