使用itextsharp和asp.net将字节转换为pdf

时间:2014-05-14 02:03:10

标签: asp.net exception pdf byte itextsharp

我其实想制作一个可编辑的PDF,但却无法做到。所以我想给用户一个webform,然后填写它然后从中生成PDF。通过这种方式,我可以将他/她的条目保存在我的SQL表中以供将来参考。

我正在使用itextsharp。我有一个aspx页面。在那我有radgrids,文本框。我必须将其转换为pdf。我读取转换为字节,然后很容易转换为PDF格式。好吧,我没有得到它。

  Protected Sub btnGeneratePDF_Click(sender As Object, e As EventArgs) Handles btnGeneratePDF.Click
    Dim strWriter As New StringWriter()
    Dim byteFinalPDF As Byte()
    Dim myClient As New Net.WebClient()
    byteFinalPDF = myClient.DownloadData(HttpContext.Current.Request.Url.AbsoluteUri)
    If byteFinalPDF Is Nothing Then
        Throw New ApplicationException("Could not generate Work Order PDF for Work Order# " & intWorkOrderID)
    End If
    Dim all As Byte()
    Dim fs As New FileStream("C:\MyPath\InspectionSheet.pdf", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)

    Using ms As New MemoryStream()
        Dim doc As New iTextSharp.text.Document()
        Dim pdfWriter As PdfWriter = pdfWriter.GetInstance(doc, ms)
        Dim includeHeader As New TableHeader() 'ERROR

        doc.SetPageSize(PageSize.LETTER)
        doc.Open()
        Dim pcb As PdfContentByte = pdfWriter.DirectContent
        Dim page As PdfImportedPage = Nothing
        Dim pdfReader As PdfReader = Nothing
        pdfReader = New PdfReader(byteFinalPDF)
        Dim pages As Integer = pdfReader.NumberOfPages

        For i As Integer = 1 To pages
            doc.SetPageSize(PageSize.LETTER)
            doc.NewPage()
            page = pdfWriter.GetImportedPage(pdfReader, i)
            pcb.AddTemplate(page, 0, 0)
        Next

        doc.Close()
        all = ms.GetBuffer()
        ms.Flush()
        ms.Dispose()
    End Using
      End Sub

这是我尝试过的。请参阅上面代码中的注释“ERROR”。我实际上在我的Visual Studio中对它进行了评论。只需把它放在这里供大家看。错误说“Type TableHeader未定义”。

我想点击一个按钮,看到可以下载的pdf。我为我的文件流提供了一条路径。我想它会在那里得救。我希望用户在底部看到生成的pdf。当我点击按钮

时,它给出了这样的例外
        iTextSharp.text.exceptions.InvalidPdfException was unhandled by user code
        HResult=-2146232800
         Message=PDF header signature not found.
        Source=itextsharp
           StackTrace:
       at iTextSharp.text.pdf.PdfReader..ctor(IRandomAccessSource byteSource, Boolean partialRead, Byte[] ownerPassword, X509Certificate certificate, ICipherParameters certificateKey, Boolean closeSourceOnConstructorError)
      at iTextSharp.text.pdf.PdfReader..ctor(Byte[] pdfIn, Byte[] ownerPassword)
      at iTextSharp.text.pdf.PdfReader..ctor(Byte[] pdfIn)
   at Web_FolderUser_InspectionForm.btnGeneratePDF_Click(Object sender, EventArgs e) in C:\Users\...\InspectionForm.aspx.vb:line 128
       at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
         at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
      at  System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
     at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
      at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,  Boolean includeStagesAfterAsyncPoint)
InnerException: 

第128行

    pdfReader = New PdfReader(byteFinalPDF)

我遗失的地点和内容?如果您需要更多信息,请告诉我。感谢。

1 个答案:

答案 0 :(得分:0)

请查看我对以下问题的回答:Adding page to existing PDF com.itextpdf.text.exceptions.InvalidPdfException: PDF header signature not found

在您的代码中,您可以像这样定义byteFinalPDF

byteFinalPDF = myClient.DownloadData(HttpContext.Current.Request.Url.AbsoluteUri)

目前还不清楚DownloadData正在做什么,但无论如何:你没有下载PDF文件,因为PDF文件以字节%PDF-1.开头。它还不清楚为什么你& #39;将PdfWriterPdfReader结合使用。你应该阅读chapter 6 of my book,然后解释你想要达到的目标。

如果我现在必须猜测,我假设您希望人们在浏览器中填写HTML表单,并且您希望在点击按钮后以PDF格式填写表格。执行此操作的方法是检索每个参数的数据参数,并使用PdfReaderPdfStamperAcroFields填写PDF表单。如果这不是您想要做的,那么您必须澄清。