Почему PDFBox перезаписывает несколько полей, даже если они не соответствуют полностью квалифицированному имени?(Kotlin Android) - PullRequest
0 голосов
/ 22 февраля 2019

Я использую com.tom_roush: pdfbox-android: версия PDFBox 1.8.10.1.

У меня есть следующий код.

 val skillList = listOf<String>("Athletics","Acrobatics","Sleight of Hand", "Stealth","Acrana", "History","Investigation","Nature", "Religion", "Animal Handling", "Insight", "Medicine", "Perception", "Survival", "Deception", "Intimidation", "Performance", "Persuasion"


private fun getField(acroForm:PDAcroForm,name:String): PDTextField {
    return acroForm.getField(name) as PDTextField
}
var temp = 0

        skillList.forEach {
            val field = getField(acroForm,it.name)
            temp += 1
             field.value = temp.toString()

        }

Вот ссылка на PDF, PDF в вопросе Моя проблема в том, что в моем окончательном PDF (все поля с уникальными именами, которые соответствуют приведенному выше списку), многие из них установлены с 17-м из 18 проходов.Что я делаю не так?

1 Ответ

0 голосов
/ 22 февраля 2019

Это ошибка в PDFBox (1.8.x и 2.x) при заполнении форм PDF, которая возникает только в том случае, если в исходной форме несколько полей совместно используют один и тот же XObject в качестве потока оформления.

Подробно

Ваш исходный документ содержит много пустых текстовых полей.Несколько их подмножеств имеют общий внешний вид, например, «Атлетика» и «Религия»:

AthleticsReligion

Asвы можете видеть, что они оба совместно используют объект XObject в PDF 479.

Когда PDFBox заполняет значения формы, он сначала устанавливает значение «Атлетика» равным «1», а также обновляет внешний вид XObject, чтобы показать «1", а затем он устанавливает значение" Religion "в" 9 "и обновляет внешний вид XObject, чтобы показать" 9 ".Конечный результат: в средстве просмотра «Атлетика» и «Религия» в качестве значения отображается «9».

Проблема заключается в том, что PDFBox предполагает, что он может просто обновить существующего потока внешнего вида при настройке.значение поля формы.На самом деле он должен заменить его, возможно, также словарь AP , если он оказывается косвенным, так как он также может использоваться совместно.

Обходной путь

Обходной путь в вашем случае - отбросить существующие пустые появления перед установкой поля:

field.getDictionary().removeItem(COSName.AP)
field.value = temp.toString()

(Возможно, эту строку можно сократить в Котлине до field.dictionary.removeItem(COSName.AP), но я почти ничего не знаю оKotlin ...)

Фоны

Можно задаться вопросом, допустима ли вообще конструкция, найденная здесь в исходном PDF (то есть потоки внешнего вида, совместно используемые несколькими текстовыми полями).Но на самом деле я не смог найти ничего, запрещающего это в спецификации PDF, напротив, следующий раздел об аннотациях в целом (виджеты полей формы - это специальные аннотации) может быть явно разрешен:

Aна данный словарь аннотаций следует ссылаться из массива Annots только одной страницы.Это требование применяется только к самому словарю аннотаций, но не к вспомогательным объектам, которые могут совместно использоваться несколькими аннотациями.

(как ISO 32000-1, так и ISO 32000-2, раздел 12.5.2 «Словари аннотаций»)

...