2016-05-31 5 views
0

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

Проблема заключается в том, что TCPDF генерирует PDF, но вместо загрузки, он передает его яваскрипт cosole. Когда я не использую AJAX, он работает отлично.

Вот код AJAX:

// Get the d3js SVG element 
var tmp = document.getElementById("elemPD5graf"); 
var svg = tmp.getElementsByTagName("svg")[0]; 

// Extract the data as SVG text string 
var svg_xml = (new XMLSerializer).serializeToString(svg); 

var j = jQuery.noConflict(); 
var parameters = { datos : svg_xml }; 
j.ajax({ 
    type: 'POST', 
    url: 'generarPDF.php', 
    data : parameters, 
    success: function(result) { 
     console.log(result); 
    } 
}); 

А вот PHP код:

<?php 
// Include the main TCPDF library (search for installation path). 
require_once('..\tcpdf\tcpdf.php'); 
// create new PDF document 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

// set default header data 
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 058', PDF_HEADER_STRING); 

// set header and footer fonts 
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); 

// set default monospaced font 
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 

// set margins 
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); 
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER); 
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER); 

// set auto page breaks 
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); 

// set image scale factor 
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 

// --------------------------------------------------------- 

// set font 
$pdf->SetFont('helvetica', '', 10); 

// add a page 
$pdf->AddPage(); 

// NOTE: Uncomment the following line to rasterize SVG image using the ImageMagick library. 
//$pdf->setRasterizeVectorImages(true); 
$svg2 = $_POST['datos']; 

$pdf->ImageSVG($file='@'.$svg2, $x=15, $y=30, $w='', $h='', $link='http://www.tcpdf.org', $align='', $palign='', $border=1, $fitonpage=false); 

// --------------------------------------------------------- 

//Close and output PDF document 
$pdf->Output('nuevo.pdf', 'D'); 
//============================================================+ 
// END OF FILE 
//============================================================+ 
?> 

Заранее спасибо за помощь.

+0

Вы пробовали сохранения PDF и возвращая URL сохраненного файла, вместо того, чтобы вернуться содержание PDF? – Timothy

+0

@Timothy С помощью метода «Выход» в PHP-коде предлагается сохранить PDF-файл. Он работает, когда я не использую AJAX. –

+0

Вы используете метод вывода '' D'', это отправит документ в ваш браузер и начнет загрузку. Это не будет работать, когда вы получите его через звонок AJAX. – Timothy

ответ

2
$returnValue = $pdf->Output($name, $destination); 

$ назначения может принимать одно из следующих значений:

I: send the file inline to the browser (default). The name given by name is used when one selects the "Save as" option on the link generating the PDF.

D: send to the browser and force a file download with the name given by name.

F: save to a local server file with the name given by name.

S: return the document as a string (name is ignored).

FI: equivalent to F + I option

FD: equivalent to F + D option

E: return the document as base64 mime multi-part email attachment (RFC 2045)

Ошибка Unable to create output file означает, что TCPDF не может написать документ в папку. Укажите допустимый путь в $name.

+1

Он работает, спасибо. –

+0

@timothy ссылка на документацию, которую вы предоставили, больше не работает. Можете ли вы предоставить альтернативу – Annapurna

+0

@Annapurna https://tcpdf.org/docs/srcdoc/tcpdf/class-TCPDF/#_Output.Я не могу найти обновленный URL-адрес, который предоставил бы дополнительную информацию, отличную от информации, которую я уже имел в этом ответе. Я удалю URL из моего ответа – Timothy

0

Ф распечатываются на консоль Javascript из-за вашу линию

console.log(result); 

Возможных решений:

  • сохранить документ во временном файле на сервере и возвращают URL к этому файлу, Затем вы назначаете location.href.
  • Не использовать Ajax, но вместо <form>.
  • Вы можете попробовать document.write(result)
+0

Если я пытаюсь использовать форму, я получаю сообщение об ошибке, которое говорит о том, что URL-адрес слишком длинный. –

+0

возможно попытаться использовать 'метод =«POST»' вместо 'GET' в вашей форме – Timothy

+0

Это очень важно в связи с тем, что вы используете' $ _POST' в вашем PHP скрипт. –

0

У меня была такая же проблема, когда вы пытались загрузить PDF-код в POST-вызов, попробуйте позвонить вам на страницу generarPDF.php напрямую (с GET) и будет работать в корне.