จัดการคำเตือนการนำเสนอใน 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 ตามที่แสดงในตัวอย่าง.