Quản lý các đối tượng mực trong PowerPoint bằng Python qua Java

Giới thiệu

PowerPoint cung cấp tính năng mực cho phép bạn vẽ các nét tự do. Mực có thể được dùng để làm nổi bật các đối tượng khác, hiển thị các kết nối và quy trình, và thu hút sự chú ý đến các mục cụ thể trên một slide.

Aspose.Slides cung cấp các kiểu cần thiết để làm việc với các đối tượng mực. Ví dụ, lớp Ink đại diện cho một đối tượng mực trên slide.

Sự khác biệt giữa Đối tượng Thông thường và Đối tượng Mực

Các đối tượng trên một slide PowerPoint thường được biểu diễn bằng các đối tượng hình dạng. Ở dạng đơn giản nhất, một hình dạng là một container xác định vùng của chính đối tượng (khung) cùng với các thuộc tính như kích thước container, hình dạng và nền. Để biết thêm thông tin, xem Định dạng bố cục hình dạng.

Tuy nhiên, khi PowerPoint xử lý một đối tượng mực, nó bỏ qua tất cả các thuộc tính của khung đối tượng (container) ngoại trừ kích thước của nó. Kích thước của vùng container được xác định bằng các phương thức tiêu chuẩn Shape.getWidthShape.getHeight:

ink_powerpoint1

Dấu vết Mực

Một dấu vết mực là thành phần cơ bản được sử dụng để ghi lại quỹ đạo của bút khi người dùng viết mực số. Một dấu vết lưu trữ một chuỗi các điểm được kết nối.

Dạng mã hóa đơn giản nhất chỉ định tọa độ X và Y của mỗi điểm mẫu. Khi tất cả các điểm được kết nối và hiển thị, chúng tạo thành một hình ảnh như sau:

ink_powerpoint2

Thuộc tính Cọ để Vẽ

Cọ được sử dụng để vẽ các đường nối các điểm của một dấu vết mực. Cọ có màu và kích thước riêng, được đại diện bởi các phương thức InkBrush.getColorInkBrush.getSize.

Đặt Màu Cọ Mực

