2010-03-13 174 views
2

我试图根据从ASP.net Web服务接收到的二进制数据在我的ASP.net页面中显示PDF文件。以下是代码。虽然我从Web服务获取数据出于某种原因,如果我在页面加载时运行下面提到的代码,我收到了上述错误。该文件已损坏,无法修复

请帮

Response.Buffer = True 
Response.ContentType = "application/pdf" 
Response.AddHeader("Content-Disposition", "Inline") 

Dim ws As New imageGenService.Service1 
Dim imagebyte As Byte() = Nothing 

imagebyte = ws.generateSamplePDF() 

If imagebyte IsNot Nothing Then 
    '"attachment; filename=Whatever.pdf" 

    Dim MemStream As New System.IO.MemoryStream 
    Dim doc As New iTextSharp.text.Document 
    Dim reader As iTextSharp.text.pdf.PdfReader 
    Dim numberOfPages As Integer 
    Dim currentPageNumber As Integer 
    Dim writer As iTextSharp.text.pdf.PdfWriter = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, MemStream) 
    doc.Open() 
    Dim cb As iTextSharp.text.pdf.PdfContentByte = writer.DirectContent 
    Dim page As iTextSharp.text.pdf.PdfImportedPage 
    Dim rotation As Integer 

    reader = New iTextSharp.text.pdf.PdfReader(imagebyte) 
    numberOfPages = reader.NumberOfPages 
    currentPageNumber = 0 

    Do While (currentPageNumber < numberOfPages) 
     currentPageNumber += 1 
     doc.SetPageSize(PageSize.LETTER) 
     doc.NewPage() 
     page = writer.GetImportedPage(reader, currentPageNumber) 
     rotation = reader.GetPageRotation(currentPageNumber) 
     If (rotation = 90) Or (rotation = 270) Then 
      cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(currentPageNumber).Height) 
     Else 
      cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0) 
     End If 

    Loop 

    If MemStream Is Nothing Then 
     Response.Write("No Data is available for output") 
    Else 
     Response.BinaryWrite(MemStream.GetBuffer()) 
    End If 



End If 

当我在下面一个记事本打开该PDF下面我看到:

%PDF-1.4 
%âãÏÓ 


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
    Untitled Page 
</title></head> 
<body> 
    <form name="form1" method="post" action="ShowPDF.aspx" id="form1"> 
<div> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGQpkGvp7bYOLIE6xshhcZ2kYd2baA==" /> 
</div> 

    <div> 

    </div> 
    </form> 
</body> 
</html> 

回答

8

您的代码继续在响应中呈现您的aspx网站代码,因为您尚未拨打Response.End来阻止进一步处理。添加一个调用该方法后,在你完成你的二进制写 - 你的PDF渲染代码最终会为:

Response.ContentType = "application/pdf" 
    Response.AddHeader("Content-Disposition", "Inline") 
    Response.BinaryWrite(MemStream.GetBuffer()) 
    Response.Flush 
    Response.End 

编辑: 此外,我认为你可能无法创建PDF文件正确 - 例如参见this question。我认为您可能错过的重要一步是在尝试从中读取文件(即,在添加内容的循环之后立即)之前调用doc.Close来关闭文档。

+0

+1看起来像对我的解释。 – 2010-03-14 16:20:48

+0

Dexter,放入response.end后我仍然得到相同的错误,如果我在记事本中打开PDF,我会看到下面的%PDF-1.4%粤ICP备案号: – acadia 2010-03-14 16:49:57

+0

@acadia - 确实增加了对doc.Call的调用。 – Dexter 2010-03-16 04:06:10

0

你可以尝试设置Content-Length头相等的大小MemoryStream的。另外,在调用Response.BinaryWrite之后,请尝试调用Response.Flush。

+0

它没有在psite工作设置内容长度和response.flush – acadia 2010-03-14 13:52:08

2

我遇到了同样的问题。尝试了所有的建议。没有工作,直到最后试图指定内容的长度和瞧!

希望这个答复在1年后有所帮助。

添加以下代码:

Response.AddHeader( “Content-Length的” MemStream.GetBuffer()长。)

+0

完美的工作。谢谢。我的问题是我使用HttpContext.Current.ApplicationInstance.CompleteRequest()而不是Response.End()。设置Content-Length标头可以解决问题。 – HashName 2011-05-03 12:47:54