如何从Google文档下载PDF文档并将其显示在浏览器中?

时间:2012-03-05 18:30:18

标签: asp.net google-docs

使用下面显示的代码,PDF文档似乎不是有效的PDF格式。浏览器显示消息“无法加载PDF文档。”如果我将下载保存到文件并在Adobe Reader中打开,则会显示消息“打开时出错这份文件。

我可以在Google文档中手动打开和下载文档。因此,它是一个有效的PDF文档。

我正在使用C#,ASP.NET和Google.Documents。

        // get the document to download
        Feed<Document> feed = request.GetEverything( );
        foreach( Document entry in feed.Entries )
        {
            if( entry.AtomEntry.AlternateUri.ToString( ) == DocumentAltUri )
            {
                document = entry;
                break;
            }
        }

        using( Stream stream = request.Download( document, Document.DownloadType.pdf ) )
        {
            StreamReader reader = new StreamReader( stream );
            string content = reader.ReadToEnd( );
            reader.Close( );

            Response.ClearContent( );
            Response.ContentType = "application/pdf";
            Response.AddHeader( "Content-Length", content.Length.ToString( ) );
            Response.AddHeader( "Content-Disposition", "inline;" );
            Response.Write( content );
            Response.Flush( );
            Response.Close( );
            Response.End( );
        }

更新:已解决。代码如下所示。

2 个答案:

答案 0 :(得分:0)

您可以从以下帖子中获取一些想法: code to download PDF file in C#

它使用了一个额外的标题:content-disposition。

答案 1 :(得分:0)

问题是文件内容是以文本形式读取的,它需要是Byte []。

更新的代码:

        using( Stream stream = request.Download( document, type ) )
        {
            long length = 0;
            Response.ClearContent( );
            Response.ContentType = contentType;

            int nBytes = 2048;
            int count = 0;
            Byte[] arr = new Byte[nBytes];
            do
            {
                length += count = stream.Read( arr, 0, nBytes );
                Response.OutputStream.Write( arr, 0, count );
            } while( count > 0 );

            Response.AddHeader( "Content-Disposition", "inline;filename=" + filename + fileext);
            Response.AddHeader( "Content-Length", length.ToString( ) );
            Response.Flush( );
            Response.Close( );
            Response.End( );
        }