2016-05-03 5 views
0

В настоящее время я разрабатываю программное обеспечение, которое должно использовать библиотеку iTextSharp, к сожалению, как студент, я не могу позволить себе оплачивать коммерческую лицензию, и я не могу опубликовать исходный код (чтобы соответствовать лицензии), поскольку я стажер, поэтому в настоящее время я использую iTextSharp 4.1.6, который находится под лицензией LGPL.iTextSharp Acrofields в случайном порядке

Я пытаюсь заполнить AcroFields в pdf (см. Ниже) с помощью SetField, но проблема в том, что я пытаюсь получить все Acrofields через AcroFields.Fields.Key они хранятся в случайном порядке, см. Ниже.

Это код, который получает все 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 и т. Д.

В полях свойство «Адрес» должно быть вторым, а «Ном» должно быть первым. Они в основном должны быть заказаны 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». Я бы сказал, что ни одна из них не является «правильной» или «лучшей» и не утверждает, что, если API фактически не обеспечил определенный порядок или не позволил мне указать что-то, что было бы полностью для потребителя, чтобы сортировать вещи, как бы они этого ни хотели.

Обратно в iText, когда вы говорите «дайте мне все поля», iText делает именно это, но нет гарантии порядка сортировки. Некоторым людям понадобятся все поля по имени, и некоторые люди захотят, чтобы все поля были визуально слева направо, сверху вниз. Лично я мог бы не беспокоиться о порядке вкладок документа, когда я его обрабатываю программно, но это только я. Кроме того, упоминание «табуляции», о котором вы упоминаете, на самом деле даже не указано в спецификации PDF, это было просто то, что Adobe добавила в свой продукт, и iText, и Adobe составляют на лету!

Короче говоря, заказ iText для полей может показаться вам «случайным», но это также не должно иметь значения, потому что вы не должны делать никаких предположений о заказе, и вы должны сортировать вещи, как хотите.

+0

Я действительно задал вопрос, потому что в последней версии iText acrofiles сортируются так, как вы их отсортировали при создании PDF-файла с программным обеспечением adobe. Спасибо за ответ. – Deodexed

+0

@Deodexed, я видел вашу заметку об этом, но я все же предполагал, что нет никакого программного договора, гарантирующего вам, что конкретный порядок сортировки продолжается. –

+0

Это относится к любому языку программирования? Должны ли мы предположить, что когда мы извлекаем данные из любого источника, он не будет упорядочен так, как мы хотим? – Deodexed

Смежные вопросы