Перенос текста в Fpdf на Php

Я пытаюсь обернуть текст в ячейку с помощью FPDF. вот мой код.

<?php
require('fpdf.php');

$pdf = new FPDF();

$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Cell(20,7,'Hi1',1);
$pdf->Cell(20,7,'Hi2',1);
$pdf->Cell(20,7,'Hi3',1);

$pdf->Ln();

$pdf->Cell(20,7,'Hi4',1);
$pdf->Cell(20,7,'Hi5(xtra)',1);
$pdf->Cell(20,7,'Hi5',1);

$pdf->Output();
?>

вывод для этого кода выглядит следующим образом enter image description here

теперь я хочу обернуть этот текст Xtra, который есть в ячейке. Текст xtra должен идти во вторую строку. Как мне это сделать?

когда я использую MultiCell для этой строки $pdf - >MultiCell(20, 7, 'Hi5 (xtra)', 1); он меняется на следующее.. enter image description here

Я пробовал упомянутый ответ по Log1c так получилось enter image description here

7 ответов


использовать MultiCell() вместо Cell()

изменить это:

$pdf->Cell(20,7,'Hi5(xtra)',1);

в:

$pdf->MultiCell( 20, 7, 'Hi5(xtra)', 1);

The MultiCell () используется для печати текста в несколько строк.

EDIT:

Я вижу MultiCell(), ломает линию, поэтому новая ячейка будет помещена ниже текущей позиции.

в таком случае вы можете вычислить x и y координировать и вычислить новое положение и положение после вывода каждая ячейка.

<?php
require('fpdf.php');

$pdf = new FPDF();

$pdf->AddPage();

$start_x=$pdf->GetX(); //initial x (start of column position)
$current_y = $pdf->GetY();
$current_x = $pdf->GetX();

$cell_width = 20;  //define cell width
$cell_height=7;    //define cell height

$pdf->SetFont('Arial','',16);

$pdf->MultiCell($cell_width,$cell_height,'Hi1',1); //print one cell value
$current_x+=$cell_width;                           //calculate position for next cell
$pdf->SetXY($current_x, $current_y);               //set position for next cell to print

$pdf->MultiCell($cell_width,$cell_height,'Hi2',1); //printing next cell
$current_x+=$cell_width;                           //re-calculate position for next cell
$pdf->SetXY($current_x, $current_y);               //set position for next cell

$pdf->MultiCell($cell_width,$cell_height,'Hi3',1);
$current_x+=$cell_width;

$pdf->Ln();
$current_x=$start_x;                       //set x to start_x (beginning of line)
$current_y+=$cell_height;                  //increase y by cell_height to print on next line

$pdf->SetXY($current_x, $current_y);

$pdf->MultiCell($cell_width,$cell_height,'Hi4',1);
$current_x+=$cell_width;
$pdf->SetXY($current_x, $current_y);

$pdf->MultiCell($cell_width,$cell_height,'Hi5(xtra)',1);
$current_x+=$cell_width;
$pdf->SetXY($current_x, $current_y);

$pdf->MultiCell($cell_width,$cell_height,'Hi5',1);
$current_x+=$cell_width;
$pdf->SetXY($current_x, $current_y);

$pdf->Output();
?>

Я не думаю, что Multicell является решением для этого.Проблемы с использованием multicell.

  • разрывы строк enter image description here
  • перекрытия со следующей строкой enter image description here
  • более того, мы не можем предсказать, сколько высоты может пройти ячейка? например: если длина текста первой ячейки 50, а длина второго текста 100, то его высота отличается, поэтому мы не можем создать строку таблицы.

    даже приведенный выше ответ помогает решите только проблему разрыва линии, но не перекрытия.

вот я пришел с новым решением для этого.новая функция vcell () использует только ячейку в ней, чтобы сделать ожидаемый результат успешным.