Đoạn mã Python sau cho thấy cách đặt màu cho một cọ mực:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, Ink

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("pres.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    ink = slide.getShapes().get_Item(0)
    if isinstance(ink, Ink):
        traces = ink.getTraces()
        if len(traces) > 0:
            brush = traces[0].getBrush()
            brush.setColor(Color.RED)
        else:
            print("The ink object has no traces.")
    else:
        print("The first shape is not an ink object.")
finally:
    presentation.dispose()

Đặt Kích thước Cọ Mực

Đoạn mã Python sau cho thấy cách đặt kích thước cho một cọ mực:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, Ink

Dimension = jpype.JClass("java.awt.Dimension")

presentation = Presentation("pres.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    ink = slide.getShapes().get_Item(0)
    if isinstance(ink, Ink):
        traces = ink.getTraces()
        if len(traces) > 0:
            brush = traces[0].getBrush()
            brush_size = Dimension(5, 10)
            brush.setSize(brush_size)
        else:
            print("The ink object has no traces.")
    else:
        print("The first shape is not an ink object.")
finally:
    presentation.dispose()

Thông thường, chiều rộng và chiều cao của cọ không bằng nhau, vì vậy PowerPoint không hiển thị kích thước cọ (phần dữ liệu tương ứng bị làm mờ). Khi chiều rộng và chiều cao của cọ bằng nhau, PowerPoint hiển thị kích thước của nó như sau:

ink_powerpoint3

Để làm rõ, hãy tăng chiều cao của đối tượng mực và xem lại các kích thước quan trọng:

ink_powerpoint4

Container (khung) không tính đến kích thước của các cọ — nó luôn giả định độ dày đường nét bằng 0 (xem hình ảnh trước).

Do đó, để xác định vùng hiển thị của toàn bộ đối tượng mực, phải tính đến kích thước cọ của các dấu vết. ở đây, đối tượng mục tiêu (dấu vết văn bản viết tay) đã được mở rộng tới kích thước của container (khung). Khi kích thước container thay đổi, kích thước cọ vẫn không đổi, và ngược lại.

ink_powerpoint5

PowerPoint sử dụng hành vi tương tự cho các đối tượng văn bản:

ink_powerpoint6

Kiểm soát Hiển thị Mực Khi Xuất và Khi Kết xuất

Aspose.Slides cung cấp lớp InkOptions để kiểm soát cách các đối tượng mực xuất hiện trong đầu ra đã xuất hoặc đã kết xuất. Bạn có thể sử dụng các thuộc tính của nó để ẩn hoàn toàn mực hoặc thay đổi cách các phép vận hành mặt nạ cọ mực được diễn giải.

Các tùy chọn mực có sẵn thông qua các tùy chọn xuất hoặc kết xuất cho một số loại đầu ra:

Đầu ra Thuộc tính tùy chọn mực
PDF PdfOptions.getInkOptions
HTML HtmlOptions.getInkOptions
SVG SVGOptions.getInkOptions
TIFF TiffOptions.getInkOptions
Ảnh slide RenderingOptions.getInkOptions

Các phương thức InkOptions sau công bố hai cài đặt giống nhau:

  • getHideInk xác định liệu các đối tượng mực có được bao gồm trong đầu ra hay không. Giá trị mặc định là False.
  • getInterpretMaskOpAsOpacity xác định liệu một phép vận hành mặt nạ có được diễn giải là độ mờ khi kết xuất cọ mực hay không. Giá trị mặc định là True; gọi setInterpretMaskOpAsOpacity với False để sử dụng phép ROP thay thế.

Ẩn Đối tượng Mực trong Đầu ra PDF

Mặc định, các đối tượng mực vẫn hiển thị khi xuất. Để tạo ra đầu ra sạch sẽ không có các chú thích viết tay hay nội dung mực khác, gọi InkOptions.setHideInk với True.

Ví dụ Python sau xuất một bản trình chiếu ra PDF đồng thời ẩn tất cả các đối tượng mực:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, PdfOptions, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    pdf_options = PdfOptions()
    pdf_options.getInkOptions().setHideInk(True)

    presentation.save("presentation_without_ink.pdf", SaveFormat.Pdf, pdf_options)
finally:
    presentation.dispose()

Ẩn Đối tượng Mực Khi Kết xuất Slide thành Ảnh

Để ẩn các đối tượng mực khi kết xuất các slide thành ảnh bitmap, cấu hình RenderingOptions.getInkOptions và truyền các tùy chọn kết xuất cho Slide.getImage.

Ví dụ Python dưới đây kết xuất slide đầu tiên thành ảnh PNG mà không có đối tượng mực:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, RenderingOptions, ImageFormat

presentation = Presentation("presentation.pptx")
try:
    rendering_options = RenderingOptions()
    rendering_options.getInkOptions().setHideInk(True)

    slide = presentation.getSlides().get_Item(0)
    image = slide.getImage(rendering_options)
    try:
        image.save("slide_without_ink.png", ImageFormat.Png)
    finally:
        image.dispose()
finally:
    presentation.dispose()

Kiểm soát Kết xuất Mặt nạ Mực

Cài đặt InkOptions.getInterpretMaskOpAsOpacity kiểm soát cách các phép vận hành mặt nạ được diễn giải khi kết xuất cọ mực. Giá trị mặc định là True, tức là sử dụng độ mờ. Để dùng phép ROP thay thế, gọi InkOptions.setInterpretMaskOpAsOpacity với False.

Ví dụ Python sau xuất một slide ra SVG và sử dụng kết xuất dựa trên ROP cho các phép vận hành mặt nạ mực:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions

FileOutputStream = jpype.JClass("java.io.FileOutputStream")

presentation = Presentation("presentation.pptx")
try:
    svg_options = SVGOptions()
    svg_options.getInkOptions().setInterpretMaskOpAsOpacity(False)

    stream = FileOutputStream("slide.svg")
    try:
        slide = presentation.getSlides().get_Item(0)
        slide.writeAsSvg(stream, svg_options)
    finally:
        stream.close()
finally:
    presentation.dispose()

Cài đặt tương tự cũng có thể được áp dụng qua TiffOptions.getInkOptions khi xuất bản trình chiếu hoặc kết xuất slide thành TIFF.

Chọn Ẩn hay Giữ lại Mực

Khi bạn cần một phiên bản sạch sẽ của bản trình chiếu có chú thích để phân phối mà không có dấu đánh giá, gọi InkOptions.setHideInk với True trong quá trình xuất.

Giữ InkOptions.getHideInk ở giá trị mặc định False khi các chú thích mực là một phần của nội dung dự định, chẳng hạn như bình luận đánh giá, ghi chú viết tay, tô sáng hoặc bản vẽ cần hiển thị trong kết quả xuất. Điều này cho phép các ứng dụng tạo ra các đầu ra đánh giá và cuối cùng riêng biệt từ cùng một bản trình chiếu mà không cần sửa đổi các đối tượng mực nguồn.

Câu hỏi thường gặp

Tôi có thể thay đổi màu hoặc kích thước của một nét mực đã tồn tại không?

Có. Lấy dấu vết từ Ink.getTraces, sau đó thay đổi InkTrace.getBrush. Gọi InkBrush.setColor hoặc InkBrush.setSize để thay đổi cọ.

Việc ẩn mực có thay đổi bản trình chiếu nguồn không?

Không. Gọi InkOptions.setHideInk chỉ ảnh hưởng đến kết quả đã xuất hoặc đã kết xuất; nó không loại bỏ hay sửa đổi các đối tượng mực trong bản trình chiếu nguồn.

Định dạng xuất nào hỗ trợ các tùy chọn mực?

Bạn có thể cấu hình tùy chọn mực cho PDF, HTML, SVG, TIFF và ảnh slide bitmap thông qua các tùy chọn xuất hoặc kết xuất tương ứng được liệt kê ở trên.

Đọc thêm