我其实想制作一个可编辑的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)
我遗失的地点和内容?如果您需要更多信息,请告诉我。感谢。
答案 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;将PdfWriter
与PdfReader
结合使用。你应该阅读chapter 6 of my book,然后解释你想要达到的目标。
如果我现在必须猜测,我假设您希望人们在浏览器中填写HTML表单,并且您希望在点击按钮后以PDF格式填写表格。执行此操作的方法是检索每个参数的数据参数,并使用PdfReader
,PdfStamper
和AcroFields
填写PDF表单。如果这不是您想要做的,那么您必须澄清。