Как встраивать динамические PDF? - PullRequest
0 голосов
/ 25 июля 2011

У меня есть веб-сайт, который динамически генерирует PDF-файлы с использованием FPDF (из fpdf.org) на основе HTML-формы, переданной в сценарий PHP.На данный момент все работает нормально до того момента, когда информация проходит и FPDF генерирует PDF.Тем не менее, я искал варианты встраивания и не могу заставить его работать должным образом.У меня есть другие области моей страницы, которые встраивают PDF-файлы, но это те, которые я генерирую и сохраняю на сервере.Мой вопрос: возможно ли динамически генерировать PDF и выводить его непосредственно в браузер ($pdf->Output();) внутри выделенной области HTML-страницы?Прямо сейчас он просто генерирует и занимает все окно, но я хотел бы включить в PDF другую информацию, такую ​​как инструкции, а что нет.Я попытался вывести pdf в виде строки в переменную с помощью:

$output = $pdf->Output('','S');

Это вывело информацию в виде строки в переменную $ output;однако я не был уверен, смогу ли я это встроить.Я попытался указать тип MIME (например, application/pdf), но единственным другим доступным атрибутом является src, поэтому я не был уверен, смогу ли я где-нибудь использовать строку.В прошлом я использовал 2 разных метода для встраивания PDF-файлов.теги и Google Viewer для просмотра документов, но, поиграв с ними некоторое время, я не смог заставить это работать = (У кого-нибудь есть идеи?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2013

Если вы используете тот же FPDF, что и я, то у вас уже есть все, что вам нужно!

Просто измените свое 'I' на 'D', чтобы принудительно загружать, а не встроить.

от:

function Output($name='', $dest='')
{
    //Output PDF to some destination
    if($this->state<3)
        $this->Close();
    $dest=strtoupper($dest);
    if($dest=='')
    {
        if($name=='')
        {
            $name='doc.pdf';
            $dest='I';
        }
        else
            $dest='F';
    }
    switch($dest)
    {
        case 'I':
            //Send to standard output
            if(ob_get_length())
                $this->Error('Some data has already been output. Can\'t send PDF file');
            if(php_sapi_name()!='cli')
            {
                //We send to a browser
                header('Content-Type: application/pdf');
                if(headers_sent())
                    $this->Error('Some data has already been output. Can\'t send PDF file');
                header('Content-Length: '.strlen($this->buffer));
                header('Content-Disposition: inline; filename="'.$name.'"');
                header('Cache-Control: private, max-age=0, must-revalidate');
                header('Pragma: public');
                ini_set('zlib.output_compression','0');
            }
            echo $this->buffer;
            break;
        case 'D':
            //Download file
            if(ob_get_length())
                $this->Error('Some data has already been output. Can\'t send PDF file');
            header('Content-Type: application/x-download');
            if(headers_sent())
                $this->Error('Some data has already been output. Can\'t send PDF file');
            header('Content-Length: '.strlen($this->buffer));
            header('Content-Disposition: attachment; filename="'.$name.'"');
            header('Cache-Control: private, max-age=0, must-revalidate');
            header('Pragma: public');
            ini_set('zlib.output_compression','0');
            echo $this->buffer;
            break;
        case 'F':
            //Save to local file
            $f=fopen($name,'wb');
            if(!$f)
                $this->Error('Unable to create output file: '.$name);
            fwrite($f,$this->buffer,strlen($this->buffer));
            fclose($f);
            break;
        case 'S':
            //Return as a string
            return $this->buffer;
        default:
            $this->Error('Incorrect output destination: '.$dest);
    }
    return '';
}
0 голосов
/ 02 июля 2017

Когда вы сохраняете fpdf в виде строки, вы можете использовать php для кодирования его в base64, а затем передать его всему, что вы используете для встраивания вашего pdf в ваш HTML-документ. PHP:

$output = $pdf->Output('','S');
$output = base64_encode($output);

В вашем HTML-документе:

<embed src="data:application/pdf;base64,<?php echo $output ?>" type='application/pdf'>

Я знаю, что это будет работать, по крайней мере, в Chrome. Я не проверял это в других браузерах. Возможно, вам придется реализовать другой способ встраивания PDF-файлов в HTML-страницы для обеспечения поддержки кросс-браузер. Я предполагаю, что вы можете понять это с этого момента. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 25 июля 2011

встроенный PDF основан на возможностях браузера.Вы можете использовать фреймы и показывать инструкции в верхней или левой части страницы, а PDF - в остальных.

и, как вы сказали, вы можете использовать Google docs, но он превращает весь документ в изображения для встраивания..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...