كيف يمكنني فرض التنسيق والحسابات في PDF عند ملء الحقول الأخرى باستخدام itextSharp؟

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

سؤال

لدي نموذج PDF مع عدد من حقول النص. يتم استخدام القيم التي تم إدخالها في هذه الحقول لحساب القيم في الحقول الأخرى (الحقول المحسوبة هي قراءة فقط).

عندما أفتح النموذج في قارئ Adobe وأملأ حقلًا ، فإن الحقول المحسوبة تلقائيًا إعادة حساب.

ومع ذلك ، أنا أستخدم itextSharp لملء الحقول ، وتسوية النموذج الناتج ، ثم قم ببث النموذج المسطح مرة أخرى إلى المستخدم عبر الويب.

هذا الجزء يعمل بشكل جيد باستثناء الحقول المحسوبة لا تحسب أبدًا. أفترض أنه نظرًا لعدم وجود أحداث تسبب في أي مستخدم (مثل Keydowns أو Focus أو Blur) ، فإن الحسابات لا تحدث.

من الواضح أنه يمكنني إزالة الحسابات من النموذج القابل للملء والقيام بها جميعًا على الخادم أثناء ملء الحقول ، لكنني أرغب في أن يكون البشر قابلًا للملء من قبل البشر وكذلك الخادم.

هل يعرف أي شخص كيفية فرض الحسابات؟

تحرير: لا أشعر بالكثير من الحب/itextsharp الحب هنا ...

فيما يلي بعض التفاصيل. تعيين Stamper.Acrofields.Generateapperances إلى TRUE لا يساعد.

أنا فكر في تكمن الإجابة في مكان ما في إجراءات الصفحة ، لكنني لا أعرف كيفية تشغيلها ...

هل كانت مفيدة؟

المحلول

Paulo Soares (واحدة من devs الرئيسية لـ itext و sawner الحالي لـ itextsharp) يقول:

لا يبذل itext أي جهد لإصلاح الحقول المحسوبة لأنه في معظم الأحيان يكون ذلك مستحيلًا. PDFCOPYFIELDS لديها بعض الدعم لها الذي يعمل في بعض الأحيان وأحيانًا لا يعمل.

نصائح أخرى

لقد اكتشفت كيفية القيام بذلك. يرجى الاطلاع على إجابتي لسؤال Stackoverflow:

كيفية تحديث التنسيق على الحقل غير المحسوب وتحديث الحقول المحسوبة في نموذج PDF قابل للتعبئة

لقد قمت بتحديث جميع الحقول المحسوبة من PDFS الخاصة بي من خلال استدعاء طريقة 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 من العميل ، يجب عليك إعادة جميع الحسابات حتى تعرف أنها صحيحة. ثم إذا كان لديك أيضًا إصدارات العميل التي يمكن مقارنتها ، فيجب عليك التحقق مما إذا كانت قد تم ثملها.

ألا تعتقد أن عملائك غير جدير بالثقة؟ جيد لك ، لكن الأدلة لا توافق. كانت إحدى مقدماتي الأولى للبرمجة هي فتح SaveGames لـ SimCity لإعطاء نفسي المزيد من المال. إذا كانت الفرصة موجودة للغش بطريقة ما ، فسيحاول الناس ذلك في مرحلة ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top