OpenXHTML là một thư viện trình bao cho SDK XML mở để chuyển đổi tài liệu HTML thành tài liệu từ Open XML. Nó chỉ đơn giản gói gọn sự phức tạp của Open XML nhưng lại phơi bày các thuộc tính của Open XML để thao tác
Cài đặt qua NuGet
Trong Bảng điều khiển quản lý gói, nhập lệnh sau
Install-Package MariGold.OpenXHTML
Cách sử dụng
Để tạo một tài liệu từ Open XML trống bằng OpenXHTML, hãy sử dụng đoạn mã sau
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.Save[];
Để tạo một tài liệu Open XML từ một tài liệu HTML, hãy sử dụng đoạn mã sau
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.Process[new HtmlParser["sample text"]]; doc.Save[];
Sau khi HTML được xử lý, bạn có thể truy cập tài liệu Open XML bằng các thuộc tính sau trong WordDocument
public WordprocessingDocument WordprocessingDocument { get; } public MainDocumentPart MainDocumentPart { get; } public Document Document { get; }
Mọi sửa đổi trên tài liệu Open XML phải được thực hiện trước phương thức Lưu. Điều này phải được thực hiện vì phương thức Lưu sẽ ghi tất cả các thay đổi và dỡ tài liệu khỏi bộ nhớ. Vì vậy, bất kỳ sửa đổi nào khác có thể dẫn đến một ngoại lệ. Ví dụ: nếu bạn muốn nối thêm một đoạn văn vào nội dung tài liệu, hãy thử đoạn mã sau
using MariGold.OpenXHTML; using DocumentFormat.OpenXml.Wordprocessing; WordDocument doc = new WordDocument["sample.docx"]; doc.Process[new HtmlParser["sample text"]]; doc.Document.Body.AppendChild[new Paragraph[new Run[new Text["added text"]]]]; doc.Save[];
Bạn cũng có thể tạo một tài liệu Open XML trong bộ nhớ. Ví dụ sau minh họa cách lưu tài liệu trong MemoryStream
using [MemoryStream mem = new MemoryStream[]] { WordDocument doc = new WordDocument[mem]; doc.Save[]; }
Hình ảnh tương đối
OpenXHTML không thể xử lý hình ảnh có URL tương đối. Điều này có thể được giải quyết bằng thuộc tính ImagePath để đặt địa chỉ cơ sở cho mọi đường dẫn hình ảnh tương đối. Đường dẫn hình ảnh có thể là URL hoặc địa chỉ thư mục vật lý
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.ImagePath = "\\abc.com"; doc.Process[new HtmlParser[""]]; doc.Save[];
Bạn cũng có thể gán bất kỳ địa chỉ URI tệp nào trên đường dẫn hình ảnh
doc.ImagePath = @"file:///C:/Img";
URL cơ sở
Giống như hình ảnh tương đối, tài liệu HTML cũng có thể chứa các liên kết có đường dẫn tương đối. Điều này có thể được giải quyết bằng thuộc tính BaseURL
________số 8
Ngoài ra, nếu có bất kỳ hình ảnh tương đối nào trong tài liệu html đã cho và ImagePath không được chỉ định, OpenXHTML sẽ cố gắng sử dụng BaseURL để giải quyết các đường dẫn hình ảnh tương đối. Vì vậy, sử dụng BaseURL, bạn có thể giải quyết cả đường dẫn và liên kết hình ảnh tương đối. Lý do tạo một thuộc tính riêng cho đường dẫn hình ảnh là đôi khi vị trí hình ảnh khác với địa chỉ URL cơ sở
Lược đồ Uri
Các URL tương đối của giao thức có thể được giải quyết bằng thuộc tính UriSchema
doc.UriSchema = Uri.UriSchemeHttp;
Phân tích cú pháp HTML
OpenXHTML có trình phân tích cú pháp HTML và CSS tích hợp [MariGold. HtmlParser] có thể được thay thế hoàn toàn bằng bất kỳ trình phân tích cú pháp HTML và CSS bên ngoài nào. Phương thức Process trong lớp WordDocument yêu cầu triển khai kiểu giao diện Iparser để xử lý HTML và CSS. Bạn có thể tạo triển khai giao diện IParser này để phân tích cú pháp HTML và CSS
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.Save[];0
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.Save[];1
Đây là cấu trúc của IParser. BaseURL và UriSchema chỉ là hai thuộc tính đơn giản để lưu trữ địa chỉ url cơ sở và lược đồ uri để xử lý các liên kết và hình ảnh HTML. Cả hai thuộc tính được sử dụng để giải quyết đường dẫn tương đối và tự do của giao thức của các URL biểu định kiểu bên ngoài. Phương pháp Tính toánRelativeChildFontSize được sử dụng để tính toán kích thước phông chữ con tương đối. Ví dụ: trong html bên dưới, kích thước phông chữ của thẻ h1 là 20 pixel
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.Save[];2
Nếu bạn không muốn triển khai lại chức năng này, bạn chỉ cần sử dụng lớp CSSUtility trong quá trình triển khai của mình
using MariGold.OpenXHTML; WordDocument doc = new WordDocument["sample.docx"]; doc.Save[];3
Phương thức FindBodyOrFirstElement dự kiến sẽ trả về một biểu diễn IHtmlNode của thẻ body html và cấu trúc phân cấp của các phần tử con của nó. Nếu tài liệu không có phần tử cơ thể, thì nó sẽ trả về phần tử gốc đầu tiên. Tất cả các kiểu CSS và thuộc tính HTML của IHtmlNode phải được giải quyết và điền vào các thuộc tính tương ứng