Làm cho hình dạng tách rời khỏi một tài liệu

Khi xử lý tài liệu, một nhiệm vụ phổ biến là trích xuất tất cả các hình ảnh được tìm thấy trong tài liệu và xuất chúng đến một vị trí bên ngoài. Nhiệm vụ này trở nên đơn giản với Aspose.Words API, mà đã cung cấp chức năng để trích xuất và lưu dữ liệu hình ảnh. Tuy nhiên, đôi khi bạn có thể muốn trích xuất các loại nội dung đồ họa khác nhau được đại diện bằng một đối tượng vẽ khác nhau, ví dụ, một hộp văn bản chứa các đoạn văn, hình mũi tên và một hình ảnh nhỏ. Không có cách nào đơn giản để biểu diễn đối tượng này vì nó là sự kết hợp của các phần tử nội dung riêng lẻ. Bạn cũng có thể gặp một trường hợp mà nội dung đã được nhóm vào một đối tượng trông giống như một hình ảnh duy nhất.

Aspose.Words" cung cấp chức năng để chiết xuất loại nội dung này theo cách mà bạn có thể trích xuất hình ảnh đơn giản từ hình dạng dưới dạng nội dung đã tạo sẵn. Bài viết này mô tả cách sử dụng chức năng để tạo hình dạng độc lập với tài liệu.

Các loại hình trong Aspose.Words

Tất cả nội dung trong một lớp ghi hình tài liệu là đại diện bởi Shape hoặc GroupShape nút trong Aspose.Words Tài liệu Đối tượng Mô-đun (DOM). Những nội dung đó có thể là hộp văn bản, hình ảnh, AutoShapes, các đối tượng OLE, v.v… Một số trường cũng được nhập làm hình dạng, ví dụ như trường INCLUDEPICTURE.

Một hình ảnh đơn giản được biểu diễn bởi một Shape của ShapeType.Image. Node hình dạng này không có các nút con nhưng dữ liệu hình ảnh được chứa trong node hình dạng này có thể truy cập bằng thuộc tính Shape.ImageData. Mặt khác, một hình dạng cũng có thể được tạo ra từ nhiều nút con. Ví dụ như một hình dạng hộp văn bản, được thể hiện bằng thuộc tính ShapeType.TextBox, có thể được tạo nên từ nhiều nút, chẳng hạn như ParagraphTable. Hầu hết hình dạng có thể bao gồm các nút khối ParagraphTable. Đây là các nút như xuất hiện trong phần chính. Các hình dạng luôn là một phần của các đoạn văn, hoặc được đưa trực tiếp vào dòng hoặc neo đến Đoạn", nhưng “lơ lửng” ở bất cứ nơi nào trên trang tài liệu.

rendering-shapes-separately-from-a-document-aspose-words-java-1

Tài liệu cũng có thể chứa các hình dạng được nhóm lại với nhau. Grouping có thể được kích hoạt trong Microsoft Word bằng cách chọn nhiều đối tượng và nhấp vào “Group” trong trình đơn chuột phải.

rendering-shapes-separately-from-a-document-aspose-words-java-2

Trong Aspose.Words, các nhóm hình dạng này được thể hiện bởi GroupShape nút. Những lệnh này cũng có thể được gọi theo cách tương tự để hiển thị toàn bộ nhóm trên hình ảnh.

rendering-shapes-separately-from-a-document-aspose-words-java-3

Định dạng DOCX có thể chứa những loại hình ảnh đặc biệt, như biểu đồ hay bảng biểu. Những hình dạng này cũng được thể hiện thông qua nút Shape trong Aspose.Words, cung cấp một phương pháp tương tự để hiển thị chúng dưới dạng hình ảnh. Theo thiết kế, hình dạng không thể chứa một hình dạng khác làm con của nó trừ khi hình dạng đó là hình ảnh ShapeType.Image. Ví dụ như Microsoft Word không cho phép bạn chèn một hộp văn bản bên trong một hộp văn bản khác.

Các kiểu hình được mô tả ở trên cung cấp một phương pháp đặc biệt để tạo ra các hình thông qua lớp ShapeRenderer. Một trường hợp của lớp ShapeRenderer được lấy lại cho một Shape hoặc GroupShape thông qua phương pháp GetShapeRenderer hoặc bằng cách truyền Shape đến hàm tạo của lớp ShapeRenderer. Lớp này cung cấp quyền truy cập vào các thành viên cho phép hiển thị một hình dạng với nội dung sau:

  • Tập tin trên đĩa sử dụng phương pháp Save quá tải
  • Stream bằng phương thức Save quá tải
  • Đối tượng đồ họa bằng cách sử dụng phương pháp RenderToSizeRenderToScale

