Как мне принудительно выполнить форматирование и вычисления в PDF при заполнении других полей с помощью iTextSharp?

StackOverflow https://stackoverflow.com/questions/470707

Вопрос

У меня есть PDF-форма с несколькими текстовыми полями.Значения, введенные в эти поля, используются для вычисления значений в других полях (вычисляемые поля доступны только для чтения).

Когда я открываю форму в Adobe Reader и заполняю поле, вычисленные поля автоматически пересчитываются заново.

Однако я использую iTextSharp для заполнения полей, сглаживания результирующей формы, а затем отправки сглаженной формы обратно пользователю через Интернет.

Эта часть работает просто отлично, за исключением того, что вычисляемые поля никогда не вычисляются.Я предполагаю, что, поскольку никакие пользовательские события (такие как нажатие клавиш, фокусировка или размытие) не запускаются, вычисления не выполняются.

Очевидно, что я мог бы удалить вычисления из заполняемой формы и выполнять их все на сервере по мере заполнения полей, но я бы хотел, чтобы заполняемой формой могли пользоваться как люди, так и сервер.

Кто-нибудь знает, как ускорить вычисления?

Редактировать:Я не чувствую здесь слишком большой любви к iText / iTextSharp...

Вот еще несколько деталей.Установка stamper.AcroFields.Значение GenerateAppearances равно true не помогает.

Я подумай ответ лежит где-то в действиях страницы, но я не знаю, как его запустить...

Это было полезно?

Решение

Пауло Соарес (один из основных разработчиков iText и текущий сопровождающий iTextSharp) говорит:

iText не прилагает никаких усилий для исправления вычисляемых полей, потому что в большинстве случаев это невозможно.PdfCopyFields имеет некоторую поддержку для этого, которая иногда работает, а иногда нет.

Другие советы

Я понял, как это сделать.Пожалуйста, смотрите мой ответ на вопрос stackoverflow:

Как обновить форматирование для невычисляемого поля и обновить вычисляемые поля в заполняемой форме PDF

Я обновил все вычисляемые поля моих PDF-файлов, вызвав метод javascript calculateNow для объекта Doc.

Согласно документации Adobe javascript this.calculateNow();

Принудительно вычисляет все поля расчета в текущем документе.

Когда форма содержит много вычислений, может возникнуть значительная задержка после ввода пользователем данных в поле, даже если это не поле вычисления.Одна из стратегий заключается в том, чтобы в какой-то момент отключить вычисления и снова включить их позже (см. пример).

Чтобы включить вызов javascript с помощью iTextSharp :

using (PdfReader pdfReader = new PdfReader(pdfTemplate))
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create)))
{
    // fill f1 field and more...
    AcroFields pdfFormFields = pdfStamper.AcroFields;
    pdfFormFields.SetField("f1", "100");
    //...

    // add javascript on load event of the pdf
    pdfStamper.JavaScript = "this.calculateNow();";
    pdfStamper.Close();
}

На стороне сервера посмотрите, есть ли ответ в вычисляемых полях.Если нет, подсчитайте их.

Как говорит Грег Херлман, вы должны выполнять вычисления самостоятельно на сервере.Это делается не просто для удобства, на самом деле для этого есть веская причина.

Любой файл, который есть у клиента, он может испортить.Я не знаю, для чего предназначены PDF-формы, но, скорее всего, это как-то связано с деньгами, поэтому существует вероятность того, что люди обманут, заставив вычисления показывать неверный результат.Если вы доверяете вычислениям, выполняемым на стороне клиента, у вас нет никакого способа обнаружить это.

Когда вы получаете PDF-форму от клиента, вам следует повторить все вычисления, чтобы убедиться в их правильности.Затем, если у вас также есть версии клиента для сравнения, вам следует проверить, не были ли они испорчены.

Не думаете, что ваши клиенты настолько ненадежны?Рад за вас, но доказательства расходятся во мнениях.Одним из моих первых приобщений к программированию было открытие сохраненных игр для SimCity, чтобы заработать больше денег.Если существует возможность каким-то образом обмануть, то в какой-то момент люди попробуют это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top