2012-01-23 49 views
1

我正在使用TCPDF庫來即時創建PDF。對於我的應用程序,我希望用戶能夠將這些文檔批量下載到包含單個PDF文檔的ZIP文件中。有關我如何完成此任務的任何想法?如何將動態生成的PDF文件保存到zip文件中?

下面是一個測試腳本,試圖動態創建3個PDF文件。它目前只在運行時超時。

TCPDF文檔列出了不同的方法來輸出文件,但沒有一個似乎工作:

http://www.tcpdf.org/doc/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1

<?php 
/* creates a compressed zip file */ 
function create_zip($files = array(),$destination = '',$overwrite = false) { 
    //if the zip file already exists and overwrite is false, return false 
    if(file_exists($destination) && !$overwrite) { return false; } 
    //vars 
    $valid_files = array(); 
    //if files were passed in... 
    if(is_array($files)) { 
    //cycle through each file 
    foreach($files as $file) { 
     //make sure the file exists 
     if(file_exists($file)) { 
     $valid_files[] = $file; 
     } 
    } 
    } 
    //if we have good files... 
    if(count($valid_files)) { 
    //create the archive 
    $zip = new ZipArchive(); 
    if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
     return false; 
    } 
    //add the files 
    foreach($valid_files as $file) { 
     $zip->addFile($file,$file); 
    } 
    //debug 
    //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status; 

    //close the zip -- done! 
    $zip->close(); 

    //check to make sure the file exists 
    return file_exists($destination); 
    } 
    else 
    { 
    return false; 
    } 
} 
date_default_timezone_set('America/Los_Angeles'); 

$files_to_zip = array(); 

require_once('../../libraries/tcpdf/tcpdf.php'); 

for($i=0;$i < 2 ;$i+1){ 

    $pdf = new TCPDF(); 

    $pdf->AddPage('P', 'Letter'); 

    $txt = 'Test '.$i; 

    $pdf->MultiCell(1, 1, $txt); 

    $filename = $pdf->Output('test'.$i.'.pdf', 'S'); 

    $files_to_zip[] = $filename; 

} 

//if true, good; if false, zip creation failed 
$result = create_zip($files_to_zip,'my-archive.zip'); 

header('Content-type: application/zip'); 
header('Content-Disposition: attachment; filename="my-archive-test.zip"'); 
readfile('my-archive-test.zip'); 

?> 
+0

這有什麼代碼問題?它不起作用嗎? –

+3

這裏的語義,但我只是想澄清一件事情給Windows用戶:沒有* * zip文件夾這樣的事情。* Zip文件存在,可以在內部模仿文件系統結構。一個* zip文件*只是一個文件。一個* zip文件夾*是一個假想的地方,獨角獸住:) – rdlowrey

+0

上面的代碼不工作。拋出一些奇怪的TCPDF錯誤。我相信我目前的輸出「S」將文件保存爲字符串,這可能是問題所在? http://www.tcpdf.org/doc/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1 – Michael

回答

-2

我不知道,這將解決您的問題,但不要你需要:而不是

$files_to_zip[$i] = $filename;

$files_to_zip[] = $filename;

???

+0

不,他不。在PHP中,當你添加一個帶有空括號的數組時,它只是在最後加上下一個數字索引。 – davidethell

0

更改您的通話輸出,因爲你需要將PDF作爲文件,以壓縮它傳遞的,而不是「S」「F」。

至於超時,你有沒有試着用參數或者set_time_limit提高PHP超時()?如果您的服務器允許該功能,只需嘗試set_time_limit(90)或更長時間以查看腳本是否正常工作。

2
<?php 

require_once('tcpdf_include.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('Somnath Paul'); 
$pdf->SetTitle('TCPDF Example with ZIP'); 
$pdf->SetSubject('TCPDF '); 
$pdf->SetKeywords('TCPDF'); 

// set default header data 
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128)); 
$pdf->setFooterData(array(0,64,0), array(0,64,128)); 

// 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 default font subsetting mode 
$pdf->setFontSubsetting(true); 

// Set font 
// dejavusans is a UTF-8 Unicode font, if you only need to 
// print standard ASCII chars, you can use core fonts like 
// helvetica or times to reduce file size. 
$pdf->SetFont('dejavusans', '', 14, '', true); 

// Add a page 
// This method has several options, check the source code documentation for more information. 
$pdf->AddPage(); 

// set text shadow effect 
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal')); 

// Set some content to print 
$html = <<<EOD 
<h1>This is a sample PDF </h1> 
EOD; 

// Print text using writeHTMLCell() 
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true); 

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

// Close and output PDF document    

$pdf->Output('example_001.pdf', 'F'); 

// ZIP the PDF file 

$temp_file_name = 'my-pdf.zip'; 

$zip = new ZipArchive(); 
$file = $temp_file_name; 
$zip->open($file, ZipArchive::OVERWRITE); 
$zip->addFile('example_001.pdf', 'a.pdf'); 
$zip->close(); 


header('Content-type: application/zip'); 
header('Content-Disposition: attachment; filename="my-pdf.zip"'); 
readfile('my-pdf.zip'); 


//============================================================+ 
// END OF FILE 
//============================================================+ 
0

這樣寫:

for($i=0;$i < 2 ;$i = $i+1){ 
... 
} 

代替:

for($i=0;$i < 2 ;$i+1){ 
... 
} 
相關問題