如何使用 dompdf 单击一次打印 500+ pdf,而每个 pdf 可以有 n 页?
How to print 500+ pdf in single click with dompdf , while each pdf can have n number of pages?
我有 100 多个项目,项目有差异 data.I 想通过单击打印 n 份 pdf,每个 pdf 可以有 n 页。我正在使用 foreach 并获得结果,但是当项目有 2000 多行(1 页有 25 行)时,它会超时。这是我的代码:
$finalItems = array('1,2,3,4',5,6,..............);
foreach($finalItems as $item){
$i++;
$getGrp = DB::table('item_master')->select('group')->where('item_name', $item)->get();
$rs = json_decode(json_encode($getGrp), true);
$getGP = call_user_func_array('array_merge', $rs);
$saleData = DB::table('sale_data')->where('item_name', $item)->where('site_id', $site_id)->whereBetween('bill_date',[$_POST['fromDate'],$_POST['toDate']])->get();
$purchaseData= DB::table('purchase_data')->where('item_name', $item)->where('site_id', $site_id)->whereBetween('bill_date',[$_POST['fromDate'],$_POST['toDate']])->get();
$stock_trf = DB::table('stock_transfer')->where('item_name',$item)->where('site_id', $site_id)->whereBetween('bill_date',[$_POST['fromDate'],$_POST['toDate']])->get();
$sales = json_decode(json_encode($saleData), true);
$purchase = json_decode(json_encode($purchaseData), true);
$stock = json_decode(json_encode($stock_trf), true);
$res = array_merge($sales, $purchase, $stock);
$groupName = $getGP['group'];
$pdf = PDF::loadView('myPDF', compact('res'));
$pdf->setPaper('a3', 'landscape');
$pdf->save(public_path().'/pdf/item_'.$item.'.pdf')>stream('item_'.$item.'.pdf');
$pdf_name[] = 'item_'.$item.'.pdf';
}
/****************** HTML 查看文件 ******************* ********************/
@$dlr = array_chunk($res, 100);
$loopCount = count($dlr);
@for($i=0; $i<$loopCount; $i++)
@foreach ($dlr[$i] as $sldata[$i])
<tr >
<td style="width:2%"></td>
<td style="width:5.10%"></td>
<td style="width:9.10%"></td>
<td style="width:7.10%"></td>
<td style="width:5.10%">{{ $sldata[$i]['batch_no'] }}</td>
<td style="width:5.10%">{{ $sldata[$i]['mfg_date'] }}</td>
<td style="width:5.10%">{{ $sldata[$i]['exp_date'] }}</td>
<td style="width:5.10%"></td>
<td style="width:5.10%"></td>
<td style="width:5.10%"></td>
<td style="width:3.10%">{{ $last_balance }}</td>
<td style="width:5.10%"></td>
<td style="width:3.10%">{{ $sldata[$i]['quantity_in_kgltr'] }}</td>
<td style="width:4.10%"></td>
<td style="width:4.10%"></td>
<td style="width:5.10%">
<?php
$tocl = (int)$sldata[$i]['quantity_in_kgltr'];
echo @$last_balance -= $tocl; ?>
</td>
<td style="width:5.10%">{{ $sldata[$i]['bill_no'] }}</td>
<td style="width:5.10%">{{ date('d-m-Y', strtotime($sldata[$i]['bill_date'])) }}</td>
<td style="width:8.10%">{{ $sldata[$i]['sales_to_customer_name'] }}</td>
<td style="width:3.10%"></td>
</tr>
@endforeach
@endfor
所以你确实超时了?
对于一份长期工作来说,这是意料之中的事情。简单的出路是增加超时:
set_time_limit
但如果仍然需要很长时间,您可能会遇到其他超时(特别是网络服务器:Apache 或 IIS 或其他)
打印这么多 PDF 文档不完全是网络服务器的工作。
我建议您研究一种解决方案,在该解决方案中使用 PHP 而不使用网络服务器,即命令行。
确保将 set_time_limit 设置为 0(意味着它不会终止)。
你发的这段脚本很明显是在做网页。如果您需要从网页中进行选择,请找到一种方法将该选择传输到脚本中,您将 运行 命令行。 (例如,通过将 PDF 文件名写入文件。然后您从 PDF 打印脚本中读取该文件)
使用 array_chunk() 完成的任务:
$flag = 0;
$chunks = array_chunk($res, 100);
foreach($chunks as $listitems){
$flag++;
$groupName = @$getGP['group'];
view()->share('group',$groupName);
view()->share('fromdt',$fromDate);
view()->share('siteid',$site_id);
view()->share('inm',$inm);
$pdf = PDF::loadView('myPDF', compact('listitems'));
$pdf->setPaper('a3', 'landscape');
$pdf->save(public_path().'/pdf/item_'.$item.''.$flag.'.pdf')->stream('item_'.$item.''.$flag.'.pdf');
$pdf_name[] = 'item_'.$item.''.$flag.'.pdf';
}
我有 100 多个项目,项目有差异 data.I 想通过单击打印 n 份 pdf,每个 pdf 可以有 n 页。我正在使用 foreach 并获得结果,但是当项目有 2000 多行(1 页有 25 行)时,它会超时。这是我的代码:
$finalItems = array('1,2,3,4',5,6,..............);
foreach($finalItems as $item){
$i++;
$getGrp = DB::table('item_master')->select('group')->where('item_name', $item)->get();
$rs = json_decode(json_encode($getGrp), true);
$getGP = call_user_func_array('array_merge', $rs);
$saleData = DB::table('sale_data')->where('item_name', $item)->where('site_id', $site_id)->whereBetween('bill_date',[$_POST['fromDate'],$_POST['toDate']])->get();
$purchaseData= DB::table('purchase_data')->where('item_name', $item)->where('site_id', $site_id)->whereBetween('bill_date',[$_POST['fromDate'],$_POST['toDate']])->get();
$stock_trf = DB::table('stock_transfer')->where('item_name',$item)->where('site_id', $site_id)->whereBetween('bill_date',[$_POST['fromDate'],$_POST['toDate']])->get();
$sales = json_decode(json_encode($saleData), true);
$purchase = json_decode(json_encode($purchaseData), true);
$stock = json_decode(json_encode($stock_trf), true);
$res = array_merge($sales, $purchase, $stock);
$groupName = $getGP['group'];
$pdf = PDF::loadView('myPDF', compact('res'));
$pdf->setPaper('a3', 'landscape');
$pdf->save(public_path().'/pdf/item_'.$item.'.pdf')>stream('item_'.$item.'.pdf');
$pdf_name[] = 'item_'.$item.'.pdf';
}
/****************** HTML 查看文件 ******************* ********************/
@$dlr = array_chunk($res, 100);
$loopCount = count($dlr);
@for($i=0; $i<$loopCount; $i++)
@foreach ($dlr[$i] as $sldata[$i])
<tr >
<td style="width:2%"></td>
<td style="width:5.10%"></td>
<td style="width:9.10%"></td>
<td style="width:7.10%"></td>
<td style="width:5.10%">{{ $sldata[$i]['batch_no'] }}</td>
<td style="width:5.10%">{{ $sldata[$i]['mfg_date'] }}</td>
<td style="width:5.10%">{{ $sldata[$i]['exp_date'] }}</td>
<td style="width:5.10%"></td>
<td style="width:5.10%"></td>
<td style="width:5.10%"></td>
<td style="width:3.10%">{{ $last_balance }}</td>
<td style="width:5.10%"></td>
<td style="width:3.10%">{{ $sldata[$i]['quantity_in_kgltr'] }}</td>
<td style="width:4.10%"></td>
<td style="width:4.10%"></td>
<td style="width:5.10%">
<?php
$tocl = (int)$sldata[$i]['quantity_in_kgltr'];
echo @$last_balance -= $tocl; ?>
</td>
<td style="width:5.10%">{{ $sldata[$i]['bill_no'] }}</td>
<td style="width:5.10%">{{ date('d-m-Y', strtotime($sldata[$i]['bill_date'])) }}</td>
<td style="width:8.10%">{{ $sldata[$i]['sales_to_customer_name'] }}</td>
<td style="width:3.10%"></td>
</tr>
@endforeach
@endfor
所以你确实超时了?
对于一份长期工作来说,这是意料之中的事情。简单的出路是增加超时: set_time_limit
但如果仍然需要很长时间,您可能会遇到其他超时(特别是网络服务器:Apache 或 IIS 或其他)
打印这么多 PDF 文档不完全是网络服务器的工作。
我建议您研究一种解决方案,在该解决方案中使用 PHP 而不使用网络服务器,即命令行。
确保将 set_time_limit 设置为 0(意味着它不会终止)。
你发的这段脚本很明显是在做网页。如果您需要从网页中进行选择,请找到一种方法将该选择传输到脚本中,您将 运行 命令行。 (例如,通过将 PDF 文件名写入文件。然后您从 PDF 打印脚本中读取该文件)
使用 array_chunk() 完成的任务:
$flag = 0;
$chunks = array_chunk($res, 100);
foreach($chunks as $listitems){
$flag++;
$groupName = @$getGP['group'];
view()->share('group',$groupName);
view()->share('fromdt',$fromDate);
view()->share('siteid',$site_id);
view()->share('inm',$inm);
$pdf = PDF::loadView('myPDF', compact('listitems'));
$pdf->setPaper('a3', 'landscape');
$pdf->save(public_path().'/pdf/item_'.$item.''.$flag.'.pdf')->stream('item_'.$item.''.$flag.'.pdf');
$pdf_name[] = 'item_'.$item.''.$flag.'.pdf';
}