2

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ドキュメントはMydownloadsフォルダーではなくmagentoフォルダーに保存されます。調査を行った後、次の行のチャンクを見つけて、$ pdf-> pages [] =$page;の後に追加しました。

  $pdfString = $pdf->render();
  header("Content-Disposition: attachment; filename=myfile.pdf");
  header("Content-type: application/x-pdf");
  echo $pdfString;

これで、MyDownloadsフォルダーにPDFが生成されます。開こうとすると。サポートされているファイルタイプではないか、ファイルが破損しているため、Adobe Readerはmyfile.pdfを開くことができませんでした............これは、開こうとしたときに発生します。ローカルホストで生成されたPDFドキュメントまたは他の理由があります。このエラーが発生する理由と、それを解決するための解決策を教えてください。

4

1 に答える 1

2

問題は、save()とrender()の両方を一緒に呼び出すことが原因である可能性があります。

save()は実際にrender()を呼び出します。この問題は、PDFを2回レンダリングしようとしたことが原因である可能性があります。

これもリソースの浪費です。ファイルを保存する必要がある場合は、最初にファイルを保存してから、このファイルをユーザーに直接提供することをお勧めします。

これは、(パススルーまたはreadfileを使用して)プレーンな古いPHPで実行できますが、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);
于 2012-11-20T15:34:26.627 に答える