<?php
require('fpdf.php');
class ConductPDF extends FPDF {
function vcell($c_width,$c_height,$x_axis,$text){
$w_w=$c_height/3;
$w_w_1=$w_w+2;
$w_w1=$w_w+$w_w+$w_w+3;
$len=strlen($text);// check the length of the cell and splits the text into 7 character each and saves in a array 

$lengthToSplit = 7;
if($len>$lengthToSplit){
$w_text=str_split($text,$lengthToSplit);
$this->SetX($x_axis);
$this->Cell($c_width,$w_w_1,$w_text[0],'','','');
if(isset($w_text[1])) {
    $this->SetX($x_axis);
    $this->Cell($c_width,$w_w1,$w_text[1],'','','');
}
$this->SetX($x_axis);
$this->Cell($c_width,$c_height,'','LTRB',0,'L',0);
}
else{
    $this->SetX($x_axis);
    $this->Cell($c_width,$c_height,$text,'LTRB',0,'L',0);}
    }
 }
$pdf = new ConductPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Ln();
$x_axis=$pdf->getx();
$c_width=20;// cell width 
$c_height=6;// cell height
$text="aim success ";// content 
$pdf->vcell($c_width,$c_height,$x_axis,'Hi1');// pass all values inside the cell 
$x_axis=$pdf->getx();// now get current pdf x axis value
$pdf->vcell($c_width,$c_height,$x_axis,'Hi2');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,'Hi3');
$pdf->Ln();
$x_axis=$pdf->getx();
$c_width=20;
$c_height=12;
$text="aim success ";
$pdf->vcell($c_width,$c_height,$x_axis,'Hi4');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,'Hi5(xtra)');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,'Hi5');
$pdf->Ln();
$x_axis=$pdf->getx();
$c_width=20;
$c_height=12;
$text="All the best";
$pdf->vcell($c_width,$c_height,$x_axis,'Hai');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,'VICKY');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,$text);
$pdf->Ln();
$x_axis=$pdf->getx();
$c_width=20;
$c_height=6;
$text="Good";
$pdf->vcell($c_width,$c_height,$x_axis,'Hai');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,'vignesh');
$x_axis=$pdf->getx();
$pdf->vcell($c_width,$c_height,$x_axis,$text);
$pdf->Output();
?>

enter image description here

функции объяснение:

function vcell($c_width,$c_height,$x_axis,$text){
$w_w=$c_height/3;
$w_w_1=$w_w+2;
$w_w1=$w_w+$w_w+$w_w+3;
// $w_w2=$w_w+$w_w+$w_w+$w_w+3;// for 3 rows wrap
$len=strlen($text);// check the length of the cell and splits the text into 7 character each and saves in a array 
if($len>7){
$w_text=str_split($text,7);// splits the text into length of 7 and saves in a array since we need wrap cell of two cell we took $w_text[0], $w_text[1] alone.
// if we need wrap cell of 3 row then we can go for    $w_text[0],$w_text[1],$w_text[2]
$this->SetX($x_axis);
$this->Cell($c_width,$w_w_1,$w_text[0],'','','');
$this->SetX($x_axis);
$this->Cell($c_width,$w_w1,$w_text[1],'','','');
//$this->SetX($x_axis);
// $this->Cell($c_width,$w_w2,$w_text[2],'','','');// for 3 rows wrap but increase the $c_height it is very important.
$this->SetX($x_axis);
$this->Cell($c_width,$c_height,'','LTRB',0,'L',0);
}
else{
    $this->SetX($x_axis);
    $this->Cell($c_width,$c_height,$text,'LTRB',0,'L',0);}
    } 

Я пробую это все решение, но его строка таблицы разрыва выглядит. поэтому я пробую это решение и его помощь мне так много,

$pdf=new PDF_MC_Table();
$pdf->AddPage();
$pdf->SetFont('Arial','',14);
//Table with 20 rows and 4 columns
$pdf->SetWidths(array(30,50,30,40));
srand(microtime()*1000000);
for($i=0;$i<20;$i++)
    $pdf->Row(array("test","test testtesttesttest ","test","test testtesttesttest "));
$pdf->Output();

