【问题标题】:TCPDF Progress BarTCPDF 进度条
【发布时间】:2014-03-14 09:02:17
【问题描述】:

我正在使用 php 和 TCPDF 从多个 MySQL 查询生成自定义 PDF 文件。一旦用户单击“生成 PDF”按钮,就会打开一个新选项卡并开始 PDF 过程。构建 PDF 平均需要大约 10 秒。文件准备好后,浏览器会关闭空白页面并显示另存为对话框窗口。

我想在创建 PDF 时向用户显示某种类型的消息。谈到 AJAX/JQUERY,我有点菜鸟,但我尝试实施了几种解决方案,但都没有成功。

注意事项:

  1. 后端是 Joomla!
  2. 使用$pdf->Output('example.pdf','D') 生成pdf
  3. $pdf-Output 之前使用 ob_end_clean 以避免“TCPD:数据已输出”错误。

我尝试了在页面末尾添加<div> 的方法以及在页面加载时显示动画 gif 的一些 jQuery/CSS。它没有用,我不知何故觉得这是由 ob_end_clean 或 Joomla!框架。

【问题讨论】:

  • 我建议您设置Header('Content-disposition: attachment'),这样就不会打开任何窗口。这样,我相信文件只会通过浏览器的普通文件下载器下载。像这样的东西:header('Content-Disposition: attachment; filename="downloaded.pdf"');header('Content-type: application/pdf');
  • 我正在通过 POST 将所需信息发送到新页面。由于我们在 TCPDF 中使用的 HTML/CSS 格式,我无法在同一页面上输出 PDF。它非常敏感,因此首选在干净的页面上构建 PDF。我也不能切换 PDF 类,因为它花了很长时间才用 TCPDF 做到这一点。
  • 我了解,我也使用过 TCPDF。如果你想要一个进度条,你将不得不通过 AJAX 发送你的 POST 数据。
  • 那么如果我通过 AJAX 发送 POST 数据,我之前描述的 AJAX 方法应该可以工作吗?
  • ajax是用来接收数据和改变进度条值的,首先你必须在服务器端处理进度状态

标签: php jquery joomla tcpdf


【解决方案1】:

$(document).ready(function(){
 $("#PDF").click(function(){
		/*-------------- validate filters	-------------------------------*/
		if(!(validarFecha(fecha_ymd(rj.Get('#TxtFechaIni').value())))){Warn2.show();return false; }
		if(!(validarFecha(fecha_ymd(rj.Get('#TxtFechaFin').value())))){Warn3.show();return false; }	
		if(Date.parse(fecha_ymd(rj.Get('#TxtFechaIni').value()))>=Date.parse(fecha_ymd(rj.Get('#TxtFechaFin').value()))){Warn.show();return false; }
	/* is alll right */	
	else {		
				/* show a message while generating report*/
				WinSnd.Message({type:'info', title:'generating report', value:'Please, wait ...', buttons:' '}).show();	
				/* url with params to send */
				var url="report.php?&slash="+'<?php echo(isset($_POST['slash'])?@$_POST['slash']:@$_GET['slash']);?>'+"&module="+'<?php echo (isset($_POST['module'])?@$_POST['module']:@$_GET['module']);?>'
				+"&TxtCheck=excel"
				+"&TxtFechaIni="+rj.Get('#TxtFechaIni').value()
				+"&TxtFechaFin="+rj.Get('#TxtFechaFin').value()
				+"&LkpTdoc="+rj.Get('#LkpTdoc').value();

				var filename = <?php echo '"'.$gSave.'"';?>; /* name for report, i set*/
				var xhr = new XMLHttpRequest();
				xhr.responseType = 'blob';
				
				xhr.onload = function(){
						WinSnd.hide(); /* hide message */
						var a = document.createElement('a');
						a.href = window.URL.createObjectURL(xhr.response); // xhr.response es un blob file
						a.target = '_blank';
						a.download = filename; // file name 
						a.style.display = 'none';
						document.body.appendChild(a);
						a.click(); // action
						delete a; //
				};
				xhr.open('GET', url);
				xhr.send();	
						
		}// fin validaciones
			
    });//fin function	
});// fin 		

【讨论】:

  • 仅代码的答案通常不如他们对如何回答问题有一些解释那样提供信息。
【解决方案2】:

1) 对于进度条,您必须通过 ajax 运行脚本

2)您有 pdf 页数...在创建的每个页面上,您都可以更改进度条值

3)您必须对创建的每一页pdf使用php输出控制功能 php有一个很好的功能列表

我没有看到你的代码,但你必须做这样的事情

$i = 1;
while($i< PDF_PAGE_COUNT){
        ob_start();
        pdf_create_page($i);
        echo $i/PDF_PAGE_COUNT;
        ob_flush();
        flush();
$i++;
}

p.s : 为了获得更好的答案,请在此处粘贴您的代码!

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2013-03-08
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多