如何使用TCPDF制作2x6的标签纸,其中不包含使用列或第三方类的2D条形码? [英] How can I use TCPDF to make 2x6 sheets of labels that include 2D barcodes WITHOUT using columns OR 3rd-party classes?

查看:214
本文介绍了如何使用TCPDF制作2x6的标签纸,其中不包含使用列或第三方类的2D条形码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

三个星期以来(我想我真的很慢!),我尝试使用TCPDF自己的示例以及在此站点上找到的一些建议,以弄清楚如何使用数据库记录来执行此操作.当其他人询问如何使用第三方补丁(类)来使事情顺利进行时,Asuni先生已经回应了一些帮助请求,仅是可以在没有此类的情况下在TCPDF中完成.无论出于什么原因(也许是我自己的误解),我都无法使用TCPDF通过他的列方法打印标签.

For three weeks (I guess I'm that slows!) I've tried to use TCPDF's own examples as well as some suggestions found on this site to figure out how to do this using database records. Mr. Asuni has responded to some requests for help when others ask how to use 3rd party patches (classes) to get things going, only that it CAN be done in TCPDF without such classes. For whatever reason (perhaps my own misunderstanding) I have not been able to use TCPDF to print labels using his columns approach.

我也不愿意放弃TCPDF来支持其他可能的解决方案(我不会讨论的原因). 用于标准地址标签的PHP TCPDF导出是所问问题的一个示例/此处解决,当通过切换到fpdf17获得所需的功能时.

Neither have I been willing to ditch TCPDF in favor of other possible solutions (reasons I won't go into). PHP TCPDF Export for Standard Address Labels is an example of a question asked/solved here when the needed functionality was gained by switching to fpdf17.

所以我一直坚持到今天,甚至尝试一些用法语编写的精彩代码,但我无法说服它来创建所需的结构.

So I stayed stuck until today, even trying some wonderful code written in French, but I couldn't convince it to create the structure I need.

因为像我上面提到的那样的问题已经(在该站点和其他地方)被打"了好多次了,而且看起来似乎没有解决方案,所以我决定尽我所能阅读工作代码,直到我被困住了,然后进行测试,重新测试并测试更多.

Because questions like the one I cited above have been "hit" on so many times (on this site and elsewhere) without seeming resolution I decided to read all I could, work code until I was bleary-eyed, and test, retest and test some more.

我终于找到了一种从数据库中制作PDF的方法,该方法可以使PDF包含6个标签页面(2个,3个向下)的页面,格式为AVERY 5164.而且我无需使用TCPDF的列方法或任何第三方修补程序或类就可以做到这一点.

I finally found a way to make a PDF from a database that would make PDFs containing pages of 6 labels (2 across, three down), in the AVERY 5164 format. And I've been able to do it without using the columns approach of TCPDF OR any 3rd-party patches or classes.

如果每个人都密切注意我代码中变量的含义,那么任何人都应该能够根据自己的需要更改我的解决方案.

Just about anyone should be able to alter my solution for their own needs if they pay close attention to the meanings of the variables in my code.

我很肯定必须有一种更优雅(正确的方法)来获得我的结果,所以我非常乐意提出有关如何改进我的代码的建议.

I'm POSITIVE there must be a more elegant (and correct!) way to get the results I did, so I'm VERY open to suggestions about how my code could be improved.

而且,在我被烧毁之前,是的,我知道数据库调用必须是PDO.我对客户可以访问的内容一无所知.

And, before I get burned, yes, I KNOW that the database call needs to be PDO. I am stuck with what my client gives me access to.

最后,仅是介绍一下制作记录数量不同的各种PDF需要花费多长时间: 12条记录(2页)-> 4秒下载激活 200条记录-> 44秒 文件大小是合理的(不过,我没有写下任何内容....对不起!)

Last, just to give an idea of how long it took to produce various PDFs of varying numbers of records: 12 records (2 pages) --> 4 seconds to download activation 200 records --> 44 seconds file sizes were reasonable (I failed to write any down, though.... sorry!)

// 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
?>

我希望我不会对代码进行一些改动以删除敏感信息,而不会破坏任何内容. 感谢您提供了一个很棒的网站-我学到了很多东西,希望现在能帮助到别人!

I hope I didn't break anything by altering the code a little to remove sensitive info. Thanks for a great site- I've learned a lot and hope to have helped someone in return now!

推荐答案

看看我的解决方案-它可以打印24个标签-3 * 8到A4中. 只需对width,height和$ qty进行简单的更改,就可以得到2 * 6.

Take a look at my solution - it can print 24 labels - 3*8 into an A4 . just make a simple change in width , height and the $qty , and u can get 2*6 .

<?php

include("dbconfig.php");

require_once('../tcpdf/tcpdf.php');
// include 1D barcode class (search for installation path)
require_once('../tcpdf/tcpdf_barcodes_1d.php');

date_default_timezone_set('Asia/Kolkata');


// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, 'mm', 'A4', true, 'UTF-8', false);

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Casual Creators');
$pdf->SetTitle('Bar Code Labels');
$pdf->SetSubject('');
$pdf->SetKeywords('');

//remove header and footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set margins
$pdf->setTopMargin(13.0);
$pdf->SetRightMargin(6.0);

$pdf->setHeaderMargin(13);
$pdf->SetFooterMargin(13.0); //13mm

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, 13.0);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);



