2014-09-30 144 views
2

我正尝试使用TCPDF库生成PDF。到目前为止,我能够使用PHP代码生成PDF文件。虽然它不呈现外部CSS,并且结果变得无用,因为没有CSS,文档不可读。TCPDF不呈现外部CSS

以下是我的控制器代码:

public function generate_pdf() { 

     $this->load->model('rosters', 'roster'); 

     $data = array(); 

     $data['start_date'] = isset($_POST['fortnightStartDate']) ? 
      date("Y-m-d", strtotime(getFortnightStartDate($_POST['fortnightStartDate']))) : 
      getFortnightStartDate(); 
     $cid = $_POST['cid']; 
     $wno = $_POST['wno']; 


     $data['no']=$wno; 

     $startDate = strtotime($data['start_date']); 

     $data['schedule'] = $this->roster->getShifts($cid, $data); 

     $data['startDate'] = $startDate; 


     $listing = $this->load->view('roster/roster_pdf', $data, true); 


     /** 
* Creates an example PDF TEST document using TCPDF 
* @package com.tecnick.tcpdf 
* @abstract TCPDF - Example: XHTML + CSS 
* @author Nicola Asuni 
* @since 2010-05-25 
*/ 

// Include the main TCPDF library (search for installation path). 
require_once(APPPATH.'libraries/tcpdf/tcpdf.php'); 

// create new PDF document 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

// set document information 
$pdf->SetCreator(PDF_CREATOR); 
$pdf->SetAuthor('Nicola Asuni'); 
$pdf->SetTitle('TCPDF Example 061'); 
$pdf->SetSubject('TCPDF Tutorial'); 
$pdf->SetKeywords('TCPDF, PDF, example, test, guide'); 

// set default header data 
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 061', PDF_HEADER_STRING); 

// set header and footer fonts 
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); 

// set default monospaced font 
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 

// set margins 
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); 
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER); 
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER); 

// set auto page breaks 
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 

// set image scale factor 
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 

// set some language-dependent strings (optional) 
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) { 
    require_once(dirname(__FILE__).'/lang/eng.php'); 
    $pdf->setLanguageArray($l); 
} 

// --------------------------------------------------------- 

// set font 
$pdf->SetFont('helvetica', '', 10); 

// add a page 
$pdf->AddPage(); 


$pdf->writeHTML($listing, true, false, true, false, ''); 

//Close and output PDF document 
$pdf->Output('TEST.pdf', 'F'); 

    } 

我传递的$listing变量,它认为需要被包括在PDF中的数据。数据打印正常,但没有CSS。如果我尝试包含外部CSS,它会弹出错误。

代码包括外部CSS

$listing. = '<style>'.file_get_contents(base_url("styles/style.css")).'</style>'; 

我尝试包括$listing变量下面这行代码,但它会产生以下错误:

A PHP Error was encountered 

Severity: Warning 

Message: array_merge(): Argument #2 is not an array 

Filename: tcpdf/tcpdf.php 

Line Number: 16375 

是否有其他方法可以让我加载外部CSS? 任何帮助将不胜感激。

回答

4

在研究这里和那里后,我知道TCPDF库有限制,包括CSS限制,并且不支持许多CSS属性。然后,我看着dompdf库,发现它很有用。令人惊讶的是,它解决了我几乎相似代码的所有问题,而且它比TCPDF更容易使用。以下是我的一段代码,我写了解决我的问题(代码是类似的,直到$listing变量的话,我只需要改变库代码。)

$listing .= '<style>'.file_get_contents(base_url("styles/style.css")).'</style>'; 


     require_once(APPPATH.'libraries/dompdf/dompdf_config.inc.php'); 

     $dompdf = new DOMPDF(); 
     $dompdf->load_html($listing); 
     $dompdf->set_paper('a4', 'landscape'); 
     $dompdf->render(); 

     file_put_contents('my_pdf_test.pdf', $dompdf->output()); 
     //$dompdf->stream("dompdf_out.pdf", array("Attachment" => true)); 
     exit(0); 
+0

是DOMPDF慢的吗? – 2016-09-15 14:00:16

+1

不幸的是,DOMPDF非常慢。它对于小文档非常有用,但是如果你希望它能够渲染超过几页,那么它会非常慢,或者完全失败,特别是如果你使用页面跨越的HTML表格。 – JoeP 2017-03-31 12:41:50