如何将动态生成的PDF文件保存到zip文件中?

3
我正在使用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');

?>

这段代码有什么问题吗?它不能正常工作吗? - Glen Solsberry
4
语义有些深奥,但我只想向Windows用户澄清一件事:不存在所谓的“zip文件夹”。Zip文件存在,并且可以在内部模拟文件系统结构。Zip文件只是一个文件。Zip文件夹是一个想象中独角兽居住的地方 :) - user895378
上面的代码不起作用。抛出了一些奇怪的TCPDF错误。我认为我当前的输出,“S”,将文件保存为字符串,这可能是问题所在?http://www.tcpdf.org/doc/classTCPDF.html#a3d6dcb62298ec9d42e9125ee2f5b23a1 - Michael
@rdlowrey 独角兽有什么问题吗?! :) - Michael
4个回答

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){
 ...
}

0

将您的输出调用更改为传递“F”而不是“S”,因为您需要将PDF作为文件才能压缩它。

至于超时,您是否尝试使用set_time_limit()增加PHP超时时间?如果您的服务器允许该函数,请尝试set_time_limit(90)或更长时间以查看脚本是否正常工作。


-2
我不确定这会解决你的问题,但是你需要的不是: $files_to_zip[] = $filename;
而是: $files_to_zip[$i] = $filename;

???


不,他没有。在PHP中,当您使用空括号向数组追加内容时,它会将其附加到末尾,并分配下一个数字索引。 - davidethell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接