Đặt lại cho tập tin hoặc luồng

Phương pháp Save cung cấp các biến thể để tạo ra hình dạng trực tiếp vào một tập tin hoặc luồng. Cả hai phương thức quá tải đều chấp nhận một trường hợp của lớp ImageSaveOptions, cho phép định nghĩa các tùy chọn để hiển thị hình dạng. Điều này hoạt động theo cách như phương pháp Document.Save Mặc dù tham số này là bắt buộc, bạn có thể truyền giá trị rỗng, chỉ ra rằng không có tùy chọn tùy chỉnh nào.

Hình dạng có thể được xuất ra theo bất kỳ định dạng hình ảnh nào đã chỉ định trong việc tính toán SaveFormat. Ví dụ hình ảnh có thể được hiển thị dưới dạng một hình ảnh raster như JPEG bằng cách chỉ định SaveFormat.Jpeg enumeraion hoặc dưới dạng hình ảnh vector như EMF bằng cách chỉ định SaveFormat.Emf.

Mã ví dụ bên dưới minh họa việc vẽ một hình dạng vào một hình ảnh EMF riêng biệt từ tài liệu và lưu vào đĩa:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
ShapeRenderer r = shape.getShapeRenderer();
// Define custom options which control how the image is rendered. Render the
// shape to the JPEG raster format.
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.EMF);
imageOptions.setScale(1.5f);
// Save the rendered image to disk.
r.save(dataDir + "TestFile.RenderToDisk_Out.emf", imageOptions);

Mã ví dụ dưới đây minh họa việc hiển thị một hình dạng trong một tập tin ảnh JPEG riêng biệt từ tài liệu và lưu vào một luồng":

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
ShapeRenderer r = new ShapeRenderer(shape);
// Define custom options which control how the image is rendered. Render the
// shape to the vector format EMF.
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.JPEG);
// Output the image in gray scale
imageOptions.setImageColorMode(ImageColorMode.GRAYSCALE);
// Reduce the brightness a bit (default is 0.5f).
imageOptions.setImageBrightness(0.45f);
FileOutputStream stream = new FileOutputStream(dataDir + "TestFile.RenderToStream_Out.jpg");
// Save the rendered image to the stream using different options.
r.save(stream, imageOptions);

Lớp ImageSaveOptions cho phép bạn chỉ định một loạt các tùy chọn để điều khiển cách thức tạo hình ảnh. Chức năng được mô tả ở trên có thể được áp dụng theo cùng một cách đối với các nút GroupShapeShape.

Hiển thị đến một Graphics Đối tượng

Hiển thị trực tiếp đến một Graphics đối tượng cho phép bạn định nghĩa các cài đặt và trạng thái của riêng bạn đối với đối tượng Graphics. Một tình huống phổ biến liên quan đến việc tạo hình dạng trực tiếp vào một đối tượng Graphics được lấy từ một Windows Form hoặc Bit map. Khi nút Shape được hiển thị, các thiết lập sẽ ảnh hưởng đến hình dáng xuất hiện. Ví dụ, bạn có thể xoay hoặc mở rộng hình dạng bằng cách sử dụng phương pháp RotateTransform hoặc ScaleTransform cho đối tượng Graphics.

Ví dụ dưới đây cho thấy cách kết xuất một hình dạng trên một Graphics đối tượng riêng biệt từ tài liệu và áp dụng xoay lên hình ảnh được kết xuất:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
// The shape renderer is retrieved using this method. This is made into a
// separate object from the shape as it internally
// caches the rendered shape.
ShapeRenderer r = shape.getShapeRenderer();
// Find the size that the shape will be rendered to at the specified scale and
// resolution.
Dimension shapeSizeInPixels = r.getSizeInPixels(1.0f, 96.0f);
// Rotating the shape may result in clipping as the image canvas is too small.
// Find the longest side
// and make sure that the graphics canvas is large enough to compensate for
// this.
int maxSide = Math.max(shapeSizeInPixels.width, shapeSizeInPixels.height);
BufferedImage image = new BufferedImage((int) (maxSide * 1.25), (int) (maxSide * 1.25),
BufferedImage.TYPE_INT_ARGB);
// Rendering to a graphics object means we can specify settings and
// transformations to be applied to
// the shape that is rendered. In our case we will rotate the rendered shape.
Graphics2D gr = (Graphics2D) image.getGraphics();
// Clear the shape with the background color of the document.
gr.setBackground(shape.getDocument().getPageColor());
gr.clearRect(0, 0, image.getWidth(), image.getHeight());
// Center the rotation using translation method below
gr.translate(image.getWidth() / 8, image.getHeight() / 2);
// Rotate the image by 45 degrees.
gr.rotate(45 * Math.PI / 180);
// Undo the translation.
gr.translate(-image.getWidth() / 8, -image.getHeight() / 2);
// Render the shape onto the graphics object.
r.renderToSize(gr, 0, 0, shapeSizeInPixels.width, shapeSizeInPixels.height);
ImageIO.write(image, "png", new File(dataDir + "TestFile.RenderToGraphics_out.png"));
gr.dispose();

