Cách Thêm Hình Vẽ Vào Tài Liệu Word trong .NET
Hướng dẫn này cho thấy cách thêm nội dung vào lớp vẽ của tài liệu Word bằng Aspose.Words FOSS cho .NET: chèn một AutoShape, thêm hình ảnh, định vị nó và bao quanh bằng văn bản, tô màu và tạo kiểu, nhóm nhiều hình, và thiết lập watermark. Aspose.Words FOSS cho .NET có sẵn qua NuGet hoặc bằng cách biên dịch từ nguồn.
Hướng Dẫn Từng Bước
Bước 1: Lấy Thư Viện
Sao chép kho lưu trữ và biên dịch Aspose.Words.sln trong cấu hình Release, sau đó thêm tham chiếu dự án tới Aspose.Words.csproj từ dự án .NET của bạn, như mô tả trong hướng dẫn cài đặt. Thêm using Aspose.Words; and using Aspose.Words.Drawing; ở đầu bất kỳ tệp nào làm việc với shapes.
Bước 2: Thêm một AutoShape
Tạo một hình trực tiếp bằng new Shape(doc, shapeType), trong đó shapeType là một giá trị ShapeType như Rectangle, Ellipse, Star, hoặc TextBox, sau đó chèn nó vào cây bằng DocumentBuilder.InsertNode(node). Shape là lớp cụ thể, sealed mà bạn tạo và cấu hình; nó kế thừa từ lớp trừu tượng ShapeBase, lớp này định nghĩa vị trí (Left, Top, Width, Height, Rotation) và các đối tượng phụ định dạng (Fill, Stroke, ShadowFormat, Glow, Reflection) được chia sẻ với GroupShape.
Bước 3: Thêm hình ảnh
DocumentBuilder.InsertImage là cách trực tiếp để thêm hình ảnh: các overload chấp nhận một Image, một đường dẫn tệp, một Stream, hoặc một mảng byte thô, với các overload bổ sung nhận các width/height rõ ràng hoặc các đối số vị trí đầy đủ (horzPos, left, vertPos, top, width, height, wrapType). Thuộc tính ImageData của Shape kết quả chứa dữ liệu hình ảnh — gọi ImageData.SetImage(...) để thay đổi hình ảnh, và sử dụng CropTop/CropBottom/CropLeft/CropRight, Brightness, Contrast, và GrayScale để điều chỉnh cơ bản.
Bước 4: Định vị hình dạng và bọc văn bản
Một hình dạng nội tuyến (kết quả mặc định của InsertImage) di chuyển cùng với văn bản xung quanh và bỏ qua các thuộc tính vị trí cho đến khi nó được đặt ở chế độ nổi — kiểm tra IsInline để xác nhận hình dạng đang ở chế độ nào. Để đặt một hình dạng nổi, đặt WrapType thành giá trị không phải nội tuyến và đặt RelativeHorizontalPosition / RelativeVerticalPosition (mỗi cái tương đối với Page, Margin, Column, hoặc một neo tương tự) cùng với các offset Left/Top. WrapSide điều khiển việc bọc theo phía cụ thể, và HorizontalAlignment / VerticalAlignment xử lý căn chỉnh tương đối đơn giản thay vì các offset rõ ràng.
Bước 5: Đổ màu và tạo kiểu cho hình dạng
Shape.Fill (một đối tượng Fill) tô bên trong của hình dạng: Fill.Solid(color) cho màu đồng nhất, Fill.OneColorGradient(...) / Fill.TwoColorGradient(...) cho gradient, Fill.Patterned(patternType) cho mẫu, và Fill.SetImage(...) cho việc đổ hình ảnh — FillType báo cáo cái nào hiện đang hoạt động. Đường viền được lấy từ thuộc tính Stroke. Đối với các hiệu ứng, ShadowFormat, Glow (GlowFormat), Reflection (ReflectionFormat), và SoftEdge (SoftEdgeFormat) mỗi cái đều tiết lộ các cài đặt riêng và một phương thức Remove() để xóa hiệu ứng về không.
Bước 6: Nhóm nhiều hình dạng
Kết hợp một số hình dạng thành một đơn vị duy nhất bằng DocumentBuilder.InsertGroupShape(shapes), hàm này trả về một GroupShape. GroupShape tự nó là một ShapeBase, vì vậy nó mang các Fill, ShadowFormat, Glow, và Reflection riêng của mình áp dụng cho toàn bộ nhóm; di chuyển hoặc thay đổi kích thước GroupShape thay vì các thành phần con riêng lẻ để phép biến đổi tọa độ của nhóm luôn nhất quán. Đối với một hình dạng chứa văn bản, Shape.TextBox (một đối tượng TextBox) kiểm soát khoảng đệm (InternalMarginLeft/Right/Top/Bottom), tự động thay đổi kích thước (FitShapeToText), hướng văn bản (LayoutFlow), và căn chỉnh dọc (VerticalAnchor).
Bước 7: Thêm Đánh Dấu Nước
Document.Watermark quản lý một watermark duy nhất trên toàn tài liệu, độc lập với bất kỳ hình dạng nào bạn đã chèn thủ công. Gọi Watermark.SetText(text) hoặc SetText(text, options) để tạo watermark văn bản, hoặc SetImage(...) để tạo watermark hình ảnh; Watermark.Remove() sẽ xóa nó, và Watermark.Type báo cáo WatermarkType hiện tại (Text, Image, hoặc None). TextWatermarkOptions thiết lập FontFamily, FontSize, Color, và Layout (WatermarkLayout.Horizontal hoặc Diagonal); ImageWatermarkOptions thiết lập Scale và IsWashout.
Các Vấn Đề Thường Gặp và Cách Khắc Phục
Setting Left/Top trên một shape không có hiệu ứng nào nhìn thấy được. Shape vẫn ở dạng inline (IsInline == true). Đặt WrapType đến một giá trị floating và đặt RelativeHorizontalPosition/RelativeVerticalPosition để các thuộc tính offset có hiệu lực.
Shape.ImageData ném ngoại lệ hoặc không trả về gì. Hình dạng không phải là hình ảnh. Kiểm tra Shape.HasImage trước khi đọc ImageData.
Các hình con của một nhóm không di chuyển cùng nhau. Các phần tử con đã được di chuyển vị trí riêng lẻ thay vì thông qua nhóm. Di chuyển hoặc thay đổi kích thước the GroupShape bản thân nó vì phép biến đổi tọa độ của nó áp dụng cho mọi phần tử con.
Văn bản watermark không sử dụng phông chữ được yêu cầu. Không TextWatermarkOptions đã được truyền. Gọi Watermark.SetText(text, options) với một TextWatermarkOptions đối tượng có FontFamily được thiết lập.
Câu hỏi thường gặp
Sự khác nhau giữa Shape và ShapeBase là gì?
ShapeBase là lớp cơ sở trừu tượng được chia sẻ bởi Shape và GroupShape. Viết mã dựa trên ShapeBase khi cần xử lý đồng nhất cả hai loại; sử dụng Shape trực tiếp cho các thành viên dành riêng cho một đối tượng vẽ duy nhất, chẳng hạn như ImageData.
Làm sao để chèn một hình ảnh với kích thước cụ thể?
Sử dụng một overload DocumentBuilder.InsertImage cho phép truyền các đối số width và height một cách rõ ràng, cùng với nguồn hình ảnh (một Image, đường dẫn tệp, Stream, hoặc mảng byte).
Làm sao để làm cho một hình dạng nổi thay vì nằm trong dòng văn bản?
Đặt WrapType của nó thành giá trị không phải dạng trong dòng và đặt RelativeHorizontalPosition / RelativeVerticalPosition sao cho các offset Left/Top được hiểu theo tương đối với trang, lề hoặc cột.
Có thể một tài liệu có đồng thời watermark văn bản và watermark hình ảnh không?
No. Document.Watermark.Type báo cáo loại watermark hiện tại; gọi SetText hoặc SetImage một lần nữa sẽ thay thế bất kỳ watermark nào đã được đặt trước đó.
Làm thế nào để tôi loại bỏ bóng hoặc phản chiếu khỏi một hình dạng?
Gọi Remove() trên đối tượng định dạng tương ứng — Shape.ShadowFormat.Remove() hoặc Shape.Reflection.Remove().