Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Zend_PDF时出现PDF文档错误_Php_Zend Framework_Magento_Magento 1.7_Zend Pdf - Fatal编程技术网

Php 使用Zend_PDF时出现PDF文档错误

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"); }

在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文件夹中,而不是我的下载文件夹中。在做了一些研究之后,我发现了以下几行,并将它们添加到$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);