จัดการคำเตือนการนำเสนอใน PHP

ภาพรวม

Aspose.Slides สามารถรายงานปัญหาที่สามารถกู้คืนได้ขณะโหลด, เรนเดอร์, แปลง หรือบันทึกการนำเสนอ ตัวอย่างได้แก่เรคคอร์ดแหล่งที่เสียหาย, เนื้อหาที่ไม่สามารถคงไว้ได้, การแทนที่ฟอนท์, และข้อจำกัดของรูปแบบปลายทาง คอลแบ็กการแจ้งเตือนช่วยให้แอปพลิเคชันบันทึกเงื่อนไขเหล่านี้และตัดสินใจว่าปฏิบัติการปัจจุบันจะดำเนินต่อได้หรือไม่

สร้างคลาส PHP ที่มีเมธอดสาธารณะ warning และเปิดเผยผ่าน PHP Java Bridge เป็นอินเทอร์เฟส Java IWarningCallback โดยใช้ java_closure ตรวจสอบค่าที่ให้ผ่าน IWarningInfo โดยดูที่ getWarningType และ getDescription คืนค่า ReturnAction::Continue เพื่อยอมรับการแจ้งเตือนหรือ ReturnAction::Abort เพื่อหยุดการทำงาน

ใช้ LoadOptions::setWarningCallback สำหรับคำเตือนที่เกิดขณะเปิดการนำเสนอ การเรนเดอร์และคลาสตัวเลือกการส่งออกสืบทอดจาก SaveOptions::setWarningCallback ซึ่งรับคำเตือนจากการเรนเดอร์สไลด์, การแปลง, และการบันทึก เนื่องจากคำเตือนเองไม่ระบุการทำงานของแอปพลิเคชัน จึงควรผูกแต่ละอินสแตนซ์ของคอลแบ็กกับขั้นตอนการทำงานเมื่อสร้างรายงานรวม

คำเตือนและข้อยกเว้น

ข้อยกเว้นของ Java จะถูกเปิดเผยต่อ PHP ผ่าน PHP Java Bridge; ให้จับข้อยกเว้นที่ขอบเขตการทำงานตามตัวอย่างด้านล่าง ลิงก์อินเทอร์เฟส Java ในบทความนี้อธิบายสัญญาโครงสร้างคอลแบ็กที่ใช้โดยบริดจ์

คำเตือนอธิบายเงื่อนไขที่ Aspose.Slides สามารถกู้คืนได้หากคอลแบ็กคืนค่า ReturnAction::Continue ข้อยกเว้นหมายถึงการทำงานที่ร้องขอไม่สามารถสำเร็จได้ตามปกติ; ข้อยกเว้นจะไม่ถูกแปลงเป็นคำเตือนและไม่สามารถจัดการโดยนโยบายคำเตือนได้

การคืนค่า ReturnAction::Abort จะสั่งให้ตัวกระจายคำเตือนยุติปฏิบัติการปัจจุบันโดยการโยนข้อยกเว้น ข้อยกเว้นสาธารณะจะขึ้นอยู่กับการทำงานและรูปแบบการนำเสนอ ตัวอย่างเช่น การโหลดอาจทำให้เกิด PptxReadException หรือ PptReadException ในขณะที่การบันทึกหรือการส่งออกอาจทำให้เกิด PptxException ให้จัดการข้อยกเว้นที่ขอบเขตของการทำงานและใช้รายงานคำเตือนเพื่อตรวจสอบว่านโยบายของแอปพลิเคชันทำให้การยุติเกิดขึ้นหรือไม่ แทนการพึ่งพาชนิดข้อยกเว่นย่อยหรือข้อความคอลแบ็กจะบันทึกคำเตือนก่อนคืนค่า ReturnAction::Abort เพื่อให้เหตุผลยังคงพร้อมให้แอปพลิเคชันเข้าถึง

ประเภทคำเตือน

