Перенос текста в 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();
?>
вывод для этого кода выглядит следующим образом
теперь я хочу обернуть этот текст Xtra, который есть в ячейке. Текст xtra должен идти во вторую строку. Как мне это сделать?
когда я использую MultiCell для этой строки $pdf - >MultiCell(20, 7, 'Hi5 (xtra)', 1); он меняется на следующее..
Я пробовал упомянутый ответ по Log1c так получилось
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.
- разрывы строк
- перекрытия со следующей строкой
-
более того, мы не можем предсказать, сколько высоты может пройти ячейка? например: если длина текста первой ячейки 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();
?>
функции объяснение:
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();
?>
наслаждайтесь :)