Tương tự, RenderToSize phương pháp, RenderToSize phương pháp thừa hưởng từ NodeRendererBase hữu ích trong việc tạo các hình thu nhỏ của nội dung tài liệu. Kích thước hình dạng được chỉ định thông qua phương thức khởi tạo. Phương pháp RenderToSize chấp nhận đối tượng Graphics, tọa độ X và Y của vị trí hình ảnh và kích thước hình ảnh (chiều rộng và chiều cao) sẽ được vẽ lên đối tượng Graphics.

The Shape có thể được kết xuất ở một quy mô nhất định bằng phương pháp ShapeRenderer.RenderToScale kế thừa từ lớp NodeRendererBase. Điều này tương tự với phương pháp Document.RenderToScale chấp nhận các tham số chính giống nhau. Sự khác biệt giữa hai phương pháp này là với phương pháp ShapeRenderer.RenderToScale, thay vì một kích thước thực, bạn chọn một giá trị float để điều chỉnh hình dạng trong khi hiển thị nó. Nếu giá trị float bằng 1.0 gây ra hình dạng được hiển thị ở 100% kích thước ban đầu của nó. Một giá trị nổi 0,5 sẽ giảm kích thước hình ảnh một nửa.

Hiển thị hình ảnh hình dạng

Lớp Shape đại diện cho các đối tượng ở lớp vẽ, chẳng hạn như hình mẫu, hộp văn bản, tự do, đối tượng OLE, kiểm soát ActiveX hoặc một bức tranh. Sử dụng lớp Shape, bạn có thể tạo hoặc sửa đổi các hình dạng trong một tài liệu Microsoft Word. Một tính chất quan trọng của một hình dạng là " ShapeType. Hình dạng khác nhau có thể có khả năng khác nhau trong tài liệu Word. Ví dụ chỉ hình ảnh và các hình dạng OLE mới có thể chứa các hình ảnh trong khi hầu hết các hình dạng còn lại chỉ có thể chứa văn bản.

Ví dụ sau cho thấy cách để tạo ra một hình ảnh hình dạng thành một hình ảnh JPEG, tách rời khỏi tài liệu và lưu nó vào đĩa

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
dataDir = dataDir + "TestFile.RenderShape_out.jpg";
// Save the Shape image to disk in JPEG format and using default options.
shape.getShapeRenderer().save(dataDir, null);

Lấy Kích thước Hình dạng

Lớp ShapeRenderer cũng cung cấp chức năng để lấy kích thước của hình dạng bằng pixel thông qua phương thức GetSizeInPixels. Phương pháp này chấp nhận hai tham số kiểu float (Single) – tỷ lệ và DPI, được sử dụng trong việc tính toán kích thước hình dạng khi hình dạng được hiển thị. Phương pháp trả về Size đối tượng chứa chiều rộng và chiều cao của kích thước tính toán được. Điều này hữu ích khi cần biết kích thước của hình dạng đã được tạo ra trước, ví dụ như khi tạo một Bitmap mới từ kết quả đầu ra đã được tạo ra.

Ví dụ dưới đây cho thấy cách tạo một đối tượng Bitmap và Graphics mới với chiều rộng và chiều cao của hình thức để được vẽ":

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
Point2D.Float shapeSizeInDocument = shape.getShapeRenderer().getSizeInPoints();
float width = shapeSizeInDocument.x; // The width of the shape.
float height = shapeSizeInDocument.y; // The height of the shape.
Dimension shapeRenderedSize = shape.getShapeRenderer().getSizeInPixels(1.0f, 96.0f);
BufferedImage image = new BufferedImage(shapeRenderedSize.width, shapeRenderedSize.height,
BufferedImage.TYPE_INT_RGB);
Graphics gr = image.getGraphics();
// Render shape onto the graphics object using the RenderToScale or RenderToSize
// methods of ShapeRenderer class.
gr.dispose();

Khi sử dụng các phương pháp RenderToSize hoặc RenderToScale, kích thước hình ảnh đã được hiển thị cũng được trả về trong đối tượng SizeF. Cái này có thể được gán cho một biến và sử dụng nếu cần thiết.

Tính SizeInPoints thuộc tính trả về kích thước hình dạng được đo bằng điểm (xem ShapeRenderer). Kết quả là một SizeF chứa chiều rộng và chiều cao.