คลาส WarningType ให้ค่าคงที่จำนวนเต็มสำหรับประเภทต่อไปนี้:

ประเภทคำเตือน ความหมาย นโยบายโดยทั่วไป
SourceFileCorruption แหล่งการนำเสนอมีการเสียหายซึ่งอาจทำให้เอกสารที่บันทึกในรูปแบบเดิมไม่สามารถใช้ได้ ยกเลิก.
DataLoss ข้อความ, แผนภูมิ, รูปภาพ หรือข้อมูลอื่น ๆ อาจสูญหายหลังการโหลดหรือบันทึก ยกเลิก.
MajorFormattingLoss การนำเสนออาจสูญเสียการจัดรูปแบบที่สำคัญ ยกเลิกในโหมดตรวจสอบที่เข้มงวด; หากไม่ใช่ให้บันทึกและดำเนินต่อ.
MinorFormattingLoss อาจมีความแตกต่างในการจัดรูปแบบที่จำกัด บันทึกเพื่อการวินิจฉัยและดำเนินต่อ.
CompatibilityIssue ผลลัพธ์อาจไม่เปิดหรือทำงานอย่างถูกต้องในบางแอปพลิเคชันหรือเวอร์ชันเก่า บันทึกและดำเนินต่อ เว้นแต่ความเข้ากันได้เป็นสิ่งจำเป็น.
UnexpectedContent แหล่งที่มามีเนื้อหาที่ไม่รองรับหรือไม่รู้จักซึ่งผลกระทบยังไม่ทราบ บันทึกและดำเนินต่อ หรือถือเป็นข้อผิดพลาดในนโยบายที่เข้มงวด.

ประเภทควรเป็นตัวกำหนดการตัดสินใจเชิงนโยบาย เก็บค่าที่คืนจาก getDescription เพื่อการวินิจฉัย แต่ไม่ควรพึ่งพาข้อความนั้นในการตรึกตรองของแอปพลิเคชัน เนื่องจากข้อความอาจแตกต่างระหว่างสถานการณ์คำเตือนและเวอร์ชันของผลิตภัณฑ์

รวบรวมและจำแนกคำเตือน

ตัวอย่างต่อไปนี้ใช้รายงานระดับแอปพลิเคชันเดียวสำหรับขั้นตอนการประมวลผลทั้งหมด อินสแตนซ์คอลแบ็กแยกแต่ละขั้นตอนจะระบุคำเตือนจากการโหลด, การเรนเดอร์, การแปลงเป็น PDF, และการบันทึกเป็น PPTX นโยบายจะยกเลิกเมื่อพบการเสียหายของแหล่งหรือการสูญเสียข้อมูล, สามารถเลือกยกเลิกเมื่อมีการสูญเสียการจัดรูปแบบที่สำคัญ, และดำเนินต่อสำหรับคำเตือนอื่น ๆ คอลแบ็กจะแปลงค่าคำเตือนเป็นค่า PHP เนทีฟด้วย java_values ก่อนบันทึกและเปรียบเทียบ

use aspose\slides\ImageFormat;
use aspose\slides\LoadOptions;
use aspose\slides\PdfOptions;
use aspose\slides\PptxOptions;
use aspose\slides\Presentation;
use aspose\slides\RenderingOptions;
use aspose\slides\ReturnAction;
use aspose\slides\SaveFormat;
use aspose\slides\WarningType;

class WarningReport {
    private $entries = [];

    public function getEntries() {
        return $this->entries;
    }

    public function add($stage, $type, $description) {
        $this->entries[] = [
            "stage" => $stage,
            "type" => $type,
            "description" => $description
        ];
    }
}

class WarningPolicy {
    private $abortOnMajorFormattingLoss;

    public function __construct($abortOnMajorFormattingLoss) {
        $this->abortOnMajorFormattingLoss = $abortOnMajorFormattingLoss;
    }

