Php 使用Zend_PDF时出现PDF文档错误
在magento1.7中,我在我的自定义控制器中尝试了如下内容Php 使用Zend_PDF时出现PDF文档错误,php,zend-framework,magento,magento-1.7,zend-pdf,Php,Zend Framework,Magento,Magento 1.7,Zend Pdf,在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"); }
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文档时,或者由于其他原因,就会发生这种情况。请让我知道发生此错误的原因,并为我提供解决方案 您的问题可能是由于同时调用save()和render()造成的 save()实际上调用了render(),问题可能是由于尝试两次呈现PDF 这也是对资源的浪费,如果需要保存文件,最好先保存文件,然后直接将文件提供给用户 您可以在普通的旧PHP(使用passthru或readfile)中实现这一点,尽管在Zendframework中有更好的实现方法:) 如果您的代码位于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);
您是否可以在文本编辑器中查看PDF文件的内容,并在PDF文件中显示PHP错误或警告之类的内容?它保存的文件有多大?@drew010:我试图在文本编辑器中打开PDF文档,它包含当前phtml文件(即调用函数getPDF()的文件)和字母数字字符的混合html。我认为,错误是由于其中存在html内容。文件大小超过6500k。您能帮我解决这个问题吗…@JamesG:不,我们是否使用不同的文件名保存文件并不重要。如果我用“myfile.pdf”名称保存文件,同样的错误仍然会发生。@Nida初学者在输出pdf之前添加这些行,如果行得通,我将添加它作为答案<代码>$this->\u helper->viewRenderer->setNoRender(true)$此->_helper->layout()->disableLayout()代码>这是标准的ZF代码,用于防止布局和动作视图被渲染,希望在Magento中也有相同的帮助程序。另外,“我的文档”也不好。你需要“my_documents”来给它一个公平的机会。为什么要使用Varien_Io_文件而不是像这样的东西:
如果(File_存在($File)){$this->getResponse()->setBody(File_get_contents($File));}
?如果文件很大,你在读取完整内容并将其作为字符串存储在响应中时会遇到麻烦。。
$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);