Form Calculation Dependency Graph

HotPDF روی فیلدهای محاسباتی یک AcroForm بارگذاریشده یک گراف وابستگی میسازد تا یک تغییر مقدار، تنها محاسباتی را بازمحاسبه کند که آن را بهصورت گذرا میخوانند، به ترتیبی که هر مقدارِ بازمحاسبهشده از پیش برای محاسباتِ مصرفکنندهٔ آن دیدهمیشود

ساخت گراف

THotPDF.BuildLoadedFormCalculationGraph یک snapshot برمی‌گرداند که مالک آن فراخواننده است. هر فیلد یک node می‌شود؛ هر اسکریپت Calculate که در /CO ثبت شده با HPDFExtractSafeJavaScriptFieldReferences به‌صورت ایستا تحلیل می‌شود، که نام فیلدهایی را می‌خواند که یک اسکریپت زیرمجموعهٔ امن به آن‌ها دست می‌زند: آرگومان‌های داخل کوتیشن در AFSimple_Calculate("OP", ["a","b"]) و نام‌های داخل کوتیشن در دسترسی‌های getField("x")، و literalهای رشته‌ای نادیده گرفته می‌شوند تا اشاره‌های صرفاً متنی به‌عنوان ارجاع حساب نشوند

THPDFFormCalcGraph.ResolveLinks آن نامها را به یالهای منبع → وابسته حل کرده و هدفها را با یک مرتبسازی موضعی مرتب میکند. فیلدهای روی یک چرخهٔ وابستگی بهجای آن، ترتیب سند /CO را نگه میدارند که با معناشناسی یکپاسِ یک بازمحاسبهٔ کامل همخوان است؛ یک فیلد تغییرکرده هرگز اسکریپت خودش را بازمحاسبه نمیکند، بنابراین چرخهها نمیتوانند پینگ-پونگ کنند و یک مقدارِ نوشتهشده-توسط-کاربر همیشه برنده است. نامهای منبعی که با هیچ فیلدی تطبیق نمییابند از طریق UnresolvedFieldNameCount گزارش و هیچ یالی تولید نمیکنند، که بازتابِ حلکنندهٔ زمان اجراست

بازمحاسبهٔ افزایشی

RecalculateLoadedFormFieldsIncremental تنها بستارِ درگیر فیلدهای تغییرکردهٔ دادهشده را ارزیابی میکند. نوشتنها از طریق SetFormFieldValue و SetLoadedFormFieldValueByName یک مجموعهٔ کثیف انباشت میکنند؛ شکل بدون-پارامتر از آن مجموعه بازمحاسبه میکند، بنابراین یک ورود FDF یا XFDF و سپس یک پاس افزایشی، هر محاسبهٔ وابسته را بدون دست زدن به محاسبههای نامرتبط تازه میکند. هر دو شکل و پاس کامل RecalculateLoadedFormFields پس از آن مجموعهٔ کثیف را مصرف میکنند

PDF.LoadFromFile('Order.pdf');
PDF.SetLoadedFormFieldValueByName('qty', '3');
PDF.SetLoadedFormFieldValueByName('price', '19.5');
// Recomputes subtotal and total only, chained in one pass
PDF.RecalculateLoadedFormFieldsIncremental(['qty', 'price']);

بازرسی گراف

گراف وضعیت محاسبهٔ هر-فیلد (GetNode)، کل توالی ارزیابی (AllTargets)، بستار درگیر (AffectedTargets)، تعداد هدفهای روی چرخهها (CyclicTargetCount) و نامهای منبعِ حلنشده را در معرض قرار میدهد، بنابراین ابزارها میتوانند دقیقاً پیشنمایش کنند که یک ویرایش کدام محاسبات را فعال میکند