// set a barcode on the page footer
//$pdf->setBarcode(date('Y-m-d H:i:s'));

// set font
$pdf->SetFont('helvetica', '', 11);

// add a page
$pdf->AddPage();

// print a message
//$txt = "";
//$pdf->MultiCell(70, 50, $txt, 0, 'J', false, 1, 125, 30, true, 0, false, true, 0, 'T', false);
//$pdf->SetY(30);

// -----------------------------------------------------------------------------

$pdf->SetFont('helvetica', '', 10);

// define barcode style
$style = array(
        'position' => '',
        'align' => 'L',
        'stretch' => false,
        'fitwidth' => false,
        'cellfitalign' => '',
        'border' => false,
        'hpadding' => 'auto',
        'vpadding' => 'auto',
        'fgcolor' => array(0,0,0),
        'bgcolor' => false, //array(255,255,255),
        'text' => true,
        'font' => 'helvetica',
        'fontsize' => 8,
        'stretchtext' => 0
);


//63.5 mm label width
//33.9mm label height
//2.5 mm gap between

// PRINT VARIOUS 1D BARCODES

// CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.


$query1 = "SELECT * FROM PRODUCTS WHERE ID = '123456' ";

$result1 = $conn->query($query1);
$qty = 24;
$item ;

if ($result1-> num_rows > 0)  {

    $row = $result1 -> fetch_assoc();

    $item = $row["id"];
}
else {
    echo 'DbFailed';
}

$counter = 1;

$i = '0' ;

for( ; $i < $qty ; $i++)
{

    $x = $pdf->GetX();
    $y = $pdf->GetY();
    $pdf->setCellMargins(0,0,2.5,0);
    // The width is set to the the same as the cell containing the name.
    // The Y position is also adjusted slightly.
    $pdf->write1DBarcode($item , 'C39', $x-2.5, $y-6.5, 63.5, 18, 0.4, $style, 'L');
    //Reset X,Y so wrapping cell wraps around the barcode's cell.
    $pdf->SetXY($x,$y);
    $pdf->Cell(63.5, 25, 'MyProduct', 0, 0, 'L', FALSE, '', 0, FALSE, 'C', 'B');
    $pdf->SetXY($x,$y);
    $pdf->Cell(63.5, 33, 'Price', 0, 0, 'L', FALSE, '', 0, FALSE, 'C', 'B');

    if($counter == 3)
    {
        $pdf->Ln(33.9);
        $counter = 1;
    }else{
        $counter++;
    }

}




// ---------------------------------------------------------
ob_end_clean();
//Close and output PDF document
$pdf->Output('barcodes.pdf', 'I');

?>

这篇关于如何使用TCPDF制作2x6的标签纸,其中不包含使用列或第三方类的2D条形码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