2010-03-12 6 views
9

PHP 및 FPDF를 사용하여 항목 목록이있는 PDF를 생성하고 있습니다. 내 문제는 항목 목록이 두 번째 또는 세 번째 페이지로 이동하는 경우 항목 이름, 수량 및 설명을 함께 유지하고자하는 것입니다. 지금은 두 번째 페이지로 이동하지만 특정 항목에 대한 모든 세부 정보가 분리 될 수 있습니다. 도와주세요!FPDF Page Break 질문

<?php 
require_once('auth.php');  
require_once('config.php'); 
require_once('connect.php'); 

$sqlitems="SELECT * FROM $tbl_items WHERE username = '" . $_SESSION['SESS_LOGIN'] . "'"; 
$resultitems=mysql_query($sqlitems); 

require_once('pdf/fpdf.php'); 
require_once('pdf/fpdi.php'); 


$pdf =& new FPDI(); 
$pdf->AddPage('P', 'Letter');  
$pdf->setSourceFile('pdf/files/healthform/meds.pdf'); 
$tplIdx = $pdf->importPage(1); 
$pdf->useTemplate($tplIdx); 

$pdf->SetAutoPageBreak(on, 30); 

$pdf->SetTextColor(0,0,0); 
$pdf->Ln(10); 

while($rowsitems=mysql_fetch_array($resultitems)){ 

$pdf->SetFont('Arial','B',10); 
$pdf->Cell(50,4,'Item Name:',0,0,'L'); 
$pdf->SetFont(''); 
$pdf->Cell(100,4,$rowsitems['itemname'],0,0,'L'); 

$pdf->SetFont('Arial','B',10); 
$pdf->Cell(50,4,'Quantity:',0,0,'L'); 
$pdf->SetFont(''); 
$pdf->Cell(140,4,$rowsitems['itemqty'],0,1,'L'); 

$pdf->SetFont('Arial','B'); 
$pdf->Cell(50,4,'Description:',0,0,'L'); 
$pdf->SetFont(''); 
$pdf->Cell(140,4,$rowsitems['itemdesc'],0,1,'L'); 
} 

$pdf->Output('Items.pdf', 'I'); 

?> 

답변

10

bmb가 올바른 경로에 있습니다. 다음은 조금 더 자세한 솔루션입니다.

다양한 방법이 있지만 원하는 것을 토대로 결정을 내려야합니다. 페이지의 절반을 차지할 수있는 행이있는 경우이 방법이 가장 효과적 일 수는 없지만 행이 일반적으로 2-5 행 정도이면 좋은 방법입니다.

내 테이블에서 행의 첫 번째 셀이 여러 줄이있는 셀 (FPDF 말하기의 MultiCell)이므로 행은이 첫 번째 셀을 기반으로하는 동적 인 높이입니다. 그래서 행 높이가 셀의 문자열 너비와 너비에 따라 달라지는 지 파악한 다음 현재 Y 위치, 페이지 높이 및 하단 여백을 기준으로 페이지에 남아있는 공간과 비교합니다.

while ($row = mysql_fetch_array($result)) { 

    // multicell content 
    $description = $row['desciption']; 

    // get column width from a column widths array 
    $column_width = $column_widths['description']; 

    $number_of_lines = ceil($pdf->GetStringWidth($description)/($column_width - 1)); 
    // I subtracted one from column width as a kind of cell padding 

    // height of resulting cell 
    $cell_height = 5 + 1; // I have my cells at a height of five so set to six for a padding 
    $height_of_cell = ceil($number_of_lines * $cell_height); 

    // set page constants 
    $page_height = 279.4; // mm (portrait letter) 
    $bottom_margin = 20; // mm 

    // mm until end of page (less bottom margin of 20mm) 
    $space_left = $page_height - $pdf.GetY(); // space left on page 
    $space_left -= $bottom_margin; // less the bottom margin 

    // test if height of cell is greater than space left 
    if ($height_of_cell >= $space_left) { 
    $pdf->Ln();       

    $pdf->AddPage(); // page break. 
    $pdf->Cell(100,5,'','B',2); // this creates a blank row for formatting reasons 
    } 

    // ... 
    // actual creation of pdf stuff 
    // ... 

} 
4

몇 가지 옵션이있는 것 같습니다.

루프를 진행하면서 페이지의 현재 위치를 추적하고 공간이 부족할 때 자신의 페이지 나누기를 실행할 수 있습니다. 자동 페이지 나누기를 해제하려면 SetAutoPageBreak()를 사용해야합니다.

또 다른 방법은 AcceptPageBreak() 메서드를 재정의하는 것입니다. 이 메서드는 페이지 나누기가 추가 될 때 자동으로 호출됩니다. 다른 페이지를 현재 페이지에 집어 넣고 싶다면 FALSE를 반환하면 현재 인쇄중인 세부 정보를 추적해야합니다.

-2

"페이지 나누기 내부"속성은 어떻게됩니까? 나는 테이블 안에 그것을 시도하고 도움이됩니다.

내 행에 "page-break-inside"인라인 CSS 속성을 하드 코딩했으며이 행은 두 페이지에 걸쳐 인쇄 페이지로 전송되었을 때 더 이상 손상되지 않았습니다. 새 페이지로 완전히 밀렸거나 이전 페이지로 이동했습니다. 아마도 그것은 (fPDF 측면의) 동적 수정이 아니지만 여전히 문제를 해결합니다.

+0

이 질문에 대한 답변을 제공하지 않습니다. 작성자의 설명을 비평하거나 요청하려면 게시물 아래에 댓글을 남겨 둡니다. 자신의 게시물에 항상 에 댓글을 달 수 있으며 충분한 평판을 얻으면 어떤 게시물에 대해서도 댓글을 달 수 있습니다. – Ghost

+0

사실 그것은 내 경우에 해결책을 제공해주었습니다. 행이나 표에 "page-break-inside"인라인 CSS 속성을 추가하면이 행/표가 프린터 페이지로 전송되어 두 페이지에 걸쳐 확산 될 때 중단되지 않습니다. fPDF 측면에서 동적 인 것이 아니라면 적어도 하드 코드 된 수정입니다. –