diff --git a/ChangeLog b/ChangeLog index 8f2b10398e9884b447669ad5b7a9de1cfdbc77ec..e586d1ac36a621817035645f0f1df49fbddc1ee7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -27,6 +27,7 @@ For users: - New: Add new graphical boxes (customer invoices and orders per month). - New: [ task #286 ] Enhance rounding function of prices to allow round of sum instead of sum of rounding. - New: Can add an event automatically when a projet is create. +- New: Add option MAIN_GENERATE_DOCUMENT_WITH_PICTURE. - Qual: Implement same rule for return value of all command line scripts (0 when success, <>0 if error). For translators: diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 4ce1bbf8c3d53c8ce0c6137037001781814b717f..2ed38d94e4a7ee00f14d58a5d8d15f0178a2add1 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -396,6 +396,9 @@ class Conf if (! isset($this->global->MAIN_MAX_DECIMALS_TOT)) $this->global->MAIN_MAX_DECIMALS_TOT=2; if (! isset($this->global->MAIN_MAX_DECIMALS_SHOWN)) $this->global->MAIN_MAX_DECIMALS_SHOWN=8; + // Default pdf use dash between lines + if (! isset($this->global->MAIN_PDF_DASH_BETWEEN_LINES)) $this->global->MAIN_PDF_DASH_BETWEEN_LINES=1; + // Default max file size for upload $this->maxfilesize = (empty($this->global->MAIN_UPLOAD_DOC) ? 0 : $this->global->MAIN_UPLOAD_DOC * 1024); diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 61d247ff2c20cbc17e9b8fcb358c0127cc4f0067..c895ea541d700da8d5ec116be5c0b85076b36674 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -199,8 +199,8 @@ function pdf_getInstance($format='',$metric='mm',$pagetype='P') { $this->SetXY($x,$y); $val=str_replace('<br>',"\n",$html); - $val=dol_string_nohtmltag($val,false,'ISO-8859-1'); - //print 'eee'.$val;exit; + //$val=dol_string_nohtmltag($val,false,'ISO-8859-1'); + $val=dol_string_nohtmltag($val,false,'UTF-8'); $this->MultiCell($w,$h,$val,$border,$align,$fill); } } @@ -1554,25 +1554,29 @@ function pdf_getLinkedObjects($object,$outputlangs) } /** - * Return dimensions to use for images onto PDF + * Return dimensions to use for images onto PDF checking that width and height are not higher than + * maximum (16x32 by default). * * @param string $realpath Full path to photo file to use - * @return array Height/Width to use to output image (in pixel) + * @return array Height and width to use to output image (in pdf user unit, so mm) */ -function pdf_getHeightForImage($realpath) +function pdf_getSizeForImage($realpath) { - $maxheight=12; $maxwidth=16; + global $conf; + + $maxwidth=(empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH)?16:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_WIDTH); + $maxheight=(empty($conf->global->MAIN_DOCUMENTS_WITH_PICTURE_HEIGHT)?32:$conf->global->MAIN_DOCUMENTS_WITH_PICTURE_HEIGHT); include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; $tmp=dol_getImageSize($realpath); if ($tmp['height']) { - $width=(int) round($maxheight*$tmp['width']/$tmp['height']); - if ($width > $maxwidth) + $width=(int) round($maxheight*$tmp['width']/$tmp['height']); // I try to use maxheight + if ($width > $maxwidth) // Pb with maxheight, so i use maxwidth { - $height=(int) round($height*$maxwidth/$width); $width=$maxwidth; + $height=(int) round($maxwidth*$tmp['height']/$tmp['width']); } - else + else // No pb with maxheight { $height=$maxheight; } diff --git a/htdocs/core/modules/propale/doc/pdf_azur.modules.php b/htdocs/core/modules/propale/doc/pdf_azur.modules.php index caeb4c3be1dd53c062dd2467c216a630e1b7510c..cd916ae46a096f8860eb58a53bed84c3a26bfa67 100644 --- a/htdocs/core/modules/propale/doc/pdf_azur.modules.php +++ b/htdocs/core/modules/propale/doc/pdf_azur.modules.php @@ -272,15 +272,76 @@ class pdf_azur extends ModelePDFPropales $pdf->SetFont('','', $default_font_size - 1); // Into loop to work with multipage $pdf->SetTextColor(0,0,0); + // Define size of image if we need it + $imglinesize=array(); $realpath=''; + if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITH_PICTURE)) + { + if ($object->lines[$i]->fk_product) + { + $objphoto = new Product($this->db); + $objphoto->fetch($object->lines[$i]->fk_product); + + $pdir = get_exdir($object->lines[$i]->fk_product,2) . $object->lines[$i]->fk_product ."/photos/"; + $dir = $conf->product->dir_output.'/'.$pdir; + + $realpath=''; + if ($object->ref == 'SPECIMEN' && $i == 1) + { + $realpath = DOL_DOCUMENT_ROOT.'/theme/common/nophoto.jpg'; + } + else + { + foreach ($objphoto->liste_photos($dir,1) as $key => $obj) + { + if ($obj['photo_vignette']) + { + $filename='thumbs/'.$obj['photo_vignette']; + } + else + { + $filename=$obj['photo']; + } + + $realpath = $dir.$filename; + break; + } + } + + if (!empty($realpath)) $imglinesize=pdf_getSizeForImage($realpath); + } + } + $pdf->setTopMargin($tab_top_newpage); $pdf->setPageOrientation('', 1, $heightforfooter+$heightforfreetext+$heightforinfotot); // The only function to edit the bottom margin of current page to set it. $pageposbefore=$pdf->getPage(); + $showpricebeforepagebreak=1; + $posYAfterImage=0; + $posYAfterDescription=0; + + // We start with Photo of product line + if (($curY + $imglinesize['height']) > ($this->page_hauteur-($heightforfooter+$heightforfreetext+$heightforinfotot))) // If photo to high, we moved completely on new page + { + $pdf->AddPage('','',true); + if (! empty($tplidx)) $pdf->useTemplate($tplidx); + if (empty($conf->global->MAIN_PDF_DONOTREPEAT_HEAD)) $this->_pagehead($pdf, $object, 0, $outputlangs); + $pdf->setPage($pagenb+1); + + $curY = $tab_top_newpage; + $showpricebeforepagebreak=0; + } + + if (isset($imglinesize['width']) && isset($imglinesize['height'])) + { + $curX = $this->posxpicture-1; + $pdf->Image($realpath, $curX + (($this->posxtva-$this->posxpicture-$imglinesize['width'])/2), $curY, $imglinesize['width'], $imglinesize['height'],'','','',2, 300); // Use 300 dpi + // $pdf->Image does not increase value return by getY, so we save it manually + $posYAfterImage=$curY+$imglinesize['height']; + } + // Description of product line $curX = $this->posxdesc-1; - $showpricebeforepagebreak=1; - $pdf->startTransaction(); if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITH_PICTURE)) { @@ -329,6 +390,7 @@ class pdf_azur extends ModelePDFPropales { $pdf->commitTransaction(); } + $posYAfterDescription=$pdf->GetY(); $nexY = $pdf->GetY(); $pageposafter=$pdf->getPage(); @@ -336,67 +398,13 @@ class pdf_azur extends ModelePDFPropales $pdf->setTopMargin($this->marge_haute); $pdf->setPageOrientation('', 1, 0); // The only function to edit the bottom margin of current page to set it. - // We suppose that a too long description is moved completely on next page + // We suppose that a too long description or photo were moved completely on next page if ($pageposafter > $pageposbefore && empty($showpricebeforepagebreak)) { $pdf->setPage($pageposafter); $curY = $tab_top_newpage; } $pdf->SetFont('','', $default_font_size - 1); // On repositionne la police par defaut - // Photo - if (! empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITH_PICTURE)) - { - $curX = $this->posxpicture-1; - if ($object->lines[$i]->fk_product) - { - $objphoto = new Product($this->db); - $objphoto->fetch($object->lines[$i]->fk_product); - - $pdir = get_exdir($object->lines[$i]->fk_product,2) . $object->lines[$i]->fk_product ."/photos/"; - $dir = $conf->product->dir_output.'/'.$pdir; - - $realpath=''; - if ($object->ref == 'SPECIMEN') - { - $realpath = DOL_DOCUMENT_ROOT.'/theme/common/nophoto.jpg'; - } - else - { - foreach ($objphoto->liste_photos($dir,1) as $key => $obj) - { - if ($obj['photo_vignette']) - { - $filename='thumbs/'.$obj['photo_vignette']; - } - else - { - $filename=$obj['photo']; - } - - $realpath = $dir.$filename; - break; - } - } - - if (!empty($realpath)) - { - //$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); - $tmp=pdf_getHeightForImage($realpath); - //var_dump(constant('PDF_IMAGE_SCALE_RATIO'));var_dump($pdf->getImageScale());var_dump($tmp['width']);var_dump($pdf->pixelsToUnits($tmp['width']));exit; - // measures 1/72 of an inch, i.e. approximately 0.0139 inch or 25.4/72 = 0.3528 mm - var_dump($this->page_largeur);exit; - //var_dump(tmp['height']);exit; - $pdf->Line($this->posxtva,10,$this->posxtva+0.5,10); - $pdf->Image($realpath, $this->posxtva, 10, $tmp['width'], $tmp['height'],'','','',2,0); // Use 300 dpi - $pdf->Line($this->posxtva+$pdf->pixelsToUnits($tmp['width']),10,$this->posxtva+$pdf->pixelsToUnits($tmp['width'])+0.5,10); - $pdf->Image($realpath, $curX + ($this->posxtva-$this->posxpicture-($pdf->pixelsToUnits($tmp['width'])))/2, $curY-1, $tmp['width'], $tmp['height'],'','','',2, 300); // Use 300 dpi - //$nexY += 7; // +7 for height = 12 - $nexY += round($pdf->pixelsToUnits($tmp['height'])); - //var_dump($nexY);exit; - } - } - } - // VAT Rate if (empty($conf->global->MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT)) { @@ -459,6 +467,8 @@ class pdf_azur extends ModelePDFPropales if (! isset($this->tva[$vatrate])) $this->tva[$vatrate]=''; $this->tva[$vatrate] += $tvaligne; + if ($posYAfterImage > $posYAfterDescription) $nexY=$posYAfterImage; + // Add line if (! empty($conf->global->MAIN_PDF_DASH_BETWEEN_LINES) && $i < ($nblignes - 1)) { @@ -1063,7 +1073,7 @@ class pdf_azur extends ModelePDFPropales $pdf->MultiCell(($pdf->GetStringWidth($titre) + 3), 2, $titre); //$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR='230,230,230'; - if (! empty($conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)) $pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_droite-$this->marge_gauche, 5, 'F', null, explode(',',$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)); + if (! empty($conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)) $pdf->Rect($this->marge_gauche, $tab_top, $this->page_largeur-$this->marge_droite-$this->marge_gauche, 6, 'F', null, explode(',',$conf->global->MAIN_PDF_TITLE_BACKGROUND_COLOR)); } $pdf->SetDrawColor(128,128,128); @@ -1074,7 +1084,7 @@ class pdf_azur extends ModelePDFPropales if (empty($hidetop)) { - $pdf->line($this->marge_gauche, $tab_top+5, $this->page_largeur-$this->marge_droite, $tab_top+5); // line prend une position y en 2eme param et 4eme param + $pdf->line($this->marge_gauche, $tab_top+6, $this->page_largeur-$this->marge_droite, $tab_top+6); // line prend une position y en 2eme param et 4eme param $pdf->SetXY($this->posxdesc-1, $tab_top+1); $pdf->MultiCell(108,2, $outputlangs->transnoentities("Designation"),'','L'); @@ -1085,8 +1095,8 @@ class pdf_azur extends ModelePDFPropales $pdf->line($this->posxpicture-1, $tab_top, $this->posxpicture-1, $tab_top + $tab_height); if (empty($hidetop)) { - $pdf->SetXY($this->posxpicture-1, $tab_top+1); - $pdf->MultiCell($this->posxtva-$this->posxpicture-1,2, $outputlangs->transnoentities("Photo"),'','C'); + //$pdf->SetXY($this->posxpicture-1, $tab_top+1); + //$pdf->MultiCell($this->posxtva-$this->posxpicture-1,2, $outputlangs->transnoentities("Photo"),'','C'); } }