diff --git a/mod/assign/feedback/editpdf/classes/document_services.php b/mod/assign/feedback/editpdf/classes/document_services.php index 1d6fe6bbc2f..02f0ec5261c 100644 --- a/mod/assign/feedback/editpdf/classes/document_services.php +++ b/mod/assign/feedback/editpdf/classes/document_services.php @@ -448,7 +448,12 @@ EOD; $files = array(); for ($i = 0; $i < $pagecount; $i++) { - $image = $pdf->get_image($i); + try { + $image = $pdf->get_image($i); + } catch (\moodle_exception $e) { + // We catch only moodle_exception here as other exceptions indicate issue with setup not the pdf. + $image = pdf::get_error_image($tmpdir, $i); + } $record->filename = basename($image); $files[$i] = $fs->create_file_from_pathname($record, $tmpdir . '/' . $image); @unlink($tmpdir . '/' . $image); diff --git a/mod/assign/feedback/editpdf/classes/pdf.php b/mod/assign/feedback/editpdf/classes/pdf.php index 99298c8b44d..700ec98866d 100644 --- a/mod/assign/feedback/editpdf/classes/pdf.php +++ b/mod/assign/feedback/editpdf/classes/pdf.php @@ -68,6 +68,8 @@ class pdf extends \FPDI { const MIN_ANNOTATION_WIDTH = 5; /** Min. height an annotation should have */ const MIN_ANNOTATION_HEIGHT = 5; + /** Blank PDF file used during error. */ + const BLANK_PDF = '/mod/assign/feedback/editpdf/fixtures/blank.pdf'; /** * Combine the given PDF files into a single PDF. Optionally add a coversheet and coversheet fields. @@ -522,6 +524,43 @@ class pdf extends \FPDI { return $tempdst; } + /** + * Generate an localised error image for the given pagenumber. + * + * @param string $errorimagefolder path of the folder where error image needs to be created. + * @param int $pageno page number for which error image needs to be created. + * + * @return string File name + * @throws \coding_exception + */ + public static function get_error_image($errorimagefolder, $pageno) { + global $CFG; + + $errorfile = $CFG->dirroot . self::BLANK_PDF; + if (!file_exists($errorfile)) { + throw new \coding_exception("Blank PDF not found", "File path" . $errorfile); + } + + $tmperrorimagefolder = make_request_directory(); + + $pdf = new pdf(); + $pdf->set_pdf($errorfile); + $pdf->copy_page(); + $pdf->add_comment(get_string('errorpdfpage', 'assignfeedback_editpdf'), 250, 300, 200, "red"); + $generatedpdf = $tmperrorimagefolder . '/' . 'error.pdf'; + $pdf->save_pdf($generatedpdf); + + $pdf = new pdf(); + $pdf->set_pdf($generatedpdf); + $pdf->set_image_folder($tmperrorimagefolder); + $image = $pdf->get_image(0); + $pdf->Close(); // PDF loaded and never saved/outputted needs to be closed. + $newimg = 'image_page' . $pageno . '.png'; + + copy($tmperrorimagefolder . '/' . $image, $errorimagefolder . '/' . $newimg); + return $newimg; + } + /** * Test that the configured path to ghostscript is correct and working. * @param bool $generateimage - If true - a test image will be generated to verify the install. diff --git a/mod/assign/feedback/editpdf/fixtures/blank.pdf b/mod/assign/feedback/editpdf/fixtures/blank.pdf new file mode 100644 index 00000000000..d96c0e8cb38 Binary files /dev/null and b/mod/assign/feedback/editpdf/fixtures/blank.pdf differ diff --git a/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php b/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php index 1aefd6700e5..f5341c40ac5 100644 --- a/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php +++ b/mod/assign/feedback/editpdf/lang/en/assignfeedback_editpdf.php @@ -44,6 +44,7 @@ $string['downloadablefilename'] = 'feedback.pdf'; $string['downloadfeedback'] = 'Download feedback PDF'; $string['drag'] = 'Drag'; $string['errorgenerateimage'] = 'Error generating image with ghostscript, debugging info: {$a}'; +$string['errorpdfpage'] = 'There was an error while generating this page.'; $string['editpdf'] = 'Annotate PDF'; $string['editpdf_help'] = 'Annotate students submissions directly in the browser and produce an edited downloadable PDF.'; $string['enabled'] = 'Annotate PDF';