ссылка: FPDF


Я столкнулся с той же проблемой и пытаюсь найти способ, является ли ячейка достаточно или нет для текста и разделить высоту на количество строк и использовать результат как для конкретной высоты ячейки. Но это только делает код очень сложным. затем я переключаюсь на библиотеку html2pdf. Он создает html-таблицу, в которой нет никакого вышеупомянутого конфликта, и эта страница преобразуется в pdf-файл. Использовать библиотеку html2pdf.. это самый простой способ создания PDF с автоматически делятся клетки. вы можете скачать его здесь и есть много гидов в интернете.


попробуйте это: Вы можете передавать ширины столбцов, выравнивания столбцов, заливки и ссылки в виде массивов. если ширина ряда, это будет ширина всей таблицы.

<?php
require('fpdf.php');
class PDF extends FPDF{
    function plot_table($widths, $lineheight, $table, $border=1, $aligns=array(), $fills=array(), $links=array()){
        $func = function($text, $c_width){
            $len=strlen($text);
            $twidth = $this->GetStringWidth($text);
            $split = floor($c_width * $len / $twidth);
            $w_text = explode( "\n", wordwrap( $text, $split, "\n", true));
            return $w_text;
        };
        foreach ($table as $line){
            $line = array_map($func, $line, $widths);
            $maxlines = max(array_map("count", $line));
            foreach ($line as $key => $cell){
                $x_axis = $this->getx();
                $height = $lineheight * $maxlines / count($cell);
                $len = count($line);
                $width = (isset($widths[$key]) === TRUE ? $widths[$key] : $widths / count($line));
                $align = (isset($aligns[$key]) === TRUE ? $aligns[$key] : '');
                $fill = (isset($fills[$key]) === TRUE ? $fills[$key] : false);
                $link = (isset($links[$key]) === TRUE ? $links[$key] : '');
                foreach ($cell as $textline){
                    $this->cell($widths[$key],$height,$textline,0,0,$align,$fill,$link);
                    $height += 2 * $lineheight * $maxlines / count($cell);
                    $this->SetX($x_axis);
                }
                if($key == $len - 1){
                    $lbreak=1;
                }
                else{
                    $lbreak = 0;
                }
                $this->cell($widths[$key],$lineheight * $maxlines, '',$border,$lbreak);
            }
        }
    }
}
$pdf = new PDF('P','mm','A4');
$lineheight = 8;
$fontsize = 12;
$pdf->SetFont('Arial','',$fontsize);
$pdf->SetAutoPageBreak(true , 30);
$pdf->SetMargins(20, 1, 20);
$pdf->AddPage();

$table = array(array('Hi1', 'Hi2', 'Hi3'), array('Hi4', 'Hi5 (xtra)', 'Hi6'), array('Hi7', 'Hi8', 'Hi9'));
$widths = array(11,11,11);
$pdf->plot_table($widths, $lineheight, $table);
$pdf->Output('Table.pdf', 'I');
return;

должны сделать это: таблица FPDF


<?php 
require "fpdf.php";

