随机顺序的 iTextSharp Acrofields
iTextSharp Acrofields in random order
我目前正在开发一个需要使用 iTextSharp 库的软件,不幸的是,作为一名学生,我无力支付商业许可证的费用,也无法发布源代码(以遵守许可证),因为我我是一名实习生,所以我目前正在使用 LGPL 许可下的 iTextSharp 4.1.6。
我正在尝试使用 SetField 在 pdf 中填充 AcroFields(见下文),但问题是当我试图通过 AcroFields.Fields.Key 获取所有 Acrofields 时,它们以随机顺序存储,见下文.
这是获取所有 acrofields 的代码:
Dim PdfReader As New PdfReader(ExistingFileStream)
Dim Stamper As New PdfStamper(PdfReader, NewFileStream)
Dim Form As AcroFields = Stamper.AcroFields
Dim FieldKeys = Form.Fields.Keys
For Each key As String In FieldKeys
Form.SetField(key, valeurs.Item(I).ToString())
I += 1
Next
Stamper.FormFlattening = True
Stamper.Close()
PdfReader.Close()
这是需要修改的原始PDF:
这是我使用上面的代码阅读 AcroFields 时得到的结果:
如您所见,AcroFields 完全随机排列,我不知道为什么会这样。问题是,当你在每个 AcroField 属性 中往下走时,有一个名为 tabOrder 的数组,其中包含一个整数,这个整数是正确的! "Nom" -> tabOrder(0) = 0,"Adresse" -> tabOrder(0) = 1 等等。
在字段中 属性 "Adresse" 应该是第二个,"Nom" 应该是第一个。它们基本上应该按 tabOrder 排序。
这是 iTextSharp 4.1.6 中的已知错误吗?我找不到任何关于 AcroFields 像我一样被错序的信息。
提前致谢。
祝你有愉快的一天。
暂时忽略 iText,假设我有一个非常简单的数据库 table,里面装满了具有名字、姓氏、生日和用户 ID 的人物对象。当您说 "give me all of the people" 时,它们应该按什么顺序排列?您个人可能希望按 "last name, first name" 排序,但其他人可能希望按 "birthday" 排序,而其他人可能希望按 "ID" 排序。我会争辩说 none 其中 "correct" 或 "better" 并进一步争辩说除非 API 实际上保证了某个顺序或允许我指定它完全是的东西由消费者根据自己的意愿进行分类。
回到 iText,当您说 "give me all the fields" iText 确实如此,但不能保证排序顺序。有些人会希望所有字段都按名称显示,而有些人会希望所有字段都按从左到右、从上到下的视觉顺序排列。就我个人而言,当我以编程方式处理文档时,我不太关心文档的 Tab 键顺序,但那只是我。此外,您提到的 "tab order" 实际上甚至不在 PDF 规范中,那只是 Adobe 添加到他们的产品中的东西,iText 和 Adobe 都在即时弥补!
长话短说,iText 的字段顺序可能对您来说 "random" 但这也不重要,因为您不应该对顺序做出任何假设,您应该根据需要对内容进行排序。
我目前正在开发一个需要使用 iTextSharp 库的软件,不幸的是,作为一名学生,我无力支付商业许可证的费用,也无法发布源代码(以遵守许可证),因为我我是一名实习生,所以我目前正在使用 LGPL 许可下的 iTextSharp 4.1.6。
我正在尝试使用 SetField 在 pdf 中填充 AcroFields(见下文),但问题是当我试图通过 AcroFields.Fields.Key 获取所有 Acrofields 时,它们以随机顺序存储,见下文.
这是获取所有 acrofields 的代码:
Dim PdfReader As New PdfReader(ExistingFileStream)
Dim Stamper As New PdfStamper(PdfReader, NewFileStream)
Dim Form As AcroFields = Stamper.AcroFields
Dim FieldKeys = Form.Fields.Keys
For Each key As String In FieldKeys
Form.SetField(key, valeurs.Item(I).ToString())
I += 1
Next
Stamper.FormFlattening = True
Stamper.Close()
PdfReader.Close()
这是需要修改的原始PDF:
这是我使用上面的代码阅读 AcroFields 时得到的结果:
如您所见,AcroFields 完全随机排列,我不知道为什么会这样。问题是,当你在每个 AcroField 属性 中往下走时,有一个名为 tabOrder 的数组,其中包含一个整数,这个整数是正确的! "Nom" -> tabOrder(0) = 0,"Adresse" -> tabOrder(0) = 1 等等。
在字段中 属性 "Adresse" 应该是第二个,"Nom" 应该是第一个。它们基本上应该按 tabOrder 排序。
这是 iTextSharp 4.1.6 中的已知错误吗?我找不到任何关于 AcroFields 像我一样被错序的信息。
提前致谢。
祝你有愉快的一天。
暂时忽略 iText,假设我有一个非常简单的数据库 table,里面装满了具有名字、姓氏、生日和用户 ID 的人物对象。当您说 "give me all of the people" 时,它们应该按什么顺序排列?您个人可能希望按 "last name, first name" 排序,但其他人可能希望按 "birthday" 排序,而其他人可能希望按 "ID" 排序。我会争辩说 none 其中 "correct" 或 "better" 并进一步争辩说除非 API 实际上保证了某个顺序或允许我指定它完全是的东西由消费者根据自己的意愿进行分类。
回到 iText,当您说 "give me all the fields" iText 确实如此,但不能保证排序顺序。有些人会希望所有字段都按名称显示,而有些人会希望所有字段都按从左到右、从上到下的视觉顺序排列。就我个人而言,当我以编程方式处理文档时,我不太关心文档的 Tab 键顺序,但那只是我。此外,您提到的 "tab order" 实际上甚至不在 PDF 规范中,那只是 Adobe 添加到他们的产品中的东西,iText 和 Adobe 都在即时弥补!
长话短说,iText 的字段顺序可能对您来说 "random" 但这也不重要,因为您不应该对顺序做出任何假设,您应该根据需要对内容进行排序。