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
//============================================================+
Share:
10,939
Michael
Author by

Michael

Updated on June 24, 2022

Comments

  • Michael
    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');
    
    ?>