    public function getAction($warningType) {
        if ($warningType === WarningType::SourceFileCorruption || $warningType === WarningType::DataLoss) {
            return ReturnAction::Abort;
        }

        if ($warningType === WarningType::MajorFormattingLoss && $this->abortOnMajorFormattingLoss) {
            return ReturnAction::Abort;
        }

        return ReturnAction::Continue;
    }
}

class ReportingWarningCallback {
    private $stage;
    private $report;
    private $policy;

    public function __construct($stage, WarningReport $report, WarningPolicy $policy) {
        $this->stage = $stage;
        $this->report = $report;
        $this->policy = $policy;
    }

    public function warning($warning) {
        $type = (int) java_values($warning->getWarningType());
        $description = (string) java_values($warning->getDescription());
        $this->report->add($this->stage, $type, $description);
        return $this->policy->getAction($type);
    }
}

function createWarningCallback($stage, WarningReport $report, WarningPolicy $policy) {
    $handler = new ReportingWarningCallback($stage, $report, $policy);
    $warningInterface = java("com.aspose.slides.IWarningCallback");
    return java_closure($handler, null, $warningInterface);
}

function processPresentation($inputPath, WarningReport $report, WarningPolicy $policy) {
    try {
        $loadOptions = new LoadOptions();
        $callback = createWarningCallback("Loading", $report, $policy);
        $loadOptions->setWarningCallback($callback);

        $presentation = new Presentation($inputPath, $loadOptions);
        try {
            if (!renderFirstSlide($presentation, $report, $policy)) {
                return false;
            }

            if (!convertToPdf($presentation, $report, $policy)) {
                return false;
            }

            return saveValidatedCopy($presentation, $report, $policy);
        } finally {
            $presentation->dispose();
        }
    } catch (Throwable $exception) {
        echo "Loading stopped: " . $exception->getMessage() . PHP_EOL;
        return false;
    }
}

function renderFirstSlide($presentation, WarningReport $report, WarningPolicy $policy) {
    if ((int) java_values($presentation->getSlides()->size()) === 0) {
        echo "Rendering stopped: the presentation has no slides." . PHP_EOL;
        return false;
    }

    try {
        $options = new RenderingOptions();
        $callback = createWarningCallback("Rendering", $report, $policy);
        $options->setWarningCallback($callback);

        $image = $presentation->getSlides()->get_Item(0)->getImage($options);
        try {
            $image->save("slide-1.png", ImageFormat::Png);
            return true;
        } finally {
            $image->dispose();
        }
    } catch (Throwable $exception) {
        echo "Rendering stopped: " . $exception->getMessage() . PHP_EOL;
        return false;
    }
}

function convertToPdf($presentation, WarningReport $report, WarningPolicy $policy) {
    try {
        $options = new PdfOptions();
        $callback = createWarningCallback("Conversion", $report, $policy);
        $options->setWarningCallback($callback);

        $presentation->save("converted.pdf", SaveFormat::Pdf, $options);
        return true;
    } catch (Throwable $exception) {
        echo "Conversion stopped: " . $exception->getMessage() . PHP_EOL;
        return false;
    }
}

function saveValidatedCopy($presentation, WarningReport $report, WarningPolicy $policy) {
    try {
        $options = new PptxOptions();
        $callback = createWarningCallback("Saving", $report, $policy);
        $options->setWarningCallback($callback);

        $presentation->save("validated-output.pptx", SaveFormat::Pptx, $options);
        return true;
    } catch (Throwable $exception) {
        echo "Saving stopped: " . $exception->getMessage() . PHP_EOL;
        return false;
    }
}

function warningTypeName($warningType) {
    switch ($warningType) {
        case WarningType::SourceFileCorruption:
            return "SourceFileCorruption";
        case WarningType::DataLoss:
            return "DataLoss";
        case WarningType::MajorFormattingLoss:
            return "MajorFormattingLoss";
        case WarningType::MinorFormattingLoss:
            return "MinorFormattingLoss";
        case WarningType::CompatibilityIssue:
            return "CompatibilityIssue";
        case WarningType::UnexpectedContent:
            return "UnexpectedContent";
        default:
            return "Unknown (" . $warningType . ")";
    }
}

