@ -7,21 +7,25 @@ define('_MPDF_PATH', api_get_path(LIBRARY_PATH).'mpdf/');
require_once _MPDF_PATH.'mpdf.php';
require_once _MPDF_PATH.'mpdf.php';
class PDF {
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
* Converts an html file to PDF
* @param mixed could be an html path or an array with html paths
* @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 course code
* @param string pdf name
* @return string the pdf path
* @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) {
public function html_to_pdf($html_file_array, $pdf_name = '', $course_code = null) {
if (empty($html_file_array)) {
if (empty($html_file_array)) {
return false;
return false;
}
}
if (is_array($html_file_array)) {
if (is_array($html_file_array)) {
if (count($html_file_array) == 0)
if (count($html_file_array) == 0)
return false;
return false;
@ -42,94 +46,10 @@ class PDF {
'@< script [ ^ > ] * ? > . * ? < / script > @si',
'@< script [ ^ > ] * ? > . * ? < / script > @si',
'@< style [ ^ > ] * ? > . * ? < / style > @siU'
'@< 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');
//Formatting the pdf
self::format_pdf($course_code);
// $pdf->SetBasePath($basehref);
$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) {
foreach ($html_file_array as $html_file) {
if (!file_exists($html_file)) {
if (!file_exists($html_file)) {
continue;
continue;
@ -193,9 +113,9 @@ class PDF {
// At the moment the title is retrieved from the html document itself.
// At the moment the title is retrieved from the html document itself.
if (empty($title)) {
if (empty($title)) {
$title = $filename; // Here file name is expected to contain ASCII symbols only.
$title = $filename; // Here file name is expected to contain ASCII symbols only.
}
}
//var_dump($document_html);
//var_dump($document_html);
$pdf->WriteHTML($document_html,2);
$this-> pdf->WriteHTML($document_html,2);
}
}
if (empty($pdf_name)) {
if (empty($pdf_name)) {
@ -203,10 +123,106 @@ class PDF {
} else {
} else {
$output_file = $pdf_name.'.pdf';
$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;
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
* Gets the watermark from the platform or a course
* @param string course code (optional)
* @param string course code (optional)
@ -258,8 +274,7 @@ class PDF {
} else {
} else {
$store_path = api_get_path(SYS_CODE_PATH).'default_course_document'; // course path
$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';
$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';
$course_image = $store_path.'/'.api_get_current_access_url_id().'_pdf_watermark.png';
$extension = strtolower(substr(strrchr($filename, '.'), 1));
$extension = strtolower(substr(strrchr($filename, '.'), 1));
$result = false;
$result = false;
@ -296,15 +311,113 @@ class PDF {
* Returns the default header
* Returns the default header
*/
*/
public function get_header($course_code = null) {
public function get_header($course_code = null) {
$header = '';
$header = '';
if (!empty($course_code) & & api_get_setting('pdf_export_watermark_by_course') == 'true') {
if (!empty($course_code) & & api_get_setting('pdf_export_watermark_by_course') == 'true') {
$header = api_get_course_setting('pdf_export_watermark_text');
$header = api_get_course_setting('pdf_export_watermark_text');
} else {
} else {
$header = api_get_setting('pdf_export_watermark_text');
$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();
}
}
}
?>
?>