更改主机服务器后,itextsharp无法正常工作

时间:2014-06-24 03:34:17

标签: itextsharp

我使用iTextSharp来操作PDF然后流式传输到浏览器。它已经运行了很多年,但我最近将网站从Windows Server 2003迁移到了Windows Server 2008(实际上是SBS 2011)。

它仍然可以在我的开发环境中运行,但在新的生产环境中,它会生成一个无法读取的损坏的1kb文件。

初始文件没问题。操纵文件是问题所在。我认为它必须是环境而不是代码问题,但无论如何这里是代码:

'Create a pdf reader and use the the rendered pdf byte array from reporting services as input
Dim reader As PdfReader = New PdfReader(data)
Dim pageCount As Integer = reader.NumberOfPages
Dim pageSize As iTextSharp.text.Rectangle = reader.GetPageSize(1)


'Setup the pdf writer. This will take our rendered pdf and allow us to add a few actions and settings to it before streaming it to the browser.
Dim document As iTextSharp.text.Document = New iTextSharp.text.Document(pageSize)
Dim outputstream As MemoryStream = New MemoryStream()
Dim writer As PdfWriter = PdfWriter.GetInstance(document, outputstream)

'Set encryption and allow printing only
writer.SetEncryption(Nothing, Nothing, PdfWriter.ALLOW_PRINTING, PdfWriter.STANDARD_ENCRYPTION_128)

document.Open()
'Copy each existing page into writer
Dim content As PdfContentByte = writer.DirectContent
For i As Integer = 0 To pageCount - 1

    document.NewPage()
    Dim page As PdfImportedPage = writer.GetImportedPage(reader, i + 1) ' page numbers are one-based
    content.AddTemplate(page, 0, 0) ' x and y correspond to position on the page?
Next


'Insert Javascript to close document after printed
Dim jsClose As String = "this.closeDoc(true);"
writer.SetAdditionalAction(PdfName.DP, PdfAction.JavaScript(jsClose, writer))

'Set Zoom level to 100%
Dim pdfDest As PdfDestination = New PdfDestination(PdfDestination.XYZ, 0, document.PageSize.Height, 1.0F)
writer.SetOpenAction(PdfAction.GotoLocalPage(1, pdfDest, writer))

Dim silentPrint As String = Nothing
silentPrint += "var params = this.getPrintParams(); "
silentPrint += "params.printerName='" & Session("Printer") & "';"
silentPrint += "params.pageHandling = params.constants.handling.shrink;"
silentPrint += "this.print(params);"

'Close the pdfdocument before we stream it to browser
document.Close()

'This line is very important. Convert the output stream to byte array and use that instead of output stream.
'PDF file will be corrupted if we don't do this. Even if we use stream.ToArray. Something to do with document being closed already (which it needs to be)
Dim s() As Byte = outputstream.ToArray

If s.Length > 0 Then

    Response.Buffer = True
    Response.Clear()
    Response.ClearContent()
    Response.ClearHeaders()
    Response.ContentType = "application/pdf"
    Response.AddHeader("content-disposition", "inline; filename=VisitorPass.pdf")
    Response.AddHeader("Content-Length", s.Length.ToString())
    Response.OutputStream.Write(s, 0, s.Length)
    Response.Flush()
    Response.End()
    Response.Close()
    Response.OutputStream.Dispose()
End If

关于在新服务器上可能导致此问题的任何想法?

0 个答案:

没有答案