$db = new PDO("mysql:host=localhost;dbname=coba","root");
$id="";
class myPDF extends FPDF{
    function header(){
        $this->image('adw1.png',15,10);
		$this->image('huawei.png',235,13);
        $this->SetFont('Times','B',14);
        $this->Cell(276,10,'Berita Acara Barang Keluar',0,0,'C');
        $this->Ln();		
        $this->SetFont('Times','B',12);
        $this->Cell(276,10,'PT ADYAWINSA WEST JAVA',0,0,'C');
        $this->Ln(20);
		$this->SetFont('Times','',10);
        $this->Cell(276,-15,'JL. RUMAH SAKIT NO 108',0,0,'C');
        $this->Ln(5);
		$this->Line(10,36,287,36);
		$this->SetLineWidth(0);
		$this->Line(10,37,287,37);
		$this->Ln(5);
		$this->SetFont('Times','B',8);
		$this->Cell(8,10,'No',1,0,'C');
		$this->Cell(20,10,'Tgl Keluar',1,0,'C');
		$this->Cell(30,10,'Nama Receiver',1,0,'C');
		$this->Cell(60,10,'Nama Barang',1,0,'C');
		$this->Cell(15,10,'Bom Code',1,0,'C');
		$this->Cell(35,10,'Site Name',1,0,'C');
		$this->Cell(20,10,'Site ID',1,0,'C');
        $this->Cell(10,10,'Qty',1,0,'C');
		$this->Cell(10,10,'Unit',1,0,'C');
		$this->Cell(20,10,'Material Type',1,0,'C');
		$this->Cell(20,10,'Nama Project',1,0,'C');
		$this->Cell(30,10,'Keterangan',1,0,'C');
        $this->Ln();
    }
    function footer(){
        $this->SetY(-15);
        $this->SetFont('Arial','',8);
        $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
		$this->SetY(140);
        $this->SetFont('Arial','',10);
        $this->Cell(100,10,'Receiver',0,0,'C');
		$this->SetY(140);
        $this->SetFont('Arial','',10);
        $this->Cell(0,10,'Verified By',0,0,'C');
		$this->SetY(140);
        $this->SetFont('Arial','',10);
        $this->Cell(450,10,'Approved By',0,0,'C');
		$this->SetY(160);
        $this->SetFont('Arial','',10);
        $this->Cell(100,10,'(.........................)',0,0,'C');
		$this->SetY(160);
        $this->SetFont('Arial','',10);
        $this->Cell(0,10,'(.........................)',0,0,'C');
		$this->SetY(160);
        $this->SetFont('Arial','',10);
        $this->Cell(450,10,'(.........................)',0,0,'C');
    }
    function viewTable($db){
		$no=1;
		$id = $_GET['bk_id'];
        $this->SetFont('Times','',6);
        $stmt = $db->query("SELECT tgl_keluar, nama_karyawan, barang_nama, bom_code, site_name, site_id, qty, barang_kategori, material_type, nama_project, keterangan from barang_keluar INNER JOIN bk_detail ON barang_keluar.bk_id = bk_detail.bk_id where barang_keluar.bk_id = '$id'");
		while($data = $stmt->fetch(PDO::FETCH_OBJ))
		{
			$this->Cell(8,10,$no++,1,0,'C');
			$this->Cell(20,10,$data->tgl_keluar,1,0,'C');
			$this->Cell(30,10,$data->nama_karyawan,1,0,'C');
			$this->Cell(60,10,$data->barang_nama,1,0,'C');
			$this->Cell(15,10,$data->bom_code,1,0,'C');
			$this->Cell(35,10,$data->site_name,1,0,'C');
			$this->Cell(20,10,$data->site_id,1,0,'C');
            $this->Cell(10,10,$data->qty,1,0,'C');
			$this->Cell(10,10,$data->barang_kategori,1,0,'C');
			$this->Cell(20,10,$data->material_type,1,0,'C');
			$this->Cell(20,10,$data->nama_project,1,0,'C');
			$this->Cell(30,10,$data->keterangan,1,0,'C');
			$this->Ln();
           
        }
	}
}
$pdf = new myPDF();
$pdf->SetAutoPageBreak(true,70);
$pdf->AliasNbPages();
$pdf->AddPage('L','A4',0);
$pdf->viewTable($db);
$pdf->Output();;

вы должны использовать пространство между словами, если это не будет строка пространства, она останется как есть ... попробуйте следующее

<?php
require('fpdf.php');

$pdf = new FPDF();

$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Cell(20,7,'Hi1',1);
$pdf->Cell(20,7,'Hi2',1);
$pdf->Cell(20,7,'Hi3',1);

$pdf->Ln();

$pdf->Cell(20,7,'Hi4',1);
$pdf->Cell(20,7,'Hi5 (xtra)',1);
$pdf->Cell(20,7,'Hi5',1);

$pdf->Output();
?>

наслаждайтесь :)