2016-05-03 118 views
0

我目前正在开发需要使用iTextSharp库的软件,作为学生不幸支付我不能支付商业许可证,也不能发布源代码(要遵守许可证),因为我是一名实习生,所以我目前正在使用LGPL许可证下的iTextSharp 4.1.6。iTextSharp以随机顺序排列的Acofields

我想使用SetField在pdf中填充AcroFields(请参阅下图),但问题是当我试图通过AcroFields.Fields.Key获取所有Acofields时,它们以随机顺序存储,请参见下图。

这是获取所有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需要被修改:

the original PDF which needs to be modified

这是使用阅读AcroFields当我得到什么上面的代码:

what I get when reading AcroFields using the code above

正如你所看到的AcroFields是在一个完整的随机顺序,我不知道它为什么。问题是当你在每个AcroField属性中出现一个名为tabOrder的数组时,它包含一个整数,这个整数是正确的! “Nom” - > tabOrder(0)= 0,“Adresse” - > tabOrder(0)= 1等等。

在Fields属性中,“Adresse”应该是第二个,“Nom”应该是第一个。他们基本上应该由tabOrder订购。

这是iTextSharp 4.1.6中的一个已知错误吗?我无法找到任何有关AcroFields被错误排序的事情,就像它对我所做的一样。

预先感谢您。

祝您有愉快的一天。

+1

如果'valeurs'是字段[Dictionary(Of String,String)](https://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx)键作为字典键,那么你可以做一些像'Form.SetField(key,valuers(key))'。 –

+0

这实际上是一个很好且快速的工作周,我为此感谢你。 – Deodexed

+1

AcroFields.Fields是一个.NET IDictionary的对象。其元素的顺序是未定义的,并且可以(理论上)从一个实现改变到下一个。 – blagae

回答

3

暂时忽略iText,想象一下,我有一个非常简单的数据库表,里面充满了名字,姓氏,生日和用户ID的人物对象。当你说“给我所有的人”时,他们应该以什么顺序?您个人可能希望按“姓氏,名字”排序,但其他人可能希望按“生日”排序,而其他人可能希望按“ID”排序。我认为这些都不是“正确的”或“更好的”,并且进一步争辩说,除非API实际上保证了某个顺序,或者让我指定了完全由消费者决定的东西,然而他们想要的东西。

回到iText,当你说“给我所有的领域”iText做到了这一点,但不能保证排序顺序。有些人会希望所有字段的名称和一些人会希望所有领域的视觉从左到右,从上到下的顺序。就我个人而言,当我以编程方式处理文档时,我可以不太关心文档的Tab顺序,但那只是我。另外,您提到的“Tab键顺序”实际上甚至不在PDF规范中,这只是Adobe添加到其产品中的一种方式,iText和Adobe都可以在飞行中进行组合!长话短说,iText的字段顺序可能对你“随机”出现,但这也不应该紧,因为你不应该假定顺序,你应该根据需要来分类。

+0

这个问题其实我问这个问题,因为在iText的最新版本,acrofiles进行排序创建与Adobe的软件PDF当你整理它们的方式。谢谢回答。 – Deodexed

+0

@Deodexed,我看到了你的有关注意事项,但我仍然认为有保证您特定的排序顺序前进没有计划合同。 –

+0

这是否适用于任何编程语言?我们是否必须假设,当我们从任何来源检索数据时,它不会按照我们希望的方式进行排序? – Deodexed