使用PHPDocx将DOCX转换为PDF-存储而不是流式传输到浏览器

使用PHPDocx将DOCX转换为PDF-存储而不是流式传输到浏览器,php,pdf,docx,file-conversion,Php,Pdf,Docx,File Conversion,我的一个项目需要将DOCX转换为PDF。我遇到了这个项目,所有的东西都转换得很好,但是它将文件提供给浏览器,在转换后会提示用户下载。我需要保留文件,只需读取MySQL存储的数据。有什么想法吗 以下是我正在使用的代码: $docx = new TransformDoc(); $docx ->setStrFile($tmpName); $docx ->generatePDF(); 使用下面的Tim修改会产生以下错误: i Warning: session_start() [functi

我的一个项目需要将DOCX转换为PDF。我遇到了这个项目,所有的东西都转换得很好,但是它将文件提供给浏览器,在转换后会提示用户下载。我需要保留文件,只需读取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}
这是我要做的

phpdocx库执行此操作以将pdf流式传输到浏览器

该文件位于第275行或其附近的classes/TransformDoc.inc中(自2012年9月17日下载的版本I起)

查看源代码可以发现,您可以编写自己的函数来执行类似的操作。 下面是一个基于上述函数的未经测试的示例函数

/**
 * 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;
}

如果您在PHP Docx文件中搜索“未知图像类型:”您将在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上找不到用于猜测图像类型的扩展名。我不知道为什么在使用->输出方法的新代码中会出现这种情况,而不是在原始代码中——您可能会认为,无论我们使用哪种方式,生成pdf都是可行的


现在有两种选择:注释掉(或删除)上面引用的抛出新DOMPDF_异常行,或使用原始函数的输出缓冲。

实现这一点的明确方法是编辑提供的文件:

/**
 * 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;
}
/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;
}

查看TransformDoc类,找到一种分配二进制数据而不是输出二进制数据的方法。。无论如何$output=$docx->generatePDF()都可以工作吗?可能是重复的我知道重复的是文本文件,但这是同一个问题,你需要在php页面中添加正确的标题我不确定这是不是标题问题,托比。phpdocx类转换文档并将其返回到浏览器@莫,要是这么容易就好了!这是我尝试的第一件事,但它仍然返回到类中的浏览器。迈克,我有。只是好像找不到。哦,糟了!我已经看了好几个小时了,一遍又一遍地看那个来源!谢谢,@Tim+1给你!我只做了两次快速编辑,确保在阅读完这篇评论后,您能够获取最新的代码。我必须将代码跟踪到pdf/include/dompdf.cls.php中才能找到输出方法。它不接受文件名,但接受选项-phpdocx不发送选项,但如果您愿意,显然可以发送一些选项,无论是谁编写了phpdocx代码,都可能不太了解异常处理—在此处仅回显异常似乎有点毫无意义—最好让它从库中冒泡出来,到达要处理的应用程序。:/哦,对我来说,使用这些更改只会产生错误。我回去拿了你最新的消息来源。我应该在这里发布错误,还是用你的修改和错误开始一个新的问题?也可能docx文件引用了一个没有上传的外部图像。我对docx格式的理解有点超出了我的深度。docx几乎就像一个zip。您甚至可以在zip应用程序中打开DOCX文档。我已经验证了所有东西都在上传。你可以查看DOMPDF项目,看看是否可以将PHP Docx中的代码升级到最新版本-这可能是一个已知的错误,已经修复。已经整理好了!你是个聪明人。蒂姆,介意我在链接到你网站的网站主页上加一个积分吗?