Lấy giới hạn đoạn văn từ bài thuyết trình trong PHP

Tổng quan

Bài viết này giải thích cách lấy giới hạn, kích thước và tọa độ của các đoạn văn trong Aspose.Slides. Nó cho thấy cách truy xuất hình chữ nhật của một đoạn văn từ một TextFrame bằng cách sử dụng Paragraph::getRect, cách lấy tọa độ đoạn văn bên trong khung văn bản của ô bảng, và nêu bật các chi tiết quan trọng như đơn vị đo, ảnh hưởng của việc gói văn bản đối với giới hạn, chuyển đổi sang pixel, và các giá trị định dạng đoạn văn “effective”.

Lấy tọa độ hình chữ nhật của một đoạn văn

Sử dụng Paragraph::getRect để lấy hình chữ nhật bao quanh một đoạn văn.

$presentation = new Presentation("Shapes.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shape = $slide->getShapes()->get_Item(0);
    $paragraph = $shape->getTextFrame()->getParagraphs()->get_Item(0);
    $rectangle = $paragraph->getRect();
} finally {
    $presentation->dispose();
}

Lấy kích thước của một đoạn văn bên trong khung văn bản ô bảng

Để lấy kích thước và tọa độ của một Paragraph trong khung văn bản ô bảng, sử dụng Paragraph::getRect. Hình chữ nhật trả về là tương đối so với khung văn bản ô bảng, vì vậy hãy cộng vị trí bảng và độ dịch ô khi bạn cần tọa độ ở mức slide.

Ví dụ sau lấy giới hạn của đoạn văn bên trong một ô bảng và vẽ các hình chữ nhật trên slide để hiển thị các giới hạn đó:

$presentation = new Presentation("source.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $table = $slide->getShapes()->get_Item(0);
    $cell = $table->getRows()->get_Item(1)->get_Item(1);

    $cellX = java_values($table->getX()) + java_values($cell->getOffsetX());
    $cellY = java_values($table->getY()) + java_values($cell->getOffsetY());

    foreach ($cell->getTextFrame()->getParagraphs() as $paragraph) {
        if ($paragraph->getText() == "") {
            continue;
        }

        $paragraphRectangle = $paragraph->getRect();
        $paragraphRectangleX = java_values($paragraphRectangle->getX()) + $cellX;
        $paragraphRectangleY = java_values($paragraphRectangle->getY()) + $cellY;
        $paragraphRectangleWidth = java_values($paragraphRectangle->getWidth());
        $paragraphRectangleHeight = java_values($paragraphRectangle->getHeight());

        $paragraphBoundsShape = $slide->getShapes()->addAutoShape(
            ShapeType::Rectangle,
            $paragraphRectangleX,
            $paragraphRectangleY,
            $paragraphRectangleWidth,
            $paragraphRectangleHeight
        );

        $paragraphBoundsShape->getFillFormat()->setFillType(FillType::NoFill);
        $paragraphBoundsShape->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->YELLOW);
        $paragraphBoundsShape->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
    }

    $presentation->save("output.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

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

Các tọa độ đoạn văn được đo bằng đơn vị nào?

Chúng được đo bằng điểm, trong đó 1 inch bằng 72 điểm. Điều này áp dụng cho tất cả các tọa độ và kích thước trên slide.

Việc gói văn bản có ảnh hưởng đến giới hạn của đoạn văn không?

Có. Nếu TextFrameFormat::setWrapText được bật cho TextFrame, văn bản sẽ bị ngắt để vừa với chiều rộng khu vực, gây thay đổi giới hạn thực tế của đoạn văn.

Có thể ánh xạ tọa độ đoạn văn sang pixel trong hình ảnh xuất ra một cách đáng tin cậy không?

Có. Chuyển đổi điểm sang pixel bằng công thức: pixel = điểm × (DPI / 72). Kết quả phụ thuộc vào DPI được chọn cho quá trình render hoặc xuất.

Làm thế nào để lấy các tham số định dạng đoạn văn “effective”, tính đến việc kế thừa kiểu?

Sử dụng cấu trúc dữ liệu định dạng đoạn văn effective; nó trả về các giá trị cuối cùng đã hợp nhất cho thụt lề, khoảng cách, gói văn bản, RTL và các thuộc tính khác.