在magento1.7中,我在自定义控制器中尝试了类似下面的内容。
public function getPDF()
{
$imagePath=C:\Users\.........;
$image = Zend_Pdf_Image::imageWithPath($imagePath);
$page->drawImage($image, 40,764,240, 820);
.
.
.
$pdf->pages[] = $page;
$pdf->save("mydoc.pdf");
}
它没有错误。它生成带有图像的PDF,但PDF文档保存在magento文件夹中而不是My downloads文件夹中。在做了一些研究后,我发现了一些以下的行,并在$ pdf-> pages [] = $ page;。
之后添加了它们。 $pdfString = $pdf->render();
header("Content-Disposition: attachment; filename=myfile.pdf");
header("Content-type: application/x-pdf");
echo $pdfString;
现在它在“我的下载”文件夹中生成PDF。当我试图打开它。它抛出错误说:Adobe Reader无法打开myfile.pdf,因为它既不是受支持的文件类型,也不是因为文件已损坏............当我们尝试打开时,会发生这种情况在localhost上生成的PDF文档或其他一些原因。请让我知道,为什么会出现此错误,并为我提供解决方案。
答案 0 :(得分:2)
你的问题可能是因为同时调用了save()和render()。
save()实际调用render(),问题可能是由于尝试渲染PDF两次。
这也浪费资源,如果您需要保存文件,最好先保存文件,然后直接将此文件提供给用户。
你可以用普通的旧PHP(使用passthru或readfile)来做到这一点,虽然有很多方法可以在Zendframework中做到这一点,你可以更好地研究:)
// .. create PDF here..
$pdf->save("mydoc.pdf");
$file = 'mydoc.pdf';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
如果你的代码在Magento控制器中:
$this->getResponse()
->setHttpResponseCode(200)
->setHeader('Pragma', 'public', true)
->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0', true)
->setHeader('Content-type', $contentType, true)
->setHeader('Content-Length', filesize($file))
->setHeader('Content-Disposition', 'attachment; filename="'.$fileName.'"')
->setHeader('Last-Modified', date('r'));
$this->getResponse()->clearBody();
$this->getResponse()->sendHeaders();
$ioAdapter = new Varien_Io_File();
if (!$ioAdapter->fileExists($file)) {
Mage::throwException(Mage::helper('core')->__('File not found'));
}
$ioAdapter->open(array('path' => $ioAdapter->dirname($file)));
$ioAdapter->streamOpen($file, 'r');
while ($buffer = $ioAdapter->streamRead()) {
print $buffer;
}
$ioAdapter->streamClose();
exit(0);