Esempio n. 1
0
/**
 * Creates a personalized exam file.
 *
 * @param unknown $examid        	
 * @return NULL
 */
function emarking_download_exam($examid, $multiplepdfs = false, $groupid = null, $pbar = null, $sendprintorder = false, $printername = null)
{
    global $DB, $CFG, $USER, $OUTPUT;
    // Se obtiene el examen
    if (!($downloadexam = $DB->get_record('emarking_exams', array('id' => $examid)))) {
        return null;
    }
    // Contexto del curso para verificar permisos
    $context = context_course::instance($downloadexam->course);
    if (!has_capability('mod/emarking:downloadexam', $context)) {
        return null;
    }
    // Verify that remote printing is enable, otherwise disable a printing order
    if ($sendprintorder && (!$CFG->emarking_enableprinting || $printername == null)) {
        return null;
    }
    $course = $DB->get_record('course', array('id' => $downloadexam->course));
    $coursecat = $DB->get_record('course_categories', array('id' => $course->category));
    if ($downloadexam->printrandom == 1) {
        $enrolincludes = 'manual,self,meta';
    } else {
        $enrolincludes = 'manual,self';
    }
    if ($CFG->emarking_enrolincludes && strlen($CFG->emarking_enrolincludes) > 1) {
        $enrolincludes = $CFG->emarking_enrolincludes;
    }
    if (isset($downloadexam->enrolments) && strlen($downloadexam->enrolments) > 1) {
        $enrolincludes = $downloadexam->enrolments;
    }
    $enrolincludes = explode(",", $enrolincludes);
    // Get all the files uploaded as forms for this exam
    $fs = get_file_storage();
    $files = $fs->get_area_files($context->id, 'mod_emarking', 'exams', $examid);
    // We filter only the PDFs
    $pdffileshash = array();
    foreach ($files as $filepdf) {
        if ($filepdf->get_mimetype() === 'application/pdf') {
            $pdffileshash[] = array('hash' => $filepdf->get_pathnamehash(), 'filename' => $filepdf->get_filename());
        }
    }
    // Verify that at least we have a PDF
    if (count($pdffileshash) < 1) {
        return null;
    }
    if ($downloadexam->headerqr == 1) {
        if ($groupid != null) {
            $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}" . "/group_" . $groupid;
        } else {
            $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}";
        }
        $fileimg = $CFG->dataroot . "/temp/emarking/{$context->id}/qr";
        $userimgdir = $CFG->dataroot . "/temp/emarking/{$context->id}/u";
        emarking_initialize_directory($filedir, true);
        emarking_initialize_directory($fileimg, true);
        emarking_initialize_directory($userimgdir, true);
        if ($groupid != null) {
            // Se toman los resultados del query dentro de una variable.
            $students = emarking_get_students_of_groups($downloadexam->course, $groupid);
        } else {
            // Se toman los resultados del query dentro de una variable.
            $students = emarking_get_students_for_printing($downloadexam->course);
        }
        $nombre = array();
        $current = 0;
        // Los resultados del query se recorren mediante un foreach loop.
        foreach ($students as $student) {
            if (array_search($student->enrol, $enrolincludes) === false) {
                continue;
            }
            $nombre[] = substr("{$student->lastname}, {$student->firstname}", 0, 65);
            $rut[] = $student->idnumber;
            $moodleid[] = $student->id;
            // Get the image file for student
            $imgfound = false;
            if ($CFG->emarking_pathuserpicture && is_dir($CFG->emarking_pathuserpicture)) {
                $idstring = "" . $student->idnumber;
                $revid = strrev($idstring);
                $idpath = $CFG->emarking_pathuserpicture;
                $idpath .= "/" . substr($revid, 0, 1);
                $idpath .= "/" . substr($revid, 1, 1);
                if (file_exists($idpath . "/user{$idstring}.png")) {
                    $userimg[] = $idpath . "/user{$idstring}.png";
                    $imgfound = true;
                }
            }
            if (!$imgfound) {
                $usercontext = context_user::instance($student->id);
                $imgfile = $DB->get_record('files', array('contextid' => $usercontext->id, 'component' => 'user', 'filearea' => 'icon', 'filename' => 'f1.png'));
                if ($imgfile) {
                    $userimg[] = emarking_get_path_from_hash($userimgdir, $imgfile->pathnamehash, "u" . $student->id, true);
                } else {
                    $userimg[] = $CFG->dirroot . "/pix/u/f1.png";
                }
            }
        }
        $numberstudents = count($nombre);
        for ($i = $numberstudents; $i < $numberstudents + $downloadexam->extraexams; $i++) {
            $nombre[$i] = '..............................................................................';
            $rut[$i] = '0';
            $moodleid[$i] = '0';
            $userimg[$i] = $CFG->dirroot . "/pix/u/f1.png";
        }
        $newfile = emarking_get_path_from_hash($filedir, $pdffileshash[$current]['hash']);
        $path = $filedir . "/" . str_replace(' ', '-', $pdffileshash[$current]['filename']);
        $hash = hash_file('md5', $path);
        $logoisconfigured = false;
        if ($logofile = emarking_get_logo_file()) {
            $logofilepath = emarking_get_path_from_hash($filedir, $logofile->get_pathnamehash());
            $logoisconfigured = true;
        }
        $file1 = $filedir . "/" . emarking_clean_filename($course->shortname, true) . "_" . emarking_clean_filename($downloadexam->name, true) . ".pdf";
        $pdf = new FPDI();
        $cp = $pdf->setSourceFile($path);
        if ($cp > 99) {
            print_error(get_string('page', 'mod_emarking'));
        }
        if ($multiplepdfs || $groupid != null) {
            $zip = new ZipArchive();
            if ($groupid != null) {
                $file1 = $filedir . "/" . emarking_clean_filename($course->shortname, true) . "_" . "GRUPO_" . $groupid . "_" . emarking_clean_filename($downloadexam->name, true) . ".zip";
            } else {
                $file1 = $filedir . "/" . emarking_clean_filename($course->shortname, true) . "_" . emarking_clean_filename($downloadexam->name, true) . ".zip";
            }
            if ($zip->open($file1, ZipArchive::CREATE) !== true) {
                return null;
            }
        }
        if ($sendprintorder) {
            if ($pbar != null) {
                $pbar->update(0, count($nombre), '');
            }
        }
        $jobs[] = array();
        if ($downloadexam->printlist == 1) {
            $flag = 0;
            // lista de alumnos
            if ($flag == 0) {
                $pdf->SetAutoPageBreak(false);
                $pdf->AddPage();
                $left = 85;
                $top = 8;
                $pdf->SetFont('Helvetica', 'B', 12);
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper("LISTA DE ALUMNOS"));
                $left = 15;
                $top = 16;
                $pdf->SetFont('Helvetica', '', 8);
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper("Asignatura: " . $course->fullname));
                $left = 15;
                $top = 22;
                $pdf->SetFont('Helvetica', '', 8);
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper("N° Inscritos: " . count($nombre)));
                // $year = date("Y");
                // $month= date("F");
                // $day= date("m");
                setlocale(LC_ALL, "es_ES");
                $left = 15;
                $top = 28;
                $pdf->SetFont('Helvetica', '', 8);
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper("Fecha: " . strftime("%A %d de %B del %Y")));
                $left = 15;
                $top = 36;
                $pdf->SetXY($left, $top);
                $pdf->Cell(10, 10, "N°", 1, 0, 'L');
                $pdf->Cell(120, 10, "Nombres", 1, 0, 'L');
                $pdf->Cell(50, 10, "Firmas", 1, 0, 'L');
                $t = 0;
                $t2 = 46;
                for ($a = 0; $a <= count($nombre) - 1; $a++) {
                    if ($n == 24 || $n == 48 || $n == 72 || $n == 96 || $n == 120) {
                        $pdf->AddPage();
                        $t = 0;
                        $t2 = 8;
                    }
                    $top = $t2 + $t;
                    $n = $a + 1;
                    $pdf->SetFont('Helvetica', '', 8);
                    $pdf->SetXY($left, $top);
                    $pdf->Cell(10, 10, $n . ")", 1, 0, 'L');
                    $pdf->Cell(120, 10, core_text::strtoupper($nombre[$a]), 1, 0, 'L');
                    $pdf->Cell(50, 10, "", 1, 0, 'L');
                    // $pdf->Write ( 1, core_text::strtoupper ( $nombre [$a] ) );
                    $t = $t + 10;
                }
                $flag = 1;
                if ($multiplepdfs || $groupid != null) {
                    if ($groupid != null) {
                        $pdffile = $filedir . "/Lista_de_alumnos_" . "GRUPO_" . $groupid . ".pdf";
                        $pdf->Output($pdffile, "F");
                        // se genera el nuevo pdf
                        $zip->addFile($pdffile, "GRUPO_" . $groupid . ".pdf");
                    } else {
                        $pdffile = $filedir . "/Lista_de_alumnos_" . emarking_clean_filename($course->shortname, true) . ".pdf";
                        $pdf->Output($pdffile, "F");
                        // se genera el nuevo pdf
                        $zip->addFile($pdffile, "Lista_de_alumnos_" . emarking_clean_filename($course->shortname, true) . ".pdf");
                    }
                }
                $printername = explode(',', $CFG->emarking_printername);
                if ($sendprintorder) {
                    if ($printername[$_POST["printername"]] != "Edificio-C-mesonSecretaria") {
                        $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=UpperLeft -o fit-to-page -o media=Letter " . $pdffile;
                    } else {
                        $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=SinglePortrait -o PageSize=Letter -o Duplex=none " . $pdffile;
                    }
                    $printresult = exec($command);
                    if ($CFG->debug) {
                        echo "{$command} <br>";
                        echo "{$printresult} <hr>";
                    }
                }
            }
        }
        // Here we produce a PDF file for each student
        for ($k = 0; $k <= count($nombre) - 1; $k++) {
            // If there are multiplepdfs we have to produce one per student
            if ($multiplepdfs || $sendprintorder || $groupid != null) {
                $pdf = new FPDI();
            }
            if ($multiplepdfs || $sendprintorder || $groupid != null || count($pdffileshash) > 1) {
                $current++;
                if ($current > count($pdffileshash) - 1) {
                    $current = 0;
                }
                $newfile = emarking_get_path_from_hash($filedir, $pdffileshash[$current]['hash']);
                $path = $filedir . "/" . str_replace(' ', '-', $pdffileshash[$current]['filename']);
                $cp = $pdf->setSourceFile($path);
            }
            $pdf->SetAutoPageBreak(false);
            for ($i = 1; $i <= $cp + $downloadexam->extrasheets; $i = $i + 1) {
                $h = rand(1, 999999);
                $img = $fileimg . "/qr" . $h . "_" . $rut[$k] . "_" . $i . "_" . $hash . ".png";
                $imgrotated = $fileimg . "/qr" . $h . "_" . $rut[$k] . "_" . $i . "_" . $hash . "r.png";
                // Se genera QR con id, curso y número de página
                $qrstring = "{$moodleid[$k]} - {$downloadexam->course} - {$i}";
                QRcode::png($qrstring, $img);
                // se inserta QR
                QRcode::png($qrstring . " - R", $imgrotated);
                // se inserta QR
                $gdimg = imagecreatefrompng($imgrotated);
                $rotated = imagerotate($gdimg, 180, 0);
                imagepng($rotated, $imgrotated);
                $pdf->AddPage();
                // Agrega una nueva página
                if ($i <= $cp) {
                    $tplIdx = $pdf->importPage($i);
                    // Se importan las páginas del documento pdf.
                    $pdf->useTemplate($tplIdx, 0, 0, 0, 0, $adjustPageSize = true);
                    // se inserta como template el archivo pdf subido
                }
                /*
                 * Ahora se escribe texto sobre las páginas ya importadas. Se fija la fuente, el tipo y el tamaño de la letra. Se señala el título. Se da el nombre, apellido y rut del alumno al cual pertenece la prueba. Se indica el curso correspondiente a la evaluación. Se introduce una imagen. Esta corresponde al QR que se genera con los datos
                 */
                if ($CFG->emarking_includelogo && $logoisconfigured) {
                    $pdf->Image($logofilepath, 2, 8, 30);
                }
                $left = 58;
                $top = 8;
                $pdf->SetFont('Helvetica', '', 12);
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper($downloadexam->name));
                $pdf->SetFont('Helvetica', '', 9);
                $top += 5;
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper(get_string('name') . ": " . $nombre[$k]));
                $top += 4;
                if ($rut[$k] && strlen($rut[$k]) > 0) {
                    $pdf->SetXY($left, $top);
                    $pdf->Write(1, get_string('idnumber', 'mod_emarking') . ": " . $rut[$k]);
                    $top += 4;
                }
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper(get_string('course') . ": " . $course->fullname));
                $top += 4;
                if (file_exists($userimg[$k])) {
                    $pdf->Image($userimg[$k], 35, 8, 15, 15, "PNG", null, "T", true);
                }
                $totals = new stdClass();
                $totals->identified = $i;
                $totals->total = $cp + $downloadexam->extrasheets;
                $pdf->SetXY($left, $top);
                $pdf->Write(1, core_text::strtoupper(get_string('page') . ": " . get_string('aofb', 'mod_emarking', $totals)));
                $pdf->Image($img, 176, 3, 34);
                // y antes era -2
                $pdf->Image($imgrotated, 0, $pdf->getPageHeight() - 35, 34);
                unlink($img);
                unlink($imgrotated);
            }
            if ($multiplepdfs || $sendprintorder || $groupid != null) {
                $pdffile = $filedir . "/" . emarking_clean_filename($qrstring) . ".pdf";
                if (file_exists($pdffile)) {
                    $pdffile = $filedir . "/" . emarking_clean_filename($qrstring) . "_" . $k . ".pdf";
                    $pdf->Output($pdffile, "F");
                    // se genera el nuevo pdf
                    $zip->addFile($pdffile, emarking_clean_filename($qrstring) . "_" . $k . ".pdf");
                } else {
                    $pdffile = $filedir . "/" . emarking_clean_filename($qrstring) . ".pdf";
                    $pdf->Output($pdffile, "F");
                    // se genera el nuevo pdf
                    $zip->addFile($pdffile, emarking_clean_filename($qrstring) . ".pdf");
                }
                $jobs[$k]["param_1_pbar"] = $k + 1;
                $jobs[$k]["param_2_pbar"] = count($nombre);
                $jobs[$k]["param_3_pbar"] = 'Imprimiendo pruebas de ' . core_text::strtoupper($nombre[$k]);
                $jobs[$k]["name_job"] = $pdffile;
            }
        }
        $printername = explode(',', $CFG->emarking_printername);
        if ($sendprintorder) {
            foreach ($jobs as &$valor) {
                if (!empty($valor)) {
                    if ($pbar != null) {
                        $pbar->update($valor["param_1_pbar"], $valor["param_2_pbar"], $valor["param_3_pbar"]);
                    }
                    if ($printername[$_POST["printername"]] != "Edificio-C-mesonSecretaria") {
                        $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=UpperLeft -o fit-to-page -o media=Letter " . $valor["name_job"];
                    } else {
                        $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=SinglePortrait -o PageSize=Letter -o Duplex=none " . $valor["name_job"];
                    }
                    $printresult = exec($command);
                    if ($CFG->debug) {
                        echo "{$command} <br>";
                        echo "{$printresult} <hr>";
                    }
                }
            }
        }
        if ($multiplepdfs || $groupid != null) {
            // Generate Bat File
            $printerarray = array();
            foreach (explode(',', $CFG->emarking_printername) as $printer) {
                $printerarray[] = $printer;
            }
            $contenido = "@echo off\r\n";
            $contenido .= "TITLE Sistema de impresion\r\n";
            $contenido .= "color ff\r\n";
            $contenido .= "cls\r\n";
            $contenido .= ":MENUPPL\r\n";
            $contenido .= "cls\r\n";
            $contenido .= "echo #######################################################################\r\n";
            $contenido .= "echo #                     Sistema de impresion                            #\r\n";
            $contenido .= "echo #                                                                     #\r\n";
            $contenido .= "echo # @copyright 2014 Eduardo Miranda                                     #\r\n";
            $contenido .= "echo # Fecha Modificacion 23-04-2014                                       #\r\n";
            $contenido .= "echo #                                                                     #\r\n";
            $contenido .= "echo #   Para realizar la impresion debe seleccionar una de las impresoras #\r\n";
            $contenido .= "echo #   configuradas.                                                     #\r\n";
            $contenido .= "echo #                                                                     #\r\n";
            $contenido .= "echo #                                                                     #\r\n";
            $contenido .= "echo #######################################################################\r\n";
            $contenido .= "echo #   Seleccione una impresora:                                         #\r\n";
            $i = 0;
            while ($i < count($printerarray)) {
                $contenido .= "echo #   " . $i . " - " . $printerarray[$i] . "                                                   #\r\n";
                $i++;
            }
            $contenido .= "echo #   " . $i++ . " - Cancelar                                                      #\r\n";
            $contenido .= "echo #                                                                     #\r\n";
            $contenido .= "echo #######################################################################\r\n";
            $contenido .= "set /p preg01= Que desea hacer? [";
            $i = 0;
            while ($i <= count($printerarray)) {
                if ($i == count($printerarray)) {
                    $contenido .= $i;
                } else {
                    $contenido .= $i . ",";
                }
                $i++;
            }
            $contenido .= "]\r\n";
            $i = 0;
            while ($i < count($printerarray)) {
                $contenido .= "if %preg01%==" . $i . " goto MENU" . $i . "\r\n";
                $i++;
            }
            $contenido .= "if %preg01%==" . $i++ . " goto SALIR\r\n";
            $contenido .= "goto MENU\r\n";
            $contenido .= "pause\r\n";
            $i = 0;
            while ($i < count($printerarray)) {
                $contenido .= ":MENU" . $i . "\r\n";
                $contenido .= "cls\r\n";
                $contenido .= "set N=%Random%%random%\r\n";
                $contenido .= "plink central.apuntes mkdir -m 0777 ~/pruebas/%N%\r\n";
                $contenido .= "pscp *.pdf central.apuntes:pruebas/%N%\r\n";
                $contenido .= "plink central.apuntes cp ~/pruebas/script_pruebas.sh ~/pruebas/%N%\r\n";
                $contenido .= "plink central.apuntes cd pruebas/%N%;./script_pruebas.sh " . $printerarray[$i] . "\r\n";
                $contenido .= "plink central.apuntes rm -dfr ~/pruebas/%N%\r\n";
                $contenido .= "EXIT\r\n";
                $i++;
            }
            $contenido .= ":SALIR\r\n";
            $contenido .= "CLS\r\n";
            $contenido .= "ECHO Cancelando...\r\n";
            $contenido .= "EXIT\r\n";
            $random = rand();
            mkdir($CFG->dataroot . '/temp/emarking/' . $random . '_bat/', 0777);
            // chmod($random."_bat/", 0777);
            $fp = fopen($CFG->dataroot . "/temp/emarking/" . $random . "_bat/imprimir.bat", "x");
            fwrite($fp, $contenido);
            fclose($fp);
            // Generate zip file
            $zip->addFile($CFG->dataroot . "/temp/emarking/" . $random . "_bat/imprimir.bat", "imprimir.bat");
            $zip->close();
            unlink($CFG->dataroot . "/temp/emarking/" . $random . "_bat/imprimir.bat");
            rmdir($CFG->dataroot . "/temp/emarking/" . $random . "_bat");
        } else {
            if (!$sendprintorder) {
                $pdf->Output($file1, "F");
                // se genera el nuevo pdf
            }
        }
        $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT;
        $downloadexam->printdate = time();
        $DB->update_record('emarking_exams', $downloadexam);
        if ($sendprintorder) {
            $pbar->update_full(100, 'Impresión completada exitosamente');
            return $filedir;
        }
        if ($groupid != null) {
            unlink($file1);
            return $filedir;
        } else {
            ob_start();
            // modificación: ingreso de esta linea, ya que anterior revisión mostraba error en el archivo
            header('Content-Description: File Transfer');
            header('Content-Type: application/x-download');
            header('Content-Disposition: attachment; filename=' . basename($file1));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            ob_clean();
            flush();
            readfile($file1);
            unlink($file1);
            // borra archivo temporal en moodledata
            exit;
        }
        return false;
    } else {
        $students = emarking_get_students_for_printing($downloadexam->course);
        $filedir = $CFG->dataroot . "/temp/emarking/{$context->id}";
        emarking_initialize_directory($filedir, true);
        $printername = explode(',', $CFG->emarking_printername);
        $totalAlumn = 0;
        $pdffiles = array();
        for ($current = 0; $current < count($pdffileshash); $current++) {
            $newfile = emarking_get_path_from_hash($filedir, $pdffileshash[$current]['hash']);
            $path = $filedir . "/" . str_replace(' ', '-', $pdffileshash[$current]['filename']);
            $pdf = new FPDI();
            $cp = $pdf->setSourceFile($path);
            if ($cp > 99) {
                print_error(get_string('page', 'mod_emarking'));
            }
            $pdf->SetAutoPageBreak(false);
            $s = 1;
            while ($s <= $cp + $downloadexam->extrasheets) {
                $pdf->AddPage();
                if ($s <= $cp) {
                    $tplIdx = $pdf->importPage($s);
                    // Se importan las páginas del documento pdf.
                    $pdf->useTemplate($tplIdx, 0, 0, 0, 0, $adjustPageSize = true);
                    // se inserta como template el archivo pdf subido
                }
                $s++;
            }
            $pdffile = $filedir . "/" . $current . emarking_clean_filename($file->filename);
            $pdf->Output($pdffile, "F");
            $pdffiles[] = $pdffile;
        }
        $totalAlumn = count($students);
        if ($pbar != null) {
            $pbar->update(0, $totalAlumn, '');
        }
        for ($k = 0; $k <= $totalAlumn + $downloadexam->extraexams - 1; $k++) {
            $pdffile = $pdffiles[$k % count($pdffileshash)];
            if ($printername[$_POST["printername"]] != "Edificio-C-mesonSecretaria") {
                $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=UpperLeft -o fit-to-page -o media=Letter " . $pdffile;
            } else {
                $command = "lp -d " . $printername[$_POST["printername"]] . " -o StapleLocation=SinglePortrait -o PageSize=Letter -o Duplex=none " . $pdffile;
            }
            // $printresult = exec ( $command );
            if ($CFG->debug) {
                echo "{$command} <br>";
                echo "{$printresult} <hr>";
            }
            if ($pbar != null) {
                $pbar->update($k, $totalAlumn, '');
            }
        }
        $pbar->update_full(100, 'Impresión completada exitosamente');
        return true;
        /*
         * $downloadexam->status = EMARKING_EXAM_SENT_TO_PRINT; $downloadexam->printdate = time (); $DB->update_record ( 'emarking_exams', $downloadexam ); $downloadURL = $CFG->wwwroot . '/pluginfile.php/' . $file->contextid . '/mod_emarking/' . $file->filearea . '/' . $file->itemid . '/' . $file->filename; $startdownload = true; echo '<meta http-equiv="refresh" content="2;url=' . $downloadURL . '">'; return true;
         */
    }
}