How to save dynamically generated PDF files into a zip file?
10,939
<?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
//============================================================+
Author by
Michael
Updated on June 24, 2022Comments
-
Michael almost 2 years
I am using the TCPDF library to create PDFs on the fly. For my application, I'd like the user to be able to batch download these documents into a ZIP file containing individual PDF documents. Any ideas on how I might accomplish this?
Below is a test script to try and create three PDFs on the fly. It currently just times out when run.
TCPDF documentation lists different methods for outputting files, but none seem to work:
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'); ?>