使用iTextSharp 5.5.10读取16页PDF仅识别1页的问题求助
解决iTextSharp 5.5.10读取PDF时NumberOfPages返回1且无法读取表单值的问题
问题背景
你碰到的情况挺典型的:用iTextSharp 5.5.10读取一份16页的PDF(表单从第3页开始),结果pdfReader.NumberOfPages居然返回1,导致没法正常读取表单值;但换其他PDF(版本6)测试时,代码又能正常读取所有页面和字段。
你的测试代码是这样的:
Try Dim pdfTemplate As String = "D:\myFile.pdf" Dim pdfReader As New PdfReader(pdfTemplate) Dim pdfFields As AcroFields = pdfReader.AcroFields Dim pdfVal As String = "" For Each pdfField As KeyValuePair(Of String, AcroFields.Item) In pdfReader.AcroFields.Fields pdfVal = pdfFields.GetField(pdfField.Key) ShowMessage("KEY=[" & pdfField.Key & "]...VALUE=[" & pdfVal & "]", mINFO) Next Catch ex As Exception ShowMessage(ex.ToString, mERROR) End Try
为啥会这样?
这跟PDF版本7没啥关系,核心原因是这份PDF是XFA表单(XML Forms Architecture),不是咱们平时常见的普通AcroForm表单。iTextSharp 5.x对XFA表单的处理逻辑不一样:XFA表单其实是把XML数据嵌在PDF里,外层就一个“容器页”,所以pdfReader.NumberOfPages才会返回1,而且用普通遍历AcroFields的方式也拿不到表单值。
怎么解决?
针对XFA表单,得读取它内嵌的XML数据集来获取表单值,用下面这段代码就行:
Try Dim pdfTemplate As String = "D:\myFile.pdf" Dim pdfReader As New PdfReader(pdfTemplate) Dim pdfFields As AcroFields = pdfReader.AcroFields If pdfFields.Xfa.XfaPresent = True Then Dim xmlDoc As New XmlDocument xmlDoc.LoadXml(pdfFields.Xfa.DatasetsNode.OuterXml) ' 在这里写解析xmlDoc的代码,就能拿到你要的表单值了 Else MessageBox.Show("The file is not valid.") End If pdfReader.Close() pdfReader.Dispose() Catch ex As Exception MessageBox.Show(ex.Message) End Try
额外说一句
没必要把PDF转成低版本,因为问题根源是表单类型,不是PDF版本。只要识别出是XFA表单,用上面的方法读取XML数据集就能拿到所有表单内容啦。
内容的提问来源于stack exchange,提问作者DoumB
相关产品推荐
相关产品推荐

