Как да вградите динамични 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'>

Знам, че това ще работи поне в chrome. Не съм го тествал в други браузъри. Може да се наложи да приложите друг начин за вграждане на 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