You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:31:42