Как встроить динамические PDF-файлы?

У меня есть веб-сайт, который динамически генерирует 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, но, поиграв с ними некоторое время, я не смог заставить это работать =( У кого-нибудь есть идеи?


person user861020    schedule 25.07.2011    source источник


Ответы (3)


Когда вы сохраняете 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'>

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

person Nick    schedule 02.07.2017

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

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

person Mihai Iorga    schedule 25.07.2011
comment
Да, у меня нет проблем с простым встраиванием PDF-файлов, которые я сохранил, на сервер (например, если они созданы с помощью FPDF и сохранены), но проблема возникает, когда я не сохраняю PDF-файл. Обычно он просто открывается в браузере, но я хочу встроить это ... вместо того, чтобы занимать весь экран? - person user861020; 25.07.2011
comment
как я уже сказал, в одном кадре вы можете сгенерировать pdf, просто передайте правильные заголовки header("Content-type:application/pdf"); - person Mihai Iorga; 25.07.2011
comment
Извините, как я указал в своем вопросе ... Я уже сделал это, и это не сработало, но я думаю, что это как-то связано с FPDF. Я использовал фреймы и теги для встраивания, а также заголовки/типы и просматривал их в 5 разных браузерах. Это не работает. Если вы уверены, что это работает... у вас есть пример кода? Возможно, я делаю что-то неправильно. - person user861020; 26.07.2011

Если вы используете тот же 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 '';
}
person Grizly    schedule 10.12.2013