2010-03-13 4 views
2

Я пытаюсь отобразить PDF-файл на моей странице ASP.net на основе двоичных данных, полученных из веб-службы ASP.net. Ниже приведен код. хотя я получаю данные из веб-службы по какой-то причине, если я запускаю приведенный ниже код при загрузке страницы, я получаю вышеупомянутую ошибку.Файл поврежден и не удалось восстановить

Пожалуйста, помогите

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 

EDIT: Кроме того, я думаю, что вы не можете создать свой PDF документ правильно - см., например, this question. Важным шагом, который, как мне кажется, вы пропустили, является закрытие документа, вызвав doc.Close, прежде чем пытаться его прочитать (то есть сразу после цикла, в котором вы добавляете свой контент).

+0

+1 Похоже на объяснение мне. –

+0

Dexter, После размещения response.end Я все равно получаю ту же ошибку, и если я открою PDF в блокноте, я вижу ниже% PDF-1.4% 粤 マ モ – acadia

+0

@acadia - добавили ли вы вызов doc.Close исправить вашу проблему? – Dexter

0

Вы можете попробовать установить заголовок длину содержимого равного размеру MemoryStream. Кроме того, попробуйте вызвать Response.Flush после вашего вызова Response.BinaryWrite.

+0

Он не работал в psite установки длины содержимого и Response.Flush – acadia

2

Я столкнулся с той же проблемой. Пробовал все предложения. Не работал, пока, наконец, не попробовал указать длину контента и вуаля!

Надеюсь, что этот ответ поможет через 1 год.

Добавьте этот код:

Response.AddHeader ("Content-Length", MemStream.GetBuffer() длина.)

+0

Работает отлично. Спасибо. Моя проблема заключалась в том, что я использовал HttpContext.Current.ApplicationInstance.CompleteRequest() вместо Response.End(). Проблема с заголовком Content-Length устраняет проблему. – HashName

Смежные вопросы