Можно ли визуализировать PDF (fPDF) через JavaScript? - PullRequest
0 голосов
/ 07 января 2011

Итак, я передаю некоторые значения через jQuery на сервер, который генерирует искажения PDF.Это выглядит примерно так:

$.post('/admin/printBatch',
data, // Some vars and such
function(data){
    if(data) {

        var batch =  window.open('','Batch Print','width=600,height=600,location=_newtab');
        var html = data; // Perhaps some header info here?!
        batch.document.open();
        batch.document.write(html);
        batch.document.close();

        $( this ).dialog( "close" ); // jQuery UI
    } else {
        alert("Something went wrong, dawg.");
    }
    return false;
});

Выходной файл выглядит примерно так:

$pdf->AddPage(null, null, 'A PDF Page');
//....
$pdf->Output('', 'I'); // 'I' sends the file inline to the browser (http://fpdf.org/en/doc/output.htm)

Что отображается в окне браузера:

%PDF-1.3 3 0 obj <> endobj 4 0 obj <> stream ...

IЯ что-то упускаю, я просто знаю ... мысли?

Спасибо, ребята.

Ответы [ 4 ]

3 голосов
/ 07 января 2011

Судя по всему, PDF достаточно хорошо сформирован.Таким образом, я подозреваю, что вам просто нужно установить соответствующий заголовок содержимого при выводе PDF через PHP, используя функцию header :

header('Content-type: application/pdf');

Примечание: это необходимо будет первым выводом из PHP - он не будет работать, если есть предшествующий HTML, пробел и т. Д.

В идеальном мире вы также устанавливаете длину контента и т. Д. С помощью...

header('Content-Length: '.filesize($pathToYourPDF));

... или ...

header('Content-Length: '.strlen($pdfData));

... если вы генерируете PDF программно.

ОБНОВЛЕНИЕ

Чтобы уточнить, Я подозреваю, что вам нужно изменить ваш window.open, чтобы читать вышеупомянутое непосредственно с URL-адреса, обслуживаемого PHP , чтобы вышеуказанное работало.(Не совсем уверен, почему вы не просто делаете это в первую очередь, но я думаю, что есть веская причина.)

0 голосов
/ 09 марта 2018

Это сработало для меня: замените

$pdf->Output('', 'I');

на

$return = $pdf->Output('name.pdf', 'S');
$return = base64_encode();
$return = 'data:application/pdf;base64,'.$return;
echo json_encode($return);

Теперь вы должны в своем файле JavaScript получить возврат и открыть новое окно

success: function( data ) {
    var pdf = JSON.parse(data);
    window.open(pdf);
}

Откроется новая вкладка в вашем браузере с PDF.

0 голосов
/ 07 января 2011

Я бы предпочел установить URL для всплывающего окна, указывая на скрипт php, который выводит PDF.

Если вам абсолютно необходимо сделать это таким образом, data-uri может помочь:

var batch =  window.open(
                    'data:application/pdf,'+encodeURIComponent(data),
                    'Batch Print',
                    'width=600,height=600,location=_newtab'
             );

но я не проверял его, и даже если он работает в обычных браузерах, в IE он обязательно потерпит неудачу.

0 голосов
/ 07 января 2011

Я проверил это для своего приложения и пришел к выводу, что вы должны использовать iframe (где show_pdf возвращает "$ pdf-> Output ('', 'I');"):

$.ajax({
 url: "http://www.somesite.com/documents/generatePDF",
 success: function(){
  $('#theDocument').html('<iframe id="some_id" class="some_pdf" style="display:none" src="http://www.somesite.com/documents/show_pdf" width="100%" height="450" scrollbar="yes" marginwidth="0" marginheight="0" hspace="0" align="middle" frameborder="0" scrolling="yes" style="width:100%; border:0;  height:450px; overflow:auto;"></iframe>');
 }
});
$('#dialog-document').dialog('open');
...