2012-08-26 49 views
2

在magento1.7中,我在自定义控制器中尝试了类似下面的内容。使用Zend_Pdf的PDF文档错误

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文件夹中,而不是保存在我的下载文件夹中。在做了一些研究之后,我发现了下面几行代码,并在$ 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,因为它不是受支持的文件类型或文件已损坏............发生这种情况时,我们试图打开在本地主机上生成的PDF文档还有其他原因。请让我知道,为什么会发生此错误,并为我提供解决方案。

+1

您能否在文本编辑器中查看PDF文件的内容并查看PDF文件中显示的任何错误或警告信息?它保存的文件有多大? – drew010

+0

另外,您使用不同的文件名(mydoc.pdf vs myfile.pdf)保存文件。 – JamesG

+1

@ drew010:我试图在文本编辑器中打开PDF文档,它包含当前phtml文件(即调用getPDF()函数的文件)和字母数字字符的混合html。我认为,错误发生是由于其中的html内容的存在。该文件的大小超过6500k.Can你帮我解决这个问题... – Nida

回答

2

你的问题可能是由于同时调用save()和render()。

save()实际上调用render(),问题可能是由于试图渲染PDF两次。

这也浪费资源,如果您需要保存文件,最好先保存文件,然后直接将该文件提供给用户。

可以在普通的旧PHP(使用中继或ReadFile的),如果你的代码是Magento的内做到这一点,虽然有方法可以做到这里面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; 
} 
?> 

控制器:

$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); 
+0

为什么使用Varien_Io_File而不是这样:'if(file_exists($ file)){$ this-> getResponse() - > setBody(file_get_contents($ file));}'? – Emi

+0

如果文件很大,当你正在读取完整的东西并将其作为一个字符串存储在响应中时,你会遇到麻烦。 – Andrew

相关问题