$report = new WarningReport();
$policy = new WarningPolicy(true);
$completed = processPresentation("input.pptx", $report, $policy);

echo ($completed ? "Processing completed." : "Processing stopped.") . PHP_EOL;

foreach ($report->getEntries() as $entry) {
    $typeName = warningTypeName($entry["type"]);
    echo "[" . $entry["stage"] . "] " . $typeName . ": " . $entry["description"] . PHP_EOL;
}

ส่งค่า false ให้กับ abortOnMajorFormattingLoss เมื่อสร้าง WarningPolicy หากความแตกต่างของการจัดรูปแบบที่สำคัญเป็นที่ยอมรับ ปัญหาความเข้ากันได้, การสูญเสียการจัดรูปแบบเล็กน้อย, และเนื้อหาที่ไม่คาดคิดยังคงถูกบันทึกในรายงานแม้การทำงานจะดำเนินต่อ หากแอปพลิเคชันต้องปฏิเสธหนึ่งในหมวดเหล่านั้น ให้ขยาย WarningPolicy::getAction

สถานการณ์คำเตือนทั่วไป

คำเตือนสามารถปรากฏได้ในขั้นตอนต่าง ๆ ของเวิร์กโฟลว์:

  • ลายเซ็นดิจิทัล: การนำเสนอที่ลงลายเซ็นอาจให้คำเตือนในขั้นตอนการโหลดว่าลายเซ็นจะหายไประหว่างการประมวลผล Aspose.Slides รายงานเงื่อนไข DataLoss นี้ผ่าน IPresentationSignedWarningInfo คอลแบ็กระดับการโหลดช่วยให้แอปพลิเคชันปฏิเสธไฟล์หรือยอมรับการสูญเสียที่รายงานไว้โดยเจตนา
  • การแทนที่ฟอนท์: ฟอนท์ที่ไม่มีอยู่สามารถถูกแทนที่ขณะเรนเดอร์หรือตอนส่งออก คำเตือนการแทนที่ฟอนท์จะรายงานเป็น DataLoss ดังนั้นนโยบายเข้มงวดด้านบนจะยกเลิกแม้แอปพลิเคชันอาจพิจารณาการแทนที่นั้นว่าดูดี เพื่อตรวจสอบพฤติกรรมนี้ ให้ใช้การนำเสนอที่มีข้อความในฟอนท์ที่รันไทม์ไม่สามารถเข้าถึงได้ คำอธิบายของคำเตือนจะระบุการแทนที่; กำหนดฟอนท์ที่ต้องการหรือ กฎการแทนที่ฟอนท์ ก่อนลองใหม่
  • เนื้อหาที่ไม่รองรับหรือไม่คาดคิด: ตัวโหลดอาจพบเรคคอร์ดหรือฟีเจอร์ที่ไม่รู้จัก คำเตือนเหล่านี้อาจใช้ UnexpectedContent หรือหมวดที่รุนแรงกว่าเมื่อตรวจพบว่าข้อมูลหรือการจัดรูปแบบได้รับผลกระทบ
  • ความเข้ากันได้ของรูปแบบ: การบันทึกเป็นรูปแบบการนำเสนออื่นอาจตัดคุณลักษณะหรือทำให้ผลลัพธ์ทำงานแตกต่างในบางแอปพลิเคชัน ตัวอย่างเช่น การบันทึกการนำเสนอที่มีเส้นนำวาดแนวนอนหรือแนวตั้งมากกว่าหนึ่งแปดรายการใน PPT รุ่นเก่า จะรายงาน CompatibilityIssue คอลแบ็กระดับการบันทึกสามารถบันทึกการสูญเสียและดำเนินต่อ หรือปฏิเสธหากต้องการรักษาแนวนำวาดทั้งหมดไว้
  • พฤติกรรมการโหลด: ตัวเลือกการโหลดและพฤติกรรมเก่าอาจทำให้เกิดคำเตือนได้ ตัวอย่างเช่น IObsoletePresLockingBehaviorWarningInfo ระบุการใช้พฤติกรรมการล็อกการนำเสนอที่ล้าสมัยเป็น CompatibilityIssue

