Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] [PDF] Generowanie PDF, problem z długim tekstem w polu
zundap
post 12.03.2011, 11:50:39
Post #1





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 1.10.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
gargamel
post 12.03.2011, 12:46:09
Post #2





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post
zundap
post 12.03.2011, 12:51:04
Post #3





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 1.10.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował zundap 12.03.2011, 12:52:22
Go to the top of the page
+Quote Post
gargamel
post 13.03.2011, 16:35:10
Post #4





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

Ostrzeżenie: (0%)
-----


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.


Go to the top of the page
+Quote Post
zundap
post 16.03.2011, 07:09:50
Post #5





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 1.10.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 15:02