我有以下jQuery,它向一个名为html2fpdfconverter.php的php文件发出请求:
$("#exportentry").click(function(e){
e.preventDefault();
if(submitted){
//export
var data = $("#container").html();
var filename = "Entry Report.pdf";
var dateString = $("#datepicker").datepicker().val();
$.ajax({
type:"POST",
url: "html2pdfconverter.php",
data: {data:data, filename:filename, date:dateString},
dataType: "json",
success: function(data) {
//get min max dates assigned
alert('success');
}
})
}else{
alert("No Report To Export");
}
});
html2fpdpf.php
<?php
require('html2fpdf.php');
if(isset($_POST['data'])){
$urlcontents = $_POST['data'];
$filename = $_POST['filename'];
$date = $_POST['date'];
convert($urlcontents, $filename, $date);
}
function convert($contents, $name, $currdate){
$pdf=new HTML2FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10, "Entry Report");
$pdf->SetFont('Arial', '', 12);
$pdf->Cell(90,12,'- '. $currdate);
$contents = strip_tags($contents, '<html><body><meta><img><h2><h4><br><div><ul><li><span>');
$pdf->SetY(20);
$pdf->WriteHTML($contents );
$content = $pdf->Output('', true);
$file = fopen($filename, "w");
fwrite($file, $content);
fclose($file);
}
?>
使用firebug,我可以看到数据被正确地发布到php文件。然而,什么也没发生……没有创建pdf文件,也没有显示下载对话框,尽管firebug说php请求是OK的。
我在firebug中得到以下响应:
% pdf - 1.330对象& lt;>endobj4 0对象& lt;>流
rx�͘��0��}���"BK��e气����交货x��。��Ax_�年代��3. b�我��年代����oJd获得�NN����0���我��l5ān�������DH����L28��。൹����O8 ^ m����e��28我Ē1�NQ = bz��w(�Gl�Ѯ���Z英航美元,8��r���߾�我��= 9�hj¨��l��8 ve�o&�];y xw�����_��' Ey�8 !e��T����ܵ��T���我�F���问题�X8/3�}�̨�> T��~ 5 $
������0��> ?�问:!qH"ۨ"D"xc"
���Ԥ�����͇���hI�cA��l�����ηy�/�՟���rP.���V� T/�u��|���9����U9t�'|IJ��.�c�28+�<ÃX�����U�|�;k�AI�"�[�ȑ��"�6���vYs�����b�)�H퓀�Ph�,���P:T��x�1,,��Ey�b"Mh(��
"ti"。C4D�(���5�Eա,ۃ��^���*4QܧAݑ,!*ص�
/��毫升/�z '; $ C�����x dPId��ƃ]4�0肽yy����B
还有一大堆…
我解决了这个问题。这个问题的解决方案涉及两件事:
- 要转换为PDF的html结构很差,应该检查它。
- 如果HTML是这么好,那么问题是在php.ini,在我的情况下,我使用XAMPP的Windows。c:/xampp/php/php.ini,
variable register_long_array = Off
改为variable register_long_array = On
然后显示IE, Mozilla, Chrome的PDF。
问题是您将内容输出到浏览器,而不是文件。
Try this:
$content = $pdf->Output('', true);
$file = fopen($filename, "w");
fwrite($file, $content);
fclose($file);
编辑:当您确定文件已创建时,您必须使用jQuery处理新创建的pdf的打开。一种方法是创建一个iframe,它在每次导出pdf时更新。
frame = document.getElementById('exportFrame');
frame.innerHTML = "<iframe src='/path/to/file/File.pdf' frameborder='0' scrolling='no' height='0' width='0'></iframe>";
并添加到你的html标记:
<div id='exportFrame'> </div>
参见文档:http://wiki.spipu.net/doku.php?id=html2pdf:en:v4:output这是一个基本的代码,记住检查文件名出于安全原因(永远不要相信用户输入…)。
为了打开浏览器的下载对话框,您必须直接将浏览器(或iframe)指向文件url,这是不可能的打开下载对话框,下载存储在js变量中的数据。
如果您想使用$pdf->Output($name, "D")
直接下载文件(不首先将其保存在磁盘上),您可以通过创建<form>
并使用输入字段发送data
, filename
和dateString
来完成POST请求,然后如果您提交表单,则应该开始下载。