Как сохранить динамически сгенерированные PDF-файлы в ZIP-файл? - PullRequest
2 голосов
/ 24 января 2012

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

Ниже приведен тестовый скрипт для создания трех файлов 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');

?>

Ответы [ 4 ]

2 голосов
/ 13 августа 2014
<?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 голосов
/ 29 апреля 2015

напишите это:

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

вместо:

for($i=0;$i < 2 ;$i+1){
 ...
}
0 голосов
/ 16 мая 2012

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

Что касается времени ожидания, вы пытались увеличить время ожидания PHP с помощью set_time_limit ()?Если ваш сервер разрешает эту функцию, просто попробуйте set_time_limit (90) или дольше, если необходимо, чтобы проверить, работает ли скрипт.

0 голосов
/ 16 мая 2012

Я не уверен, что это решит вашу проблему, но вам не нужно:

$files_to_zip[$i] = $filename;

вместо:

$files_to_zip[] = $filename;

???

...