|
@@ -7,21 +7,25 @@ define('_MPDF_PATH', api_get_path(LIBRARY_PATH).'mpdf/');
|
|
|
require_once _MPDF_PATH.'mpdf.php';
|
|
|
|
|
|
class PDF {
|
|
|
-
|
|
|
- private function __construct() {
|
|
|
- }
|
|
|
+
|
|
|
+ var $pdf;
|
|
|
+ public function __construct() {
|
|
|
+ $this->pdf = $pdf = new mPDF('UTF-8', 'A4', '', '', 30, 20, 27, 25, 16, 13, 'P');
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
- * Converts an html file to a pdf
|
|
|
- * @param mixed could be an html path or an array with html paths
|
|
|
- * @param string course code
|
|
|
- * @return string the pdf path
|
|
|
+ * Converts an html file to PDF
|
|
|
+ * @param mixed could be an html file path or an array with paths example: /var/www/myfile.html or array('/myfile.html','myotherfile.html')
|
|
|
+ * @param string pdf name
|
|
|
+ * @param string course code (if you are using html that are located in the document tool you must provide this)
|
|
|
+ * @return
|
|
|
*/
|
|
|
public function html_to_pdf($html_file_array, $pdf_name = '', $course_code = null) {
|
|
|
|
|
|
if (empty($html_file_array)) {
|
|
|
return false;
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
if (is_array($html_file_array)) {
|
|
|
if (count($html_file_array) == 0)
|
|
|
return false;
|
|
@@ -42,94 +46,10 @@ class PDF {
|
|
|
'@<script[^>]*?>.*?</script>@si',
|
|
|
'@<style[^>]*?>.*?</style>@siU'
|
|
|
);
|
|
|
- //mPDF($codepage='win-1252',$format='A4',$default_font_size=0,$default_font='',$mgl=15,$mgr=15,$mgt=16,$mgb=16,$mgh=9,$mgf=9, $orientation='P')
|
|
|
- $pdf = new mPDF('UTF-8', 'A4', '', '', 30, 20, 27, 25, 16, 13, 'P');
|
|
|
-
|
|
|
- // $pdf->SetBasePath($basehref);
|
|
|
+
|
|
|
+ //Formatting the pdf
|
|
|
+ self::format_pdf($course_code);
|
|
|
|
|
|
- $pdf->directionality = api_get_text_direction(); // TODO: To be read from the html document.
|
|
|
- $pdf->useOnlyCoreFonts = true;
|
|
|
- $pdf->mirrorMargins = 1; // Use different Odd/Even headers and footers and mirror margins
|
|
|
-
|
|
|
- $pdf->defaultheaderfontsize = 10; // in pts
|
|
|
- $pdf->defaultheaderfontstyle = BI; // blank, B, I, or BI
|
|
|
- $pdf->defaultheaderline = 1; // 1 to include line below header/above footer
|
|
|
-
|
|
|
- $my_header = self::get_header($course_code);
|
|
|
- $pdf->SetHeader($my_header);// ('{DATE j-m-Y}|{PAGENO}/{nb}|'.$title);
|
|
|
-
|
|
|
- $pdf->defaultfooterfontsize = 12; // in pts
|
|
|
- $pdf->defaultfooterfontstyle = B; // blank, B, I, or BI
|
|
|
- $pdf->defaultfooterline = 1; // 1 to include line below header/above footer
|
|
|
-
|
|
|
- //@todo remove this and use a simpler way
|
|
|
- $footer = array (
|
|
|
- 'odd' => array (
|
|
|
- 'L' => array (
|
|
|
- 'content' => '',
|
|
|
- 'font-size' => 10,
|
|
|
- 'font-style' => 'B',
|
|
|
- 'font-family' => 'serif',
|
|
|
- 'color'=>'#000000'
|
|
|
- ),
|
|
|
- 'C' => array (
|
|
|
- 'content' => '',
|
|
|
- 'font-size' => 10,
|
|
|
- 'font-style' => 'B',
|
|
|
- 'font-family' => 'serif',
|
|
|
- 'color'=>'#000000'
|
|
|
- ),
|
|
|
- 'R' => array (
|
|
|
- 'content' => '{PAGENO}',
|
|
|
- 'font-size' => 10,
|
|
|
- 'font-style' => 'B',
|
|
|
- 'font-family' => 'serif',
|
|
|
- 'color'=>'#000000'
|
|
|
- ),
|
|
|
- 'line' => 1,
|
|
|
- ),
|
|
|
- 'even' => array (
|
|
|
- 'L' => array (
|
|
|
- 'content' => '',
|
|
|
- 'font-size' => 10,
|
|
|
- 'font-style' => 'B',
|
|
|
- 'font-family' => 'serif',
|
|
|
- 'color'=>'#000000'
|
|
|
- ),
|
|
|
- 'C' => array (
|
|
|
- 'content' => '',
|
|
|
- 'font-size' => 10,
|
|
|
- 'font-style' => 'B',
|
|
|
- 'font-family' => 'serif',
|
|
|
- 'color'=>'#000000'
|
|
|
- ),
|
|
|
- 'R' => array (
|
|
|
- 'content' => '{PAGENO}',
|
|
|
- 'font-size' => 10,
|
|
|
- 'font-style' => 'B',
|
|
|
- 'font-family' => 'serif',
|
|
|
- 'color'=>'#000000'
|
|
|
- ),
|
|
|
- 'line' => 1,
|
|
|
- ),
|
|
|
- );
|
|
|
-
|
|
|
- $pdf->SetFooter($footer); // defines footer for Odd and Even Pages - placed at Outer margin http://mpdf1.com/manual/index.php?tid=151&searchstring=setfooter
|
|
|
-
|
|
|
- if (api_get_setting('pdf_export_watermark_enable') == 'true') {
|
|
|
- $watermark_file = self::get_watermark($course_code);
|
|
|
- if (!empty($watermark_file)) {
|
|
|
- //http://mpdf1.com/manual/index.php?tid=269&searchstring=watermark
|
|
|
- $pdf->SetWatermarkImage($watermark_file);
|
|
|
- $pdf->showWatermarkImage = true;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /*$pdf->SetAuthor('Documents Chamilo');
|
|
|
- $pdf->SetTitle('title');
|
|
|
- $pdf->SetSubject('Exported from Chamilo Documents');
|
|
|
- $pdf->SetKeywords('Chamilo Documents');
|
|
|
- */
|
|
|
foreach ($html_file_array as $html_file) {
|
|
|
if (!file_exists($html_file)) {
|
|
|
continue;
|
|
@@ -193,9 +113,9 @@ class PDF {
|
|
|
// At the moment the title is retrieved from the html document itself.
|
|
|
if (empty($title)) {
|
|
|
$title = $filename; // Here file name is expected to contain ASCII symbols only.
|
|
|
- }
|
|
|
+ }
|
|
|
//var_dump($document_html);
|
|
|
- $pdf->WriteHTML($document_html,2);
|
|
|
+ $this->pdf->WriteHTML($document_html,2);
|
|
|
}
|
|
|
|
|
|
if (empty($pdf_name)) {
|
|
@@ -203,10 +123,106 @@ class PDF {
|
|
|
} else {
|
|
|
$output_file = $pdf_name.'.pdf';
|
|
|
}
|
|
|
- $result = $pdf->Output($output_file, 'D'); /// F to save the pdf in a file
|
|
|
+ $result = $this->pdf->Output($output_file, 'D'); /// F to save the pdf in a file
|
|
|
exit;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Converts an html string to PDF
|
|
|
+ * @param string valid html
|
|
|
+ * @param string pdf name
|
|
|
+ * @param string course code (if you are using html that are located in the document tool you must provide this)
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public function content_to_pdf($document_html, $css = '', $pdf_name = '', $course_code = null) {
|
|
|
+
|
|
|
+ if (empty($document_html)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ //clean styles and javascript document
|
|
|
+ $clean_search = array (
|
|
|
+ '@<script[^>]*?>.*?</script>@si',
|
|
|
+ '@<style[^>]*?>.*?</style>@siU'
|
|
|
+ );
|
|
|
+
|
|
|
+ //Formatting the pdf
|
|
|
+ self::format_pdf($course_code);
|
|
|
+
|
|
|
+ if (!empty($course_code)) {
|
|
|
+ $course_data = api_get_course_info($course_code);
|
|
|
+ }
|
|
|
+
|
|
|
+ $document_html = preg_replace($clean_search, '', $document_html);
|
|
|
+
|
|
|
+ //absolute path for frames.css //TODO: necessary?
|
|
|
+ $absolute_css_path=api_get_path(WEB_CODE_PATH).'css/'.api_get_setting('stylesheets').'/frames.css';
|
|
|
+ $document_html=str_replace('href="./css/frames.css"',$absolute_css_path, $document_html);
|
|
|
+
|
|
|
+ //$document_html=str_replace('<link rel="stylesheet" http://my.chamilo.net/main/css/chamilo/frames.css type="text/css" />','', $document_html);
|
|
|
+
|
|
|
+ $document_html= str_replace('../../','',$document_html);
|
|
|
+ $document_html= str_replace('../','',$document_html);
|
|
|
+ $document_html= str_replace('courses/'.$course_code.'/document/','',$document_html);
|
|
|
+
|
|
|
+ if (!empty($course_data['path'])) {
|
|
|
+ $document_path = api_get_path(WEB_COURSE_PATH).$course_data['path'].'/document/';
|
|
|
+
|
|
|
+ $doc = new DOMDocument();
|
|
|
+ $result = @$doc->loadHTML($document_html);
|
|
|
+
|
|
|
+ //Fixing only images @todo do the same thing with other elements
|
|
|
+ $elements = $doc->getElementsByTagName('img');
|
|
|
+ $replace_img_elements = array();
|
|
|
+ if (!empty($elements)) {
|
|
|
+ foreach($elements as $item) {
|
|
|
+ $old_src = $item->getAttribute('src');
|
|
|
+ //$old_src= str_replace('../','',$old_src);
|
|
|
+ if (strpos($old_src, 'http') === false) {
|
|
|
+ if (strpos($old_src, '/main/default_course_document') === false) {
|
|
|
+ if (strpos($old_src, '/main/inc/lib/') === false) {
|
|
|
+ $document_html= str_replace($old_src, $document_path.$old_src, $document_html);
|
|
|
+ //var_dump($old_src, $document_path.$old_src);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //replace relative path by absolute path for resources
|
|
|
+ //$document_html= str_replace('src="/chamilo/main/default_course_document/', 'temp_template_path', $document_html);// before save src templates not apply
|
|
|
+ //$document_html= str_replace('src="/', 'temp_template_path', $document_html);// before save src templates not apply
|
|
|
+ //$document_html= str_replace('src="/chamilo/main/default_course_document/', 'temp_template_path', $document_html);// before save src templates not apply
|
|
|
+
|
|
|
+ //$src_http_www= 'src="'.api_get_path(WEB_COURSE_PATH).$course_data['path'].'/document/';
|
|
|
+ //$document_html= str_replace('src="',$src_http_www, $document_html);
|
|
|
+ //$document_html= str_replace('temp_template_path', 'src="/main/default_course_document/', $document_html);// restore src templates
|
|
|
+
|
|
|
+ api_set_encoding_html($document_html, 'UTF-8'); // The library mPDF expects UTF-8 encoded input data.
|
|
|
+ $title = api_get_title_html($document_html, 'UTF-8', 'UTF-8'); // TODO: Maybe it is better idea the title to be passed through
|
|
|
+ // $_GET[] too, as it is done with file name.
|
|
|
+ // At the moment the title is retrieved from the html document itself.
|
|
|
+ /* if (empty($title)) {
|
|
|
+ $title = $filename; // Here file name is expected to contain ASCII symbols only.
|
|
|
+ }*/
|
|
|
+
|
|
|
+ if (!empty($css)) {
|
|
|
+ $this->pdf->WriteHTML($css, 1);
|
|
|
+ }
|
|
|
+ $this->pdf->WriteHTML($document_html,2);
|
|
|
+
|
|
|
+ if (empty($pdf_name)) {
|
|
|
+ $output_file = 'pdf_'.date('Y-m-d-his').'.pdf';
|
|
|
+ } else {
|
|
|
+ $output_file = $pdf_name.'.pdf';
|
|
|
+ }
|
|
|
+ $result = $this->pdf->Output($output_file, 'D'); /// F to save the pdf in a file
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Gets the watermark from the platform or a course
|
|
|
* @param string course code (optional)
|
|
@@ -258,8 +274,7 @@ class PDF {
|
|
|
} else {
|
|
|
$store_path = api_get_path(SYS_CODE_PATH).'default_course_document'; // course path
|
|
|
$web_path = api_get_path(WEB_CODE_PATH).'default_course_document/'.api_get_current_access_url_id().'_pdf_watermark.png';
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
$course_image = $store_path.'/'.api_get_current_access_url_id().'_pdf_watermark.png';
|
|
|
$extension = strtolower(substr(strrchr($filename, '.'), 1));
|
|
|
$result = false;
|
|
@@ -296,15 +311,113 @@ class PDF {
|
|
|
* Returns the default header
|
|
|
*/
|
|
|
public function get_header($course_code = null) {
|
|
|
- $header = '';
|
|
|
-
|
|
|
+ $header = '';
|
|
|
if (!empty($course_code) && api_get_setting('pdf_export_watermark_by_course') == 'true') {
|
|
|
$header = api_get_course_setting('pdf_export_watermark_text');
|
|
|
} else {
|
|
|
$header = api_get_setting('pdf_export_watermark_text');
|
|
|
}
|
|
|
- return $header;
|
|
|
+ return $header;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function set_footer() {
|
|
|
+ $this->pdf->defaultfooterfontsize = 12; // in pts
|
|
|
+ $this->pdf->defaultfooterfontstyle = B; // blank, B, I, or BI
|
|
|
+ $this->pdf->defaultfooterline = 1; // 1 to include line below header/above footer
|
|
|
+
|
|
|
+ //@todo remove this and use a simpler way
|
|
|
+ $footer = array (
|
|
|
+ 'odd' => array (
|
|
|
+ 'L' => array (
|
|
|
+ 'content' => '',
|
|
|
+ 'font-size' => 10,
|
|
|
+ 'font-style' => 'B',
|
|
|
+ 'font-family' => 'serif',
|
|
|
+ 'color'=>'#000000'
|
|
|
+ ),
|
|
|
+ 'C' => array (
|
|
|
+ 'content' => '',
|
|
|
+ 'font-size' => 10,
|
|
|
+ 'font-style' => 'B',
|
|
|
+ 'font-family' => 'serif',
|
|
|
+ 'color'=>'#000000'
|
|
|
+ ),
|
|
|
+ 'R' => array (
|
|
|
+ 'content' => '{PAGENO}',
|
|
|
+ 'font-size' => 10,
|
|
|
+ 'font-style' => 'B',
|
|
|
+ 'font-family' => 'serif',
|
|
|
+ 'color'=>'#000000'
|
|
|
+ ),
|
|
|
+ 'line' => 1,
|
|
|
+ ),
|
|
|
+ 'even' => array (
|
|
|
+ 'L' => array (
|
|
|
+ 'content' => '',
|
|
|
+ 'font-size' => 10,
|
|
|
+ 'font-style' => 'B',
|
|
|
+ 'font-family' => 'serif',
|
|
|
+ 'color'=>'#000000'
|
|
|
+ ),
|
|
|
+ 'C' => array (
|
|
|
+ 'content' => '',
|
|
|
+ 'font-size' => 10,
|
|
|
+ 'font-style' => 'B',
|
|
|
+ 'font-family' => 'serif',
|
|
|
+ 'color'=>'#000000'
|
|
|
+ ),
|
|
|
+ 'R' => array (
|
|
|
+ 'content' => '{PAGENO}',
|
|
|
+ 'font-size' => 10,
|
|
|
+ 'font-style' => 'B',
|
|
|
+ 'font-family' => 'serif',
|
|
|
+ 'color'=>'#000000'
|
|
|
+ ),
|
|
|
+ 'line' => 1,
|
|
|
+ ),
|
|
|
+ );
|
|
|
|
|
|
- }
|
|
|
+ $this->pdf->SetFooter($footer); // defines footer for Odd and Even Pages - placed at Outer margin http://mpdf1.com/manual/index.php?tid=151&searchstring=setfooter
|
|
|
+ }
|
|
|
+
|
|
|
+ public function set_header($course_code) {
|
|
|
+ // $pdf->SetBasePath($basehref);
|
|
|
+
|
|
|
+ $this->pdf->defaultheaderfontsize = 10; // in pts
|
|
|
+ $this->pdf->defaultheaderfontstyle = BI; // blank, B, I, or BI
|
|
|
+ $this->pdf->defaultheaderline = 1; // 1 to include line below header/above footer
|
|
|
+
|
|
|
+ $my_header = self::get_header($course_code);
|
|
|
+ $this->pdf->SetHeader($my_header);// ('{DATE j-m-Y}|{PAGENO}/{nb}|'.$title);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function format_pdf($course_code) {
|
|
|
+
|
|
|
+ /*$pdf->SetAuthor('Documents Chamilo');
|
|
|
+ $pdf->SetTitle('title');
|
|
|
+ $pdf->SetSubject('Exported from Chamilo Documents');
|
|
|
+ $pdf->SetKeywords('Chamilo Documents');
|
|
|
+ */
|
|
|
+
|
|
|
+ $this->pdf->directionality = api_get_text_direction(); // TODO: To be read from the html document.
|
|
|
+ $this->pdf->useOnlyCoreFonts = true;
|
|
|
+ $this->pdf->mirrorMargins = 1; // Use different Odd/Even headers and footers and mirror margins
|
|
|
+
|
|
|
+
|
|
|
+ //Adding watermark
|
|
|
+ if (api_get_setting('pdf_export_watermark_enable') == 'true') {
|
|
|
+ $watermark_file = self::get_watermark($course_code);
|
|
|
+ if (!empty($watermark_file)) {
|
|
|
+ //http://mpdf1.com/manual/index.php?tid=269&searchstring=watermark
|
|
|
+ $this->pdf->SetWatermarkImage($watermark_file);
|
|
|
+ $this->pdf->showWatermarkImage = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ self::set_header($course_code);
|
|
|
+ self::set_footer();
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
?>
|