چگونه با فیلدهای Transitional در .NET کار کنیم
چگونه با فیلدهای گذرا در .NET کار کنیم
Aspose.Words FOSS برای .NET نمایانگر گروهی از انواع فیلدهای قدیمی Word — فیلدهای بارکد و تعداد کمی از فیلدهای سازگاری پیش از Open-XML — از طریق کلاسهای اختصاصی در Aspose.Words.Fields فضای نام، بهصورت غیررسمی نامیده شده transitional فیلدها در اینجا. این راهنما نشان میدهد چگونه آنها را پیدا، بخوانید و پیکربندی کنید. هر کلاس فیلد انتقالی از پایه Field نوع، همراه با عمومی Field شیئی که توسط Document.Range.Fields.
راهنمای گام به گام
مرحله ۱: یافتن فیلدهای گذرا در یک سند
Document.Range.Fields را فهرست کنید و Type هر فیلد (یک مقدار FieldType) را در مقابل ثابتهای مربوطه — FieldBarcode، FieldDisplayBarcode، FieldMergeBarcode، FieldBidiOutline، FieldEQ، FieldFootnoteRef یا FieldInfo — مقایسه کنید، سپس شیء عمومی Field را به کلاس مطابقتدهنده تبدیل (cast) کنید تا به ویژگیهای خاص آن دسترسی پیدا کنید. همیشه قبل از تبدیل Type را بررسی کنید: تبدیل به کلاس فیلد نادرست یک InvalidCastException ایجاد میکند.
مرحله ۲: پیکربندی فیلد DISPLAYBARCODE یا MERGEBARCODE
FieldDisplayBarcode (فیلد DISPLAYBARCODE) و FieldMergeBarcode (فیلد MERGEBARCODE که همچنین IMergeFieldSurrogate را برای ادغام ایمیل پیادهسازی میکند) مجموعهٔ یکسانی از ویژگیهای پیکربندی بارکد را به اشتراک میگذارند: BarcodeType، BarcodeValue، SymbolHeight، SymbolRotation، ScalingFactor، ForegroundColor، BackgroundColor، PosCodeStyle، CaseCodeStyle، ErrorCorrectionLevel، DisplayText، AddStartStopChar، و FixCheckDigit. اینها را بر روی نمونهٔ فیلد تنظیم کنید، سپس Update() را فراخوانی کنید تا Result قبل از ذخیرهٔ سند، پیکربندی جدید را منعکس کند.
مرحله ۳: خواندن دادههای فیلد BARCODE (پستی) قدیمی
FieldBarcode فیلد قدیمی BARCODE را پیادهسازی میکند که بهطور خاص فیلد بارکد پستی ایالات متحده (POSTNET) است نه یک بارکد چندمنظوره — این فیلد ویژگیهای BarcodeType/BarcodeValue را که در مرحلهٔ ۲ وجود دارد، به اشتراک نمیگذارد. در عوض، PostalAddress (آدرسی که بارکد آن را رمزگذاری میکند)، FacingIdentificationMark، IsUSPostalAddress و IsBookmark را در دسترس قرار میدهد. قبل از خواندن این ویژگیها، Field.Type را بهطور خاص در برابر FieldType.FieldBarcode بررسی کنید، زیرا تبدیل یک فیلد DISPLAYBARCODE یا MERGEBARCODE به FieldBarcode ویژگیهایی را که انتظار دارید نشان نمیدهد.
مرحله ۴: رندر کردن تصاویر بارکد با یک تولیدکنندهٔ سفارشی
این نسخهٔ FOSS دادههای فیلد بارکد را حمل میکند اما موتور رندر بارکد را شامل نمیشود. BarcodeParameters یک کانتینر عبوری است که تنظیمات را از هر یک از خانوادههای فیلد بارکد — ویژگیهای DISPLAYBARCODE/MERGEBARCODE از مرحلهٔ ۲ و ویژگیهای پستی از مرحلهٔ ۳ — در یک شیء واحد که به یک رندرر تحویل داده میشود، تجمیع میکند. IBarcodeGenerator را پیادهسازی کنید و GetBarcodeImage(parameters) و GetOldBarcodeImage(parameters) (قدیمی) را در دسترس بگذارید تا رندر واقعی تصویر فراهم شود؛ بدون پیادهسازی ارائهشده، فیلدهای بارکد فقط دادههای پیکربندی را حمل میکنند.
مرحله ۵: کار با فیلدهای سازگاری قدیمی
چهار کلاس دیگر کدهای فیلد قدیمیتری را پوشش میدهند که هنوز در فایلهای .docx قدیمی یافت میشوند. FieldBidiOutline فیلد BIDIOUTLINE را برای شمارهگذاری سرفصل راست به چپ پیادهسازی میکند و هیچ ویژگیای فراتر از سطح مشترک Field در دسترس قرار نمیدهد. FieldEQ فیلد معادلهٔ EQ را پیادهسازی میکند و علاوه بر آن AsOfficeMath() را برای تبدیل محتوای خود به شیء OfficeMath در دسترس میگذارد — این تبدیل تنها زمانی موفق میشود که فیلد واقعاً یک معادله را رمزگذاری کرده باشد. FieldFootnoteRef فیلد FOOTNOTEREF را پیادهسازی میکند که به یک علامت پاورقی یا یادداشت انتهایی ارجاع میدهد و همچنین هیچ ویژگیای فراتر از سطح مشترک Field در دسترس نمیگذارد. FieldInfo فیلد INFO را پیادهسازی میکند و از طریق ویژگیهای InfoType و NewValue، یک ویژگی اطلاعات-خلاصهٔ سند را میخواند یا مینویسد.
مرحله ۶: بهروزرسانی یا ثابتسازی مقدار یک فیلد گذارشی
هر کلاس فیلد انتقالی GetFieldCode() (متن کد پایه فیلد)، Update() (نتیجه را دوباره ارزیابی میکند)، Unlink() (فیلد را با آخرین نتیجه محاسبهشده بهعنوان متن ثابت جایگزین میکند) و Remove() (فیلد را حذف میکند) را به ارث میبرد. پس از تغییر پیکربندی هر فیلد، Update() را فراخوانی کنید تا Result تغییر را منعکس کند، و وقتی مقدار فعلی فیلد باید منجمد شود نه اینکه باز هم قابل محاسبه بماند، از Unlink() استفاده کنید.
مشکلات رایج و راهحلها
InvalidCastException هنگام تبدیل یک Field به یک کلاس فیلد انتقالی. غلط FieldType فرض شد. بررسی کنید Field.Type در مقابل تطبیق FieldType ثابت قبل از تبدیل.
یک DISPLAYBARCODE/MERGEBARCODE ویژگیهای فیلد پس از تبدیل گم شدهاند. فیلد به FieldBarcode بهجای FieldDisplayBarcode/FieldMergeBarcode (یا برعکس) — این کلاسها مجموعههای ویژگی متفاوتی را نمایش میدهند حتی اگر هر سه دادههای بارکد را نشان دهند. تأیید کنید Field.Type قبل از ریختن.
فیلدهای بارکد دادهها را حمل میکنند اما هیچ تصویری رندر نمیشود. خیر IBarcodeGenerator پیادهسازی ارائه شد. یک ژنراتور سفارشی که این پیادهسازی را انجام میدهد فراهم کنید GetBarcodeImage(parameters) — این نسخه موتور رندر بارکد داخلی را شامل نمیشود.
FieldEQ.AsOfficeMath() نتایج غیرمنتظرهای برمیگرداند. فیلد حاوی دستور معادلهٔ معتبری نیست. محتویات فیلد را بررسی کنید GetFieldCode() خروجی را پیش از انجام تبدیل بررسی کنید.
FieldInfoمقدار آن پس از تنظیم بهروز نمیشود NewValue. فیلد پس از تغییر تازهسازی نشد. فراخوانی کنید Update() بر روی فیلد پس از تغییر NewValue.
سوالات متداول
کلمه «transitional» برای این انواع فیلد چه معنی دارد؟
این اصطلاح رسمی مایکروسافتورد نیست — این گروهبندی کلاسهای فیلد را در فضاینام Aspose.Words.Fields این نسخه انجام میدهد که کدهای فیلد قدیمی (فیلدهای بارکد و فیلدهای سازگاری پیش از Open-XML) را از طریق کلاسهای قوینوع خود پیادهسازی میکند، نه اینکه فقط از طریق شیء عمومی Field مدیریت شوند.
آیا FieldBarcode از همان ویژگیها بهعنوان FieldDisplayBarcode استفاده میکند؟
خیر. FieldBarcode فیلد BARCODE (postal/POSTNET) که منسوخ شده را پیادهسازی میکند و PostalAddress، FacingIdentificationMark، IsUSPostalAddress و IsBookmark را در دسترس قرار میدهد. FieldDisplayBarcode و FieldMergeBarcode مجموعه ویژگی متفاوتی دارند — BarcodeType، BarcodeValue، SymbolHeight و تنظیمات رندر مرتبط.
آیا این نسخه تصاویر بارکد را رندر میکند؟
خیر. FieldBarcode، FieldDisplayBarcode و FieldMergeBarcode دادههای پیکربندی بارکد را نگه میدارند و رابط IBarcodeGenerator را در دسترس میگذارند، اما هیچ موتور رندر بارکد در این نسخه گنجانده نشده است — برای تولید تصویر نیاز به یک پیادهسازی سفارشی IBarcodeGenerator است.
آیا میتوانم یک فیلد EQ را به یک معادله OfficeMath تبدیل کنم؟
بله، از طریق FieldEQ.AsOfficeMath()، به شرطی که کد فیلد واقعاً یک معادله را رمزگذاری کند.
چگونه میتوانم تمام فیلدهای گذار را در یک سند پیدا کنم؟
مجموعه Document.Range.Fields را فهرست کنید و هر Field.Type را در برابر ثابتهای مرتبط FieldType مقایسه کنید (FieldBarcode, FieldDisplayBarcode, FieldMergeBarcode, FieldBidiOutline, FieldEQ, FieldFootnoteRef, FieldInfo).