2012-01-23 1 views
1

Я использую библиотеку TCPDF для создания PDF-файлов на лету. Для моего приложения я хотел бы, чтобы пользователь мог загружать эти документы в ZIP-файл, содержащий отдельные документы PDF. Любые идеи о том, как я могу это сделать?Как сохранить динамически создаваемые PDF-файлы в zip-файл?

Ниже приведен тестовый сценарий, чтобы попытаться создать три 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 * - это просто файл. A * 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

Измените свой выходной вызов, чтобы передать 'F' вместо 'S', поскольку вам нужен PDF-файл в качестве файла, чтобы его можно было закрепить.

Что касается тайм-аута, вы пробовали увеличить тайм-аут PHP с помощью set_time_limit()? Если ваш сервер позволяет этой функции просто попробовать 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){ 
... 
} 
Смежные вопросы