Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] [PDF] Generowanie PDF
Forum PHP.pl > Forum > Przedszkole
zundap
Generuje plik pdf Ewidencja Vat
Wszystko działa wyskakują faktury jedna pod 2 ale jest problem gdy nazwa firmy jest za długa tekst się zawija i wchodzi na następną komórkę

c$ to wartość zwiększająca się co pętle o wysokość pola
  1. $pdf->SetXY(65, "$c");
  2. $pdf->MultiCell(85,"14", "$a_row[k_nazwa]", 1, 'J', 0);

jak zrobić żeby teks dopasowywał się do pola , np zmniejszał

Używam fpdf
gargamel
FPDF takowej opcji nie posiada.
Możesz skorzystać z textboxa http://www.fpdf.org/en/script/script52.php
Niepasujący tekst będzie obcięty.
O zmniejszanie czcionki musisz sam się postarać ( np korzystając z GetStringWidth ) i trochę pokodzić.
zundap
Kurcze głowę bym dał że jak gdzieś o konwertowaniu to widziałem przykłady
hmm to możne inną bibliotekę zastosować macie coś sprawdzonego
gargamel
Dobra, powiedzmy że zmotywowałeś mnie do dokończenia czegoś co kiedyś zacząłem.

funkcja TextBox, czyli małe rozszerzenie FPDFa

  1. function TextBoxLines($text, $width){
  2. $tab = array();
  3. $line = array();
  4. $tab = explode(' ', $text);
  5. $i = $j = 0;
  6. foreach( $tab as $word ){
  7. if( $this->GetStringWidth($line[$i].$word.' ') < $width ){
  8. $line[$i] .= $word.' ';
  9. }
  10. elseif( $this->GetStringWidth($line[$i].$word) < $width ){
  11. $line[$i] .= $word;
  12. }
  13. else{
  14. $i++;
  15. if( $this->GetStringWidth($word.' ') <= $width ){
  16. $line[$i] .= $word.' ';
  17. }
  18. elseif( $this->GetStringWidth($word) <= $width ){
  19. $line[$i] .= $word;
  20. }
  21. else{
  22. $word .= ' ';
  23. for($j; $j<strlen($word); $j++){
  24. if( $this->GetStringWidth($line[$i].$word[$j]) < $width ){
  25. $line[$i] .= $word[$j];
  26. }
  27. else{
  28. $line[$i++] .= $word[$j];
  29. }
  30. }
  31. }
  32. }
  33. }
  34. return array_values($line);
  35. }
  36.  
  37. function TextBox($text, $width, $height, $maxRows, $fontName, $fontStyle, $fontSize, $minFontSize, $fontStep=0.2){
  38. $k = 0;
  39. $this -> SetFont($fontName, $fontStyle, $fontSize);
  40. while($minFontSize <= $fontSize){
  41. $tBoxLines = $this ->TextBoxLines($text, $width);
  42. if($minFontSize >= $fontSize){
  43. for($k;$k<$maxRows;$k++){
  44. $this->Cell($width+4,$height,$tBoxLines[$k],0,1,'L');
  45. }
  46. break;
  47. }
  48. elseif(count($tBoxLines) <= $maxRows){
  49. foreach($tBoxLines as $line){
  50. $this->Cell($width+4,$height,$line,0,1,'L');
  51. }
  52. break;
  53. }
  54. else{
  55. $fontSize = $fontSize - $fontStep;
  56. if($fontSize < $minFontSize){
  57. $fontSize = $minFontSize;
  58. }
  59. $this -> SetFont($fontName, $fontStyle, $fontSize);
  60. }
  61. }
  62. }

Powyższy fragment kodu wklejamy w pliku fpdf.php, za deklaracjami funkcji Cell i GetStringWidth, czyli np. tuż przed funkcją Output;

Argumenty:
TextBox(tekst_który_printujemy, max_szerokość_w_mm, wysokość_linii, max_ilość_wierszy, nazwa_czcionki, styl_czcionki, rozmiar_czcionki, minimalny_rozmiar_czcionki, krok_zmniejszania_czcionki-domyslnie:0.2)

Przykład użycia:
  1. $pdf->TextBox($text, 50, 6, 3, 'arial_ce', 'B', 11.5, 7, 0.1);


Wyjaśnienie działania:
Powyżej użyty TextBox sprawdza ile wierszy o szerokości 50mm (i wysokości 6mm) zajmie tekst $text.
Jeśli tyle (lub mniej) co ustawiona max_ilość_wierszy, czyli 3, to po prostu zwróci odpowiednio zawinięty tekst.
Jeśli ilość wierszy będzie większa, to funkcja zmniejszy czcionkę o wartość 0.1, a więc do wartości 11.4.
Funkcja będzie zmniejszać czcionkę, aż do momentu gdy tekst zmieści się w ustawionej maksymalnej ilości wierszy, czyli w tym przypadku 3 - lub do momentu gdy czcionka osiągnie dolną graniczną wartość - czyli 7. Wtedy funkcja zwróci 3 wiersze tekstu, a resztę odrzuci.

