2

私のプロジェクトの 1 つで、DOCX を PDF に変換する必要があります。私はphpdocxプロジェクトに出会い、すべてが正常に変換されましたが、ファイルをブラウザーに提供し、変換後にユーザーにダウンロードを促します。ファイルを保持する必要があります。MySQL ストレージのデータを読み取るだけです。何か案は?

私が使用しているコードは次のとおりです。

$docx = new TransformDoc();
$docx ->setStrFile($tmpName);
$docx ->generatePDF();

以下の Tim の変更を使用すると、次のエラーが発生します。

i
Warning: session_start() [function.session-start]:
Cannot send session cache limiter - headers already sent
(output started at /home/zbtech/public_html/DocCon/classes/TransformDoc.inc:1)
in /home/zbtech/public_html/scribpub.php on line 5

Unable to generate PDF file string. exception 'DOMPDF_Exception' with message
'Unknown image type: files/files_/tmp/phpNQFatu/media/word/.'

in /home/zbtech/public_html/DocCon/pdf/include/image_cache.cls.php:175 Stack trace:

#0 /home/zbtech/public_html/DocCon/pdf/include/image_frame_decorator.cls.php(88): 
Image_Cache::resolve_url('files/files_/tm...', NULL, '', '')

#1 /home/zbtech/public_html/DocCon/pdf/include/frame_factory.cls.php(173): Image_Frame_Decorator-
>__construct(Object(Frame), Object(DOMPDF)) 

#2 /home/zbtech/public_html/DocCon/pdf/include/dompdf.cls.php(499): Frame_Factory::decorate_frame
(Object(Frame), Object(DOMPDF)) #3 /home/zbtech/public_html/DocCon/classes/TransformDoc.inc
(282): DOMPDF->render() #4 /home/zbtech/public_html/scribpub.php(68): TransformDoc->generatePDF

() #5 {main}
4

3 に答える 3

4

これが私がすることです。

phpdocx ライブラリはこれを行い、pdf をブラウザーにストリーミングします。

これは、classes/TransformDoc.inc の 275 行目あたりにあります (2012 年 9 月 17 日にダウンロードしたバージョンの時点で)。

public function generatePDF()
{
    $this->generateXHTML();
    $this->cleanXHTML();
    try {
        $domPDF = new DOMPDF();
        $domPDF->load_html($this->_xhtml);
        $domPDF->render();
        $fileName = $this->getFileName() . '.pdf';
        $domPDF->stream($fileName);
    }
    catch (Exception $err) {
        echo 'Unable to generate PDF file. ';
        echo $err;
    }
}

ソースを見ると、同様のことを行う独自の関数を作成できることがわかります。以下は、上記の関数に基づくテストされていない関数の例です。

/**
 * Convert DOCX to PDF, using dompdf. DOCX->XHTML->PDF and returns in a string
 *
 * @access public
 */
public function generatePDF()
{
    $this->generateXHTML();
    $this->cleanXHTML();
    try {
        $domPDF = new DOMPDF();
        $domPDF->load_html($this->_xhtml);
        $domPDF->render();
        $out = $domPDF->output();
    }
    catch (Exception $err) {
        echo 'Unable to generate PDF file string. ';
        echo $err;
    }

    return $out;
}
于 2012-09-17T15:12:29.400 に答える
2

PHP Docx のファイルで「Unknown image type:」を検索すると、pdf/include/image_cache.cls.php で見つかります。

// line 81
static function resolve_url($url, $proto, $host, $base_path) {
...
// line 168
$resolved_url = build_url($proto, $host, $base_path, $url);
if ($DEBUGPNG) print 'build_url('.$proto.','.$host.','.$base_path.','.$url.')('.$resolved_url.')';

if ( !preg_match("/.*\.(\w+)/",$url,$match) ) {
    //debugpng
    if ($DEBUGPNG) print '[resolve_url exception '.$url.']';
      throw new DOMPDF_Exception("Unknown image type: $url.");
    }
    ....

画像の種類を推測するための URL の拡張子が見つからないため、コードはこのエラーをスローしています。元のコードではなく、 ->output メソッドを使用する新しいコードでこれが発生する理由はわかりません.pdfの生成は、どの方法を使用しても機能すると思います。

上記の throw new DOMPDF_Exception 行をコメントアウト (または削除) するか、元の関数で出力バッファリングを使用するかの 2 つの選択肢があります。

于 2012-09-17T16:56:37.750 に答える
0

これを実現する明確な方法は、提供されたファイルを編集することです。

/phpdocx/examples/easy/createPDF.php

public function generatePDF($outputFileName)
{
    $this->generateXHTML();
    $this->cleanXHTML();
    try {
        $domPDF = new DOMPDF();
        $domPDF->load_html($this->_xhtml);
        $domPDF->render();
        //
        // ADD THIS: (dont forget the outputFileName method argument)
        //
        $handler = fopen($outputFileName,'w');
        fwrite($handler, $domPDF->output());
        fclose($handler);
    }
    catch (Exception $err) {
        echo 'Unable to generate PDF file string. ';
        echo $err;
    }

    return $out;
}
于 2013-01-19T00:30:55.350 に答える