Cách làm việc với Sections trong .NET
Hướng dẫn này chỉ ra cách tạo ngắt đoạn, cấu hình thiết lập trang, và quản lý tiêu đề, chân trang, cùng bố cục đa cột trong Aspose.Words FOSS cho .NET, sử dụng Section and PageSetup các lớp. Nó bao gồm việc đọc các đoạn đã có trong tài liệu, bắt đầu một đoạn mới bằng DocumentBuilder, cấu hình kích thước và lề trang, thêm các biến thể tiêu đề và chân trang, và bố trí văn bản thân trong nhiều cột.
Hướng dẫn từng bước
Bước 1: Cài đặt gói
Aspose.Words FOSS cho .NET hiện chưa phát hành gói NuGet – hãy build thư viện từ source thay thế. Clone https://github.com/aspose-words-foss/Aspose.Words-FOSS-for-.NET.git, sau đó build Aspose.Words.sln trong cấu hình Release bằng SDK .NET và tham chiếu tới assembly Aspose.Words kết quả từ dự án của bạn. Thư viện nhắm tới .NET Standard 2.0, vì vậy nó chạy trên .NET Framework 4.6.2+ và .NET 6/8/10.
Bước 2: Nhập các lớp cần thiết
Thêm một chỉ thị using Aspose.Words; – Section, PageSetup, HeaderFooter, và các enum liên quan được sử dụng trong hướng dẫn này đều nằm trực tiếp trong không gian tên Aspose.Words cùng với Document và DocumentBuilder.
Bước 3: Đọc các Phần đã có trong tài liệu
Document.Sections trả về một SectionCollection giữ mọi Section trong tài liệu, mỗi CompositeNode cũng là một phần của cây nút tổng thể. Document.FirstSection và Document.LastSection cung cấp quyền truy cập trực tiếp tới các phần biên giới mà không cần duyệt qua bộ sưu tập. Mỗi Section chứa một Body — được tiếp cận theo cùng cách như bất kỳ Story nào khác — và, nếu có, nội dung tiêu đề và chân trang được truy cập qua Section.HeadersFooters.
Bước 4: Bắt đầu một Phần mới với Dấu ngắt Phần
Call DocumentBuilder.InsertBreak(BreakType) tại con trỏ để bắt đầu một đoạn mới. Truyền BreakType.SectionBreakNewPage khi đoạn mới luôn phải bắt đầu trên một trang mới, BreakType.SectionBreakContinuous khi chỉ cần thay đổi thiết lập trang (ví dụ, chuyển sang văn bản đa cột) mà không ép buộc ngắt trang, hoặc BreakType.SectionBreakNewColumn, SectionBreakEvenPage, và SectionBreakOddPage cho các hành vi bắt đầu phần khác mà Word hỗ trợ. Một ngắt phần mang định dạng cho phần mà follows nó, vì vậy hãy đặt PageSetup các thuộc tính trên phần mới Section – không phải phần trước đó – ngay khi ngắt được chèn vào. DocumentBuilder.MoveToSection(sectionIndex) di chuyển con trỏ đến đầu phần thân cụ thể, và PageSetup.SectionStart đọc hoặc đặt SectionStart loại ngắt đã được ghi lại trên một phần hiện có.
Bước 5: Cấu hình Kích thước Trang và Lề
Mỗi Section.PageSetup là một thể hiện PageSetup. Đặt PageWidth, PageHeight, LeftMargin, RightMargin, TopMargin, BottomMargin và Gutter cho kích thước trang và lề, hoặc gán một cài đặt trước Margins trực tiếp cho PageSetup.Margins. Orientation và PaperSize kiểm soát hướng trang và kích thước giấy. Viền trang được cấu hình bằng Borders (một BorderCollection), BorderAppliesTo (PageBorderAppliesTo), BorderDistanceFrom (PageBorderDistanceFrom), BorderAlwaysInFront, BorderSurroundsHeader và BorderSurroundsFooter. Gọi PageSetup.ClearFormatting() để đặt lại cài đặt trang của một phần về mặc định trước khi cấu hình lại từ đầu.
Bước 6: Thêm và Liên kết Tiêu đề và Chân trang
Section.HeadersFooters là một HeaderFooterCollection với các accessor có kiểu – HeaderPrimary, HeaderFirst, HeaderEven, FooterPrimary, FooterFirst, FooterEven – cùng với GetByHeaderFooterType() để tra cứu bởi HeaderFooterType và Add() nhằm thêm một mục mới. Mỗi HeaderFooter là một Story, được đánh dấu IsHeader và IsLinkedToPrevious. Kích hoạt PageSetup.DifferentFirstPageHeaderFooter hoặc PageSetup.OddAndEvenPagesHeaderFooter trước khi thêm biến thể tương ứng HeaderFirst/FooterFirst hoặc HeaderEven/FooterEven — cờ và biến thể chỉ có hiệu lực khi cùng xuất hiện. Gọi HeaderFooterCollection.LinkToPrevious() để kết nối lại tiêu đề hoặc chân trang của một phần để kế thừa nội dung của phần trước, hoặc để tách nó ra sao cho phần mới bắt đầu với nội dung độc lập.
Bước 7: Bố trí văn bản thân trong nhiều cột
PageSetup.TextColumns trả về một TextColumnCollection cho phần. Gọi SetCount() với số cột mà văn bản thân nên chảy vào, sau đó điều chỉnh EvenlySpaced, Spacing, LineBetween và Width để kiểm soát cách bố trí các cột. Khi bộ sưu tập chứa nhiều hơn một cột, các thể hiện TextColumn riêng lẻ sẽ hiển thị Width và SpaceAfter của chúng.
Bước 8: Xóa hoặc Chỉnh sửa Hàng loạt Nội dung Phần
Section.AppendContent() và PrependContent() sao chép nội dung thân của một phần khác vào phần này; ClearContent() xóa toàn bộ nội dung thân của một phần một cách hàng loạt. ClearHeadersFooters() và DeleteHeaderFooterShapes() xóa nội dung tiêu đề và chân trang trên toàn bộ phần mà không xóa phần đó.
Các vấn đề thường gặp và cách khắc phục
Cài đặt trang của phần mới không khớp với những gì tôi đã đặt PageSetup đã được đặt trên sai Section phiên bản. Một dấu ngắt phần mang định dạng cho phần tiếp theo – đặt PageSetup trên phần đến sau InsertBreak(), không phải phần trước đó.
Nội dung tiêu đề hoặc chân trang từ phần trước bất ngờ xuất hiện trong phần mới Tiêu đề hoặc chân trang của phần mới vẫn được liên kết với phần trước. Gọi HeaderFooterCollection.LinkToPrevious(false), hoặc thêm nội dung tiêu đề/chân trang riêng cho phần mới, để ngắt liên kết.
Tiêu đề/chân trang trang đầu hoặc trang chẵn bị bỏ qua DifferentFirstPageHeaderFooter or OddAndEvenPagesHeaderFooter is false, hoặc sự khớp HeaderFooterType biến thể không tồn tại trong Section.HeadersFooters. Đặt cờ trên PageSetup và thêm biến thể tiêu đề/chân trang tương ứng lại với nhau.
Bố cục đa cột không áp dụng TextColumns.SetCount() được gọi với số đếm là một, hoặc trên phần sai của PageSetup. Gọi SetCount() với hơn một cột trên phần mục tiêu của PageSetup.TextColumns.
Section break được chèn ở vị trí tài liệu sai DocumentBuilder.InsertBreak(BreakType) chèn tại con trỏ hiện tại của builder. Sử dụng DocumentBuilder.MoveToSection() hoặc các thành viên định vị con trỏ khác của builder để định vị con trỏ trước khi InsertBreak().
Câu hỏi thường gặp
Làm thế nào để bắt đầu một phần mới mà không tạo trang mới?
Chèn một ngắt SectionBreakContinuous với DocumentBuilder.InsertBreak(BreakType.SectionBreakContinuous).
Làm thế nào để cấp cho một phần các lề và hướng riêng của nó?
Chèn một ngắt đoạn, sau đó đặt TopMargin, BottomMargin, LeftMargin, RightMargin, Orientation và PaperSize trên PageSetup của phần mới.
Làm thế nào để trang đầu tiên của một phần sử dụng tiêu đề khác?
Đặt PageSetup.DifferentFirstPageHeaderFooter = true cho phần đó, và thêm một HeaderFooter loại HeaderFirst (và FooterFirst, nếu cần) vào bộ sưu tập HeadersFooters của nó.
Làm thế nào để bố trí văn bản nội dung của một phần thành hai cột?
Gọi PageSetup.TextColumns.SetCount(2) trên phần, sau đó điều chỉnh Spacing, EvenlySpaced, hoặc các giá trị TextColumn.Width riêng lẻ khi cần.
Làm thế nào để truy cập trực tiếp vào các phần đầu tiên và cuối cùng?
Đọc Document.FirstSection và Document.LastSection thay vì lập chỉ mục vào Document.Sections.