三周以来(我想我就是这么慢!)我尝试使用 TCPDF 自己的示例以及在该网站上找到的一些建议来弄清楚如何使用数据库记录来做到这一点。当其他人询问如何使用第 3 方补丁(类)来使事情顺利进行时,Asuni 先生回应了一些帮助请求,只是它可以在没有此类类的 TCPDF 中完成。无论出于何种原因(也许是我自己的误解),我无法使用 TCPDF 使用他的列方法来打印标签。
我也不愿意放弃 TCPDF 而转而采用其他可能的解决方案(我不会详细讨论原因)。标准地址标签的 PHP TCPDF 导出是通过切换到 fpdf17 获得所需功能时在此处提出/解决的问题的示例。
所以我一直坚持到今天,甚至尝试了一些用法语编写的精彩代码,但我无法说服它创建我需要的结构。
因为像我上面引用的问题已经被“击中”了很多次(在这个网站和其他地方),但似乎没有解决,所以我决定阅读我能读到的所有内容,工作代码直到我睡眼惺忪,然后测试,重新测试和测试多一点。
我终于找到了一种从数据库制作 PDF 的方法,该方法可以制作包含 6 个标签页(横向 2 个,向下 3 个)的 PDF,格式为 AVERY 5164。我已经能够在不使用 TCPDF 的列方法或任何第三方补丁或类的情况下做到这一点。
如果密切关注代码中变量的含义,几乎任何人都应该能够根据自己的需要更改我的解决方案。
我确信一定有一种更优雅(并且正确!)的方法来获得我所做的结果,所以我非常愿意接受有关如何改进我的代码的建议。
而且,在我被烧伤之前,是的,我知道数据库调用需要是 PDO。我被客户允许我访问的内容所困扰。
最后,我们来了解一下生成不同数量记录的各种 PDF 需要多长时间:
12条记录(2页)-->4秒下载激活
200 条记录 --> 44 秒
文件大小是合理的(不过我没能写下来......抱歉!)
这是我的解决方案[注意:我的数据库连接文件是一个包含文件,出于明显的原因,下面未给出]:
// value from url calling this page - this client wants results by year every time
$colname_year = "-1";
if (isset($_GET['year'])) {
$colname_year = $_GET['year'];
}
//I DO include Mr. Asuni's credits in my file, but it's left out here for brevity's sake.
//----------------
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 document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('whoever you are');
$pdf->SetTitle('what you want to call it');
$pdf->SetSubject('your subject');
$pdf->SetKeywords('TCPDF, PDF, HHMWC, QR, CODE');
// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// set some language-dependent strings
require_once('../../tcpdf/results/lang/eng.php');
$pdf->setLanguageArray($l);
// --------------
// add a page
$pdf->AddPage();
// set the font
$pdf->SetFont('helvetica', '', 10);
// set style for barcode
$style = array(
'border' => 2,
'vpadding' => 'auto',
'hpadding' => 'auto',
'fgcolor' => array(0,0,0),
'bgcolor' => false, //array(255,255,255)
'module_width' => 1, // width of a single module in points
'module_height' => 1 // height of a single module in points
);
// connect to database
require_once('../../../Connections/con1.php');
mysql_select_db($database_con1, $con1); // Get needed records from database
$query_info = sprintf("select regkey, name1, name2, company, city, state, volunteer, meal, choice, golf from convregis where (name1<>'Anonymous Donation' and print='0' and completed='Yes' and hold='0' and year=%s) order by name2, name1 ASC", GetSQLValueString($colname_year, "text"));
$info = mysql_query($query_info, $con1) or die(mysql_error());
$num_fields = mysql_num_fields($info);
$j=0; // the field number
$x=1; // the record number
while($row = mysql_fetch_array($info)) {
for($j=0; $j<$num_fields; $j++) {
$name = mysql_field_name($info, $j);
$object[$x][$name] = $row[$name];
}
$x++; // get next record set
}
//set variables for placement of QR CODE and text lines
$size=40; // mm size of QRCODE / H = QR-CODE Best error correction
$qrlm=40; // left margin of code on left
$qrlm2=140; // left margin of code on right
$qrvm=40; // vertical placement (how far down the page) of BOTH codes on first row
$l=20; // left margin of text, left side
$l2=120; // left margin of text, right side
$y=15; // vertical placement (how far down the page) of BOTH texts on first row
// There will be two records per row - there will be three rows
$ii = count($object); // total number of record rows to do
for($i=1; $i<=$ii; $i++) { //$object[$i]['field_name'] / this sets $i = $x above
if ($i<=$ii) {
$codeurl = "https:clientwebsiteaddress/attend.php?regkey=".$object[$i]['regkey'];
///write the QR CODE
$pdf->write2DBarcode($codeurl, 'QRCODE,H', $qrlm, $qrvm, $size, $size, $style, 'N');
// the QR CODE, when scanned by a smartphone at the convention's
//registration packet pickup table, triggers an update to the
//database in the attend.php page, setting a registrant to "in attendance"
$regkey=$object[$i]['regkey']; //assign row data to a variable and manipulate as needed
$fullname=strtoupper($object[$i]['name2']).", ".strtoupper($object[$i]['name1']);
$vol=$object[$i]['volunteer'];
$company=strtoupper($object[$i]['company']);
$city=$object[$i]['city'];
$state=$object[$i]['state'];
$meal=$object[$i]['meal'];
$golf=$object[$i]['golf'];
if ($golf<>"1") {
$golf=" ";
} else {
$golf="GOLF";
}
if ($meal<>"1") {
$meal=" ";
} else {
$meal="MEAL: ".strtoupper($object[$i]['choice']);
}
if ($meal<>" ") {
$mealgolf=$meal." / ".$golf;
} else {
$mealgolf=$golf;
}
//write the lines of text
$pdf->Text($l, $y, $fullname.' '.$vol);
$pdf->Text($l, $y+5, $regkey.' '.$city.', '.$state);
$pdf->Text($l, $y+10, $company);
$pdf->Text($l, $y+15, $mealgolf);
$i++; // get next record
if ($i<=$ii) {
$codeurl2 = "https:clientwebsiteaddress/attend.php?regkey=".$object[$i]['regkey'];
$pdf->write2DBarcode($codeurl2, 'QRCODE,H', $qrlm2, $qrvm, $size, $size, $style, 'N');
$regkey2=$object[$i]['regkey'];
$fullname2=strtoupper($object[$i]['name2']).", ".strtoupper($object[$i]['name1']);
$vol2=$object[$i]['volunteer'];
$company2=strtoupper($object[$i]['company']);
$city2=$object[$i]['city'];
$state2=$object[$i]['state'];
$meal2=$object[$i]['meal'];
$golf2=$object[$i]['golf'];
if ($golf2<>"1") {
$golf2=" ";
} else {
$golf2="GOLF";
}
if ($meal2<>"1") {
$meal2=" ";
} else {
$meal2="MEAL: ".strtoupper($object[$i]['choice']);
}
if ($meal2<>" ") {
$mealgolf2=$meal2." / ".$golf2;
} else {
$mealgolf2=$golf2;
}
$pdf->Text($l2, $y, $fullname2.' '.$vol2);
$pdf->Text($l2, $y+5, $regkey2.' '.$city2.', '.$state2);
$pdf->Text($l2, $y+10, $company2);
$pdf->Text($l2, $y+15, $mealgolf2);
$qrvm=$qrvm+85; $y=$y+85; // add 85 mm drop to vertical alignment of qrcodes
if($i<=$ii and $qrvm>210) { //no more room on this page but more records to do
$qrvm=40; // reset qrcode vertical alignment
$y=15; // reset where texts write
$pdf->AddPage();
}
}
}
} // end of PDF (no more records to do)
$pdf->Output($year.'EnvelopeLabels.pdf', 'I'); //Close and output PDF document
?>
我希望我没有通过稍微改变代码来删除敏感信息而破坏任何东西。
感谢您提供一个很棒的网站 - 我学到了很多东西,希望现在能够帮助别人!