คำเตือนขึ้นอยู่กับเอกสารแหล่ง, รูปแบบปลายทาง, การดำเนินการ, และเวอร์ชันของ Aspose.Slides อย่าสมมติว่าทุกไฟล์จะสร้างคำเตือนหรือว่าสถานการณ์ใดจะสอดคล้องกับเพียงหนึ่งหมวดเท่านั้น

จัดการการดำเนินการที่ถูกยกเลิกอย่างปลอดภัย

เมื่อคอลแบ็กคืนค่า ReturnAction::Abort อย่าใช้วัตถุที่โหลดไม่สำเร็จและอย่าอ้างว่าเอาต์พุตการเรนเดอร์หรือการบันทึกครบสมบูรณ์ การดำเนินการอาจสิ้นสุดหลังจากสร้างไฟล์เอาต์พุตแล้วแต่ก่อนที่จะเสร็จสิ้นเต็มรูปแบบ

บันทึกผลลัพธ์ที่ตรวจสอบแล้วไปยังเส้นทางแยก เช่น validated-output.pptx ให้แทนที่การนำเสนอที่มีอยู่เฉพาะเมื่อการดำเนินการเสร็จสมบูรณ์อย่างไม่มีข้อผิดพลาด, รายงานคำเตือนสอดคล้องกับนโยบายแอปพลิเคชัน, และไฟล์เอาต์พุตสามารถเปิดและตรวจสอบได้ วิธีนี้จะหลีกเลี่ยงการเขียนทับไฟล์แหล่งที่ถูกต้องด้วยผลลัพธ์ที่บางส่วนหรือถูกปฏิเสธ

รายงานคำเตือนที่ว่างเปล่าไม่ได้รับประกันว่าฟีเจอร์ทุกอย่างของแหล่งถูกเก็บรักษาไว้ ควรทำการตรวจสอบเนื้อหาและภาพเพิ่มเติมตามที่แอปพลิเคชันกำหนด ดูเพิ่มเติมที่ เปิดการนำเสนอ และ บันทึกการนำเสนอ

คำถามที่พบบ่อย

คอลแบ็กการแจ้งเตือนสามารถจัดการข้อผิดพลาดของ Aspose.Slides ทุกอย่างได้หรือไม่?

ไม่ มันจัดการเฉพาะเงื่อนไขที่กู้คืนได้และรายงานเป็นคำเตือน ข้อยยกเว้นที่เกิดโดยอิสระจากคอลแบ็กต้องถูกจัดการโดยแอปพลิเคชันรอบ ๆ การเรียกโหลด, เรนเดอร์, แปลง หรือบันทึก

การคืนค่า ReturnAction::Continue รับประกันว่าเอาต์พุตจะเหมือนเดิมหรือไม่?

ไม่ มันเพียงอนุญาตให้การประมวลผลดำเนินต่อ เงื่อนไขที่รายงานอาจยังทำให้เกิดความแตกต่างของข้อมูล, การจัดรูปแบบ, หรือความเข้ากันได้ ดังนั้นต้องตรวจสอบประเภทและรายละเอียดของคำเตือนที่รวบรวมไว้

แอปพลิเคชันจะระบุขั้นตอนที่ทำให้เกิดคำเตือนได้อย่างไร?

สร้างอินสแตนซ์คอลแบ็กสำหรับแต่ละขั้นตอนและเก็บขั้นตอนที่กำหนดโดยแอปพลิเคชันพร้อมค่าที่คืนจาก getWarningType และ getDescription ตามที่แสดงในตัวอย่าง.