Преобразование DOCX в PDF с использованием PHP Docx — сохранение вместо потоковой передачи в браузер

Один из моих проектов требует преобразования DOCX в PDF. Я наткнулся на проект phpdocx, и все отлично конвертируется, но он передает файл в браузер, который предлагает пользователю скачать после конвертации. Мне нужно сохранить файл, просто прочитайте данные для хранилища MySQL. Любые идеи?

Вот код, который я использую:

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

Использование приведенных ниже модификаций Тима приводит к следующей ошибке:

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}

person Zac Brown    schedule 17.09.2012    source источник
comment
Посмотрите на класс TransformDoc и найдите способ назначать двоичные данные вместо их вывода.   -  person Mike B    schedule 17.09.2012
comment
Не играл с phpdocx. В любом случае $output=$docx-›generatePDF() будет работать?   -  person Moe Tsao    schedule 17.09.2012
comment
возможный дубликат загрузки текстового файла вместо открытия в браузер   -  person Toby Allen    schedule 17.09.2012
comment
Я знаю, что дубликат предназначен для текстового файла, но это та же проблема, вам нужно добавить правильные заголовки на вашу php-страницу.   -  person Toby Allen    schedule 17.09.2012
comment
Я не уверен, что это проблема с заголовком, Тоби. Класс phpdocx преобразует документ и возвращает его в браузер. @Moe, если бы это было так просто! Это первое, что я попробовал, но оно все равно возвращается в браузере в классе. Майк, у меня есть. Просто не могу найти.   -  person Zac Brown    schedule 17.09.2012


Ответы (3)


Вот что я бы сделал.

Библиотека phpdocx делает это для потоковой передачи pdf в браузер.

Это находится в classs/TransformDoc.inc в строке 275 или около того (начиная с версии, которую я скачал 17 сентября 2012 г.)

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;
}
person Tim G    schedule 17.09.2012
comment
О, ДУХ! Я просматривал этот источник снова и снова в течение пары часов! Спасибо, @Тим!! +1 для вас! - person Zac Brown; 17.09.2012
comment
Я только что сделал 2 быстрых редактирования - после прочтения этого комментария убедитесь, что вы взяли самый последний код. - person Tim G; 17.09.2012
comment
Мне пришлось проследить код в pdf/include/dompdf.cls.php, чтобы найти метод output. Он не принимает имя файла, но принимает параметры - phpdocx не отправляет параметры, но, по-видимому, есть параметры, которые можно отправить, если вы хотите. - person Tim G; 17.09.2012
comment
кроме того, тот, кто написал код phpdocx, может не очень хорошо понимать обработку исключений - кажется немного бессмысленным просто повторять здесь исключение - было бы лучше позволить ему всплыть из библиотеки в приложение для обработки. :/ Ну что ж. - person Tim G; 17.09.2012
comment
Использование этих изменений приводит только к ошибке для меня. Я вернулся и взял ваш обновленный источник. Должен ли я опубликовать ошибку здесь или начать новый вопрос с вашими изменениями и ошибкой? - person Zac Brown; 17.09.2012
comment
Здорово! Кажется, вы знаете, о чем говорите! Я добавлю ошибку к исходному сообщению. - person Zac Brown; 17.09.2012
comment
что такое бродячий я? похоже, вы добавили символ в строку 1 файла: /home/zbtech/public_html/DocCon/classes/TransformDoc.inc - person Tim G; 17.09.2012
comment
Ага! Это было. Я исправил это после того, как заметил это в обновленном посте. - person Zac Brown; 17.09.2012

Если вы будете искать в файлах 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-адресе, чтобы угадать тип изображения. Я понятия не имею, почему это происходит с новым кодом, использующим метод ->output, а не с исходным кодом — можно подумать, что создание PDF-файла будет работать независимо от того, какой способ мы используем.

Теперь есть два варианта: закомментировать (или удалить) строку throw new DOMPDF_Exception, упомянутую выше, или использовать буферизацию вывода с исходной функцией.

person Tim G    schedule 17.09.2012
comment
также возможно, что файл docx ссылается на внешнее изображение, которое не загружается. Я немного не в своем понимании формата docx. - person Tim G; 17.09.2012
comment
DOCX очень похож на почтовый индекс. Вы даже можете открывать документы DOCX в zip-приложениях. Я проверил, что все загружается. - person Zac Brown; 17.09.2012
comment
вы можете просмотреть проект DOMPDF code.google.com/p/dompdf и посмотреть, вы можете обновить код внутри PHP Docx до последней версии — это может быть известная ошибка, которая была исправлена. - person Tim G; 17.09.2012
comment
code.google.com/p/dompdf/issues/ - person Tim G; 17.09.2012
comment
Разобрался! Вы блестящий человек. Не возражаете, если я размещу кредит на главной странице сайта, связанной с вашим сайтом, Тим? - person Zac Brown; 20.09.2012
comment
Тим, я добавил ссылку на домашнюю страницу в нижней части окна социальных сетей справа. (scribbler.me) Мы оставим его там на какое-то время, возможно, вы направите немного трафика! Еще раз спасибо за всю вашу помощь! - person Zac Brown; 20.09.2012

Ясный способ добиться этого - отредактировать предоставленный файл:

/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;
}
person christian    schedule 19.01.2013