Mogą być jakieś błędy, bo testów zrobiłem niewiele.


zundap
To jest jakieś rozwiązanie , sprawdzę ale doszukałem się czegoś ciekawego
PDF_MC_Table
Robi tabelki i przy za długim tekście zawija w dół rozszerzając pozostałe tabele tylko jeden problem za Chiny nie potrafie zmienić orientacji strony na poziomą

  1. require('mc_table.php');
  2.  
  3. $pdf=new PDF_MC_Table();
  4. $pdf->AddPage();
  5.  
  6.  
  7. $pdf->SetFont('Arial','',14);
  8. //Table with 20 rows and 4 columns
  9. $pdf->SetWidths(array(30,50,30,40,40));
  10.  
  11. for($i=0;$i<20;$i++)
  12. $pdf->Row(array('dfgdfg dfgfdgfdgd fhgfhfg fghfghfgh fghfghfghf fghfgh hfghfghf f h fgh f ghfghfgdf','fghfgh','fghfgh','fghfghgfh','fghfghgfh'));
  13. $pdf->Output();


  1. require('fpdf.php');
  2.  
  3. class PDF_MC_Table extends FPDF
  4. {
  5. var $widths;
  6. var $aligns;
  7.  
  8. function SetWidths($w)
  9. {
  10. //Set the array of column widths
  11. $this->widths=$w;
  12.  
  13.  
  14.  
  15.  
  16.  
  17. }
  18.  
  19. function SetAligns($a)
  20. {
  21. //Set the array of column alignments
  22. $this->aligns=$a;
  23. }
  24.  
  25. function Row($data)
  26. {
  27. //Calculate the height of the row
  28. $nb=0;
  29. for($i=0;$i<count($data);$i++)
  30. $nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
  31. $h=5*$nb;
  32. //Issue a page break first if needed
  33. $this->CheckPageBreak($h);
  34. //Draw the cells of the row
  35. for($i=0;$i<count($data);$i++)
  36. {
  37. $w=$this->widths[$i];
  38. $a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
  39. //Save the current position
  40. $x=$this->GetX();
  41. $y=$this->GetY();
  42. //Draw the border
  43. $this->Rect($x,$y,$w,$h);
  44. //Print the text
  45. $this->MultiCell($w,5,$data[$i],0,$a);
  46. //Put the position to the right of the cell
  47. $this->SetXY($x+$w,$y);
  48. }
  49. //Go to the next line
  50. $this->Ln($h);
  51. }
  52.  
  53. function CheckPageBreak($h)
  54. {
  55. //If the height h would cause an overflow, add a new page immediately
  56. if($this->GetY()+$h>$this->PageBreakTrigger)
  57.  
  58. $this->AddPage($this->CurOrientation);
  59.  
  60.  
  61. }
  62.  
  63.  
  64.  
  65.  
  66. function NbLines($w,$txt)
  67. {
  68. //Computes the number of lines a MultiCell of width w will take
  69. $cw=&$this->CurrentFont['cw'];
  70. if($w==0)
  71. $w=$this->w-$this->rMargin-$this->x;
  72. $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
  73. $s=str_replace("\r",'',$txt);
  74. $nb=strlen($s);
  75. if($nb>0 and $s[$nb-1]=="\n")
  76. $nb--;
  77. $sep=-1;
  78. $i=0;
  79. $j=0;
  80. $l=0;
  81. $nl=1;
  82. while($i<$nb)
  83. {
  84. $c=$s[$i];
  85. if($c=="\n")
  86. {
  87. $i++;
  88. $sep=-1;
  89. $j=$i;
  90. $l=0;
  91. $nl++;
  92. continue;
  93. }
  94. if($c==' ')
  95. $sep=$i;
  96. $l+=$cw[$c];
  97. if($l>$wmax)
  98. {
  99. if($sep==-1)
  100. {
  101. if($i==$j)
  102. $i++;
  103. }
  104. else
  105. $i=$sep+1;
  106. $sep=-1;
  107. $j=$i;
  108. $l=0;
  109. $nl++;
  110. }
  111. else
  112. $i++;
  113. }
  114. return $nl;
  115. }
  116. }


Znalazlem trzeba zamienić
  1. $pdf->AddPage('L');


Mozę się komuś przyda , temat wyczerpany zamykamy dzięki za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.