تبدیل به فرمت صفحه ثابت
Aspose.Words موتور صفحه آرایی خود را پیاده سازی می کند. قبل از پرداختن به مشخصات آن، شایسته است ابتدا سند را در سطح بالایی مورد بحث قرار دهیم. وقتی به یک سند فکر میکنید، کاربران معمولاً تعدادی ورق کاغذ حاوی کلمات، تصاویر، جداول و نمودارها را تصور میکنند. اسناد می توانند انواع مختلفی داشته باشند، مانند متن، صفحات گسترده، اسلاید، نقشه های CAD، فلوچارت ها، و بنابراین، می توانند اساساً طرح بندی متفاوتی داشته باشند. اکثر برنامه ها اجازه ارسال اسناد به چاپگر را می دهند. این زمانی است که کاربر می تواند ظاهر نهایی سند را مشاهده کند.
نمایش یک سند در برنامه های مختلف
برنامه های مختلف مشاهده یا انتشار اسناد به کاربران اجازه می دهند اسناد با فرمت های خاص را باز کنند (Adobe Acrobat، XPS Viewer) و گاهی اوقات (Adobe InDesign) را ویرایش کنند. این برنامه ها معمولا اسنادی با فرمت “صفحه ثابت” تولید می کنند. چنین قالب سندی دقیقاً محل قرارگیری محتوای سند در هر صفحه را توصیف می کند. در داخل، فرمت PDF یا XPS حاوی توضیحاتی برای هر صفحه و همچنین دستورالعملهای ترسیمی است که طرحبندی محتوای صفحه را مشخص میکند. این شبیه به فرمتهای تصویر است، و توضیح میدهد که در کجا محتوا به صورت شطرنجی یا برداری نشان داده میشود.
در مقابل، برخی از برنامه های ویرایش متن از مشاهده صفحات یک سند پشتیبانی نمی کنند. به عنوان مثال، دفترچه یادداشت Microsoft از عملکردهای بسیار کمی غیر از نمایش، ویرایش و چاپ متن پشتیبانی می کند. نکته مهم در اینجا این است که چنین برنامههایی نه میتوانند صفحاتی از سند را نشان دهند و نه میتوانند به کاربر بگویند که چه تعداد از آنها چاپ میشوند، و فقط امکان مشاهده محتوای سند را فراهم میکنند. سند را می توان در قالب متن ساده ذخیره کرد و توسط بسیاری از برنامه های کاربردی دیگر باز شد. با استفاده از برنامهای که امکان مشاهده محتوای باینری یک فایل دلخواه را فراهم میکند، میتوان آنچه را که در فایل سند ذخیره میشود، مشاهده کرد - این فقط متن ساده است، هیچ چیز دیگری در آن وجود ندارد.
برنامههای ویرایش متن کمی پیچیدهتر، مانند Microsoft WordPad، سند را در Rich Text Format (RTF) ذخیره میکنند، که از عملکردهای قالببندی بیشتری مانند درج تصاویر، قالببندی کاراکتر، حاشیه پاراگراف و فاصلهگذاری پشتیبانی میکند. با این حال، فرمت RTF نیز فقط حاوی محتوای سند است و هیچ اطلاعاتی در مورد صفحات ندارد.
Microsoft Word پیشرفته ترین برنامه ویرایش متن در Windows امروزی است. این فایلها را با فرمت DOCX قالببندی میکند، که محتوای سند را بهطور منعطف و گسترده توصیف میکند، و به کاربران اجازه میدهد اندازه صفحه، جهت بخش سند را مشخص کنند، و بهعنوان یک برنامه WYSIWYG حتی صفحات سند را روی صفحه نمایش دهند. با این وجود، هنوز هیچ اطلاعاتی در مورد نحوه نمایش محتوای سند در صفحات موجود در فایل سند وجود ندارد. فایل سند فقط خود محتوا و رابطه اشیاء سند با یکدیگر را همراه با برخی محدودیت های هندسی توصیف می کند. در نتیجه، قبل از نمایش یک سند، Microsoft Word خودش آن اطلاعات را محاسبه می کند. اینجاست که یک صفحه آرایی وارد عمل می شود.
صفحه آرایی چیست؟
طرحبندی صفحه سند یک ساختار داده است، که محل قرارگیری یک شی خاص در صفحات را برای همه اشیاء سند توصیف میکند. علاوه بر این، از آنجایی که اشیا دارای ویژگی هایی هستند که بر ظاهر آنها تأثیر می گذارد، مانند اندازه فونت، سایه زدن یا جلوه های طراحی، شما نه تنها باید بدانید که شی در کجا قرار دارد، بلکه باید بدانید که چه ناحیه ای از صفحه را اشغال می کند و اینکه آیا آن را اشغال می کند یا خیر. برای چندین صفحه اعمال شود تا سایر اشیاء با همان ناحیه (ها) همپوشانی نداشته باشند.
Aspose.Words عملکرد صفحهآرایی را به صورت داخلی پیادهسازی میکند و به آن امکان میدهد تمام فرمتهای صفحه ثابت مانند PDF، XPS و فرمتهای مختلف تصویر را تولید کند. بدون صفحه آرایی، اطلاعات ذخیره شده در فایل سند صفحه ثابت در دسترس نخواهد بود و همه این فرمت ها پشتیبانی نمی شوند.
رابطه بین یک سند و یک صفحه آرایی بسیار ساده است. در حالی که یک سند محتوا را توصیف می کند، طرح صفحه مربوطه هندسه آن محتوا را توصیف می کند. توجه داشته باشید که یک صفحه آرایی بدون سند نمی تواند وجود داشته باشد زیرا محتوایی برای محاسبه هندسه وجود نخواهد داشت، اما یک سند می تواند بدون صفحه آرایی وجود داشته باشد. به عنوان مثال، هنگامی که یک سند DOCX به یک سند RTF تبدیل می شود، معمولاً نیازی به دانستن هندسه نیست، زیرا هیچ یک از فرمت ها آن را ذخیره نمی کند.
ایجاد صفحه آرایی
ایجاد یک صفحه آرایی می تواند یک روش پرهزینه باشد، هم از نظر سرعت و هم از نظر حافظه. این به چند دلیل است:
- سند ممکن است حجم زیادی از محتوا داشته باشد که ممکن است نیاز باشد در هزاران صفحه نمایش داده شود. هندسه هر شی در هر صفحه باید توضیح داده شود و منابع حافظه را مصرف کند.
- سند ممکن است قوانین زیادی داشته باشد که محدودیت هایی را در هندسه ایجاد می کند. ممکن است زمان محاسباتی قابل توجهی صرف شود تا اطمینان حاصل شود که هر محدودیتی برآورده شده است
- برخی از ویژگی های سند، به عنوان مثال، فیلد
NUMPAGES
، وابستگی های بازگشتی برای مقادیر ویژگی های آینده ایجاد می کنند، که در زمان محاسبه در دسترس نیستند. این منجر به محاسبات تکراری و افزایش زمان محاسبه می شود.
با توجه به دلایل ذکر شده، Aspose.Words طرح بندی صفحه را فقط در صورت لزوم ایجاد می کند. یک دلیل معمولی برای این امر درخواست ارائه صفحات سند یا به دست آوردن یک مقدار فیلد است که به اطلاعات موجود در طرح بندی صفحه بستگی دارد. یک دلیل کمتر واضح می تواند صادر کردن یک سند به HTML باشد. اگرچه HTML یک قالب صفحه ثابت نیست و هندسه اشیاء محتوا را توصیف نمی کند، همچنان از تصاویر پشتیبانی می کند. چنین تصاویری ممکن است به شکل اشکال ایجاد شده در Microsoft Word با یک متن در داخل آنها باشند. به عنوان مثال، یک نمودار با برچسب های محور را می توان به عنوان یک تصویر به HTML صادر کرد، اما قبل از انجام این کار، Aspose.Words باید آن تصویر را رندر کند و از این رو باید بداند که در کجا برچسب را نمایش دهد. نمونه نمودار زیر را ببینید:
خصوصیات غیر هندسی
علاوه بر مدیریت اطلاعات هندسی، یک صفحهآرایی مسئولیت محاسبه رنگها و سبکهای حاشیه را نیز بر عهده دارد. در Microsoft Word، رنگ متن را می توان به صورت خودکار مشخص کرد، به این معنی که انتخاب رنگ باید بر اساس رنگ سایه سلول یا پاراگراف، یا بر اساس رنگ صفحه، جایی که متن ظاهر می شود، باشد.
طرحبندی صفحه، مکان نمایش متن و محتوایی که در پشت آن نمایش داده میشود را محاسبه میکند و محاسبه رنگ را امکانپذیر میکند. محاسبات خاص دیگری نیز توسط صفحه آرایی انجام می شود. به عنوان مثال، یک حاشیه افقی در یک جدول به این بستگی دارد که آیا یک ردیف جدول در یک ستون از متن قرار دارد یا خیر، و اینکه آیا در بین ستون ها شکسته شده است یا خیر. اگر یک ردیف در یک ستون در آخر رندر شود، از حاشیه پایین به جای افقی استفاده می شود.
در Aspose.Words، کاربر میتواند درخواست کند که یک صفحهآرایی جدید بسازد یا طرح موجود را بهروزرسانی کند. هر دوی اینها را می توان با روش update_page_layout که توسط کلاس Document ارائه شده است انجام داد. اگر طرحبندی صفحه وجود نداشته باشد، اما به آن نیاز باشد (مثلاً وقتی سند به یک فرمت صفحه ثابت صادر میشود)، Aspose.Words به طور خودکار این روش را فراخوانی میکند. با این حال، اگر طرحبندی صفحه از قبل وجود داشته باشد، Aspose.Words از طرحبندی موجود استفاده میکند تا از مصرف منابع لازم برای بهروزرسانی آن جلوگیری کند. در این حالت، کاربر باید روش update_page_layout را فراخوانی کند تا از به روز بودن صفحه آرایی با مدل سند اطمینان حاصل کند.
ساختار پویا
فرآیند ایجاد صفحه آرایی شامل مراحل زیر است:
- Conversion - شمارش محتوای مدل سند و تهیه اشیاء طرح بندی مربوطه.
- Build - ترتیب اشیاء طرح بندی برای نمایش محتوای سند در صفحات.
- Reflow - به روز رسانی آرایش اشیاء برای ارضای محدودیت های هندسی.
- طرح بندی اشیاء طرح به ارائه صفحه ثابت و نهایی کردن اطلاعات رنگ.
- ساخت و جریان مجدد محتوای شکل - اگر سند حاوی اشکال با محتوای متن تودرتو باشد، مرحله ای لازم است.
توجه داشته باشید که طرح صفحه یک ساختار پویا است که می تواند تا حدی بازسازی شود. این امر به ویژه زمانی مورد نیاز است که محاسبه مقادیر فیلد بدون بازسازی ساختار طرحبندی سند غیرممکن باشد. فیلد می تواند به مکان یک شی در یک صفحه اشاره کند و در عین حال خود مقدار فیلد نیز در صفحه نمایش داده می شود که بر مکان شی ارجاع شده تأثیر می گذارد. یک طرحبندی صفحه را نمیتوان یکباره ساخت، زیرا ممکن است مقادیر فیلد در زمان موقعیتیابی روی صفحه هنوز در دسترس نباشد.
زمانی که فیلد NUMPAGES
در پاورقی صفحه اول سند ظاهر می شود، سناریوی معمولی را در نظر بگیرید. مقدار این فیلد تعداد کل صفحات است. برای قرار دادن فیلد در یک صفحه، باید مقدار آن مشخص باشد. اگر فقط صفحه اول در حال حاضر ساخته می شود، تعداد کل صفحات هنوز مشخص نیست. در این حالت، صفحه آرایی باید از مقدار پیش فرض استفاده کند و بعداً به آن فیلد برگردد و مقدار آن را مطابق محاسبات واقعی تغییر دهد. با این حال، تغییر مقدار فیلد ممکن است بر محتوای سند دیگر در یک صفحه تأثیر بگذارد و در نهایت باعث شود یک صفحه جدید اضافه شود یا صفحه موجود حذف شود، بنابراین مقدار محاسبه شده قدیمی شود. این مشکل را می توان با ایجاد امکان به روز رسانی صفحه بندی موجود حل کرد.
هنگام ایجاد یک طرح، همچنین می توان ویژگی های LayoutOptions را تنظیم کرد که بر خروجی سند در صفحات تأثیر می گذارد.
ذخیره به فرمت صفحه ثابت
پس از ساخته شدن صفحه آرایی و محاسبه هندسه اشیا و موقعیت آنها در صفحه، سند را می توان در قالب صفحه ثابت که توسط Aspose.Words پشتیبانی می شود ذخیره کرد. هنگام ذخیره اسناد در قالبهای صفحه ثابت، میتوان از گزینههای رندر مشترک برای همه این قالبها استفاده کرد. آنها اجازه می دهند تا کنترل کنند:
- تعداد و محدوده صفحات موجود در سند خروجی (page_set).
- مجموعه ای از کاراکترهایی که برای رندر اعداد (numeral_format) استفاده می شوند.
- پخش کننده متافایل (metafile_rendering_options). برای جزئیات بیشتر به مقاله مدیریت متافایل های Windows مراجعه کنید.
- نرخ کیفیت برای فشرده سازی مجدد تصاویر JPEG، که مقدار آن ممکن است کمی متفاوت باشد، بسته به فرمت ذخیره انتخاب شده (jpeg_quality).
- بهینه سازی گرافیک برداری در خروجی Aspose.Words (optimize_output).
- گزینه های گرافیکی هنگام ذخیره در فرمت های Tiff، Png، Bmp، Jpeg، Emf (use_anti_aliasing، use_high_quality_rendering).
- ذخیره سند در مقیاس خاکستری (color_mode).
- جابجایی بین رندر اشکال DrawingML و اشکال بازگشتی (dml_rendering_mode).
- جابجایی بین حالت های رندر جلوه های DML (dml_effects_rendering_mode).
مثال زیر نحوه ذخیره یک سند را با فرمت JPEG با استفاده از روش save و گزینه های رندر نشان می دهد:
# Open the document
doc = aw.Document(docs_base.my_dir + "Rendering.docx")
# Save as a JPEG image file with default options
doc.save(docs_base.artifacts_dir + "Rendering.JpegDefaultOptions.jpg")
# Save document to stream as a JPEG with default options
docStream = io.BytesIO()
doc.save(docStream, aw.SaveFormat.JPEG)
# Rewind the stream position back to the beginning, ready for use
docStream.seek(0)
# Save document to a JPEG image with specified options.
# Render the third page only and set the JPEG quality to 80%
# In this case we need to pass the desired SaveFormat to the ImageSaveOptions constructor
# to signal what type of image to save as.
imageOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.JPEG)
imageOptions.page_index = 2
imageOptions.page_count = 1
imageOptions.jpeg_quality = 80
doc.save(docs_base.artifacts_dir + "Rendering.JpegCustomOptions.jpg", imageOptions)