我正在编写一个检查数据库的脚本,并返回客户的每一行,即帐户开始日期是在某个特定日期。如果客户是在指定日期创建的,则客户行将传递给我的函数,以根据客户在数据库中的信息创建PDF。
问题
我想到为每个客户创建一个PDF的唯一方法是循环访问数据并创建PDF。这样做我有一个问题。
1。仅创建第一个用户的PDF。没有任何事情发生在第二个。
无法播放PDF:已发送的标题
在浏览器中显示并下载第一个PDF。但是出于测试目的,数据库中有两个应该创建的客户。我将数据回显给浏览器,两个客户都显示出来。所以我知道数据存在并且在运行时存在。
示例
// create instance of customer's that need to be created
$a = new SelectTempOne;
// obtain response from customers in database that have met timing requirement
$response = $a->selectUserForOne();
// loop through each row in the results and handle then pass to the pdf creation string
foreach($response as $i => $row) {
// statically typing template string to render email address of user
$temp1 = '
<!DOCTYPE html>
<html>
<head>
<title>Template 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" media="screen" href="pdf-templates/temp1/temp1.css" />
</head>
<body>
<div id="pdf_header">
<table>
<tr>
<td>'.$response[$i]['email'].'</td>
</tr>
</table>
</div>
</body>
</html>
';
// pass html to dompdf object
$dompdf->loadHtml($temp1);
// set option for the paper size and orientation
$dompdf->setPaper('A4', 'letter');
// Render the HTML as PDF
$dompdf->render();
//save the file to the server
$output = $dompdf->output();
file_put_contents('pdf/'.$response[$i]['email'].'.pdf', $output);
// Output the generated PDF to Browser
$dompdf->stream();
exit;
} // end of the for loop
?>
此行是我添加客户电子邮件的地方,
<td>'.$response[$i]['email'].'</td>
问题
当我遍历从数据库返回的行时,我需要做什么才能创建动态数量的PDF?
*更新*
致命错误:未捕获的Dompdf \ Exception:找不到块级父级。 不好。在 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/Positioner/Inline.php:45 堆栈跟踪:#0 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameDecorator/AbstractFrameDecorator.php(872): DOMPDF \定位\ Inline-&GT;位置(对象(DOMPDF \ FrameDecorator \内联))
1 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameReflower/Inline.php(51):
Dompdf \ FrameDecorator \ AbstractFrameDecorator-&gt; position()#2 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameDecorator/AbstractFrameDecorator.php(893): Dompdf \ FrameReflower \ Inline-&gt; reflow(NULL)#3 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameReflower/Page.php(141): Dompdf \ FrameDecorator \ AbstractFrameDecorator-&gt; reflow()#4 /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/FrameDecorator/AbstractFrameDecorator.php(893): Dompdf \ FrameReflower \ Page-&gt; reflow(NULL)#5 / Users / wuno / Dropbox / google / devop in /Users/wuno/Dropbox/google/devops/htdocs/tracker/login/dompdf/src/Positioner/Inline.php 第45行
答案 0 :(得分:2)
Web浏览器通过请求文档来工作。您无法期望能够向用户提供多个文档。您可以拨打$dompdf->stream();
一次,即可。您的选择:动态创建包含单个链接的列表页面,创建多页PDF或将PDF压缩在一起。
编辑:好的,根据您的评论,您实际上并不想显示PDF。另外,我再看看你的循环中有退出声明。这不会超过一次。此外,当您的代码中包含大量文本时,使用heredoc strings是个不错的主意,所以我已经这样做了。
<?php
// create instance of customer's that need to be created
$a = new SelectTempOne;
// obtain response from customers in database that have met timing requirement
$response = $a->selectUserForOne();
// loop through each row in the results and handle then pass to the pdf creation string
foreach($response as $i => $row) {
// statically typing template string to render email address of user
$temp1 = <<< HTML
<!DOCTYPE html>
<html>
<head>
<title>Template 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" media="screen" href="pdf-templates/temp1/temp1.css" />
</head>
<body>
<div id="pdf_header">
<table>
<tr>
<td>$row[email]</td>
</tr>
</table>
</div>
</body>
</html>
HTML;
// pass html to dompdf object
$dompdf->loadHtml($temp1);
// set option for the paper size and orientation
$dompdf->setPaper('A4', 'letter');
// Render the HTML as PDF
$dompdf->render();
//save the file to the server
$output = $dompdf->output();
file_put_contents("pdf/$row[email].pdf", $output);
} // end of the for loop
?>
答案 1 :(得分:0)
Dompdf一次仅允许处理一个文件。这是因为一旦生成pdf并将其显示在浏览器中,循环过程就会被终止,这就是循环仅在第一次运行的原因。如果您希望一次生成多个pdf文件,则必须将文档保存在服务器中,然后在AJAX中使用JavaScript for循环并在后台逐个传递文件。由于AJAX在后台运行,因此不会杀死循环过程。