如何使用 TCPDF 制作包含 2D 条形码的 2x6 标签,而不使用列或第 3 方类?

2023-12-11

三周以来(我想我就是这么慢!)我尝试使用 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
?>

我希望我没有通过稍微改变代码来删除敏感信息而破坏任何东西。 感谢您提供一个很棒的网站 - 我学到了很多东西,希望现在能够帮助别人!


看看我的解决方案 - 它可以将 24 个标签 - 3*8 打印到 A4 纸上。 只需对 width 、 height 和 $qty 进行简单的更改,您就可以获得 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');

?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 TCPDF 制作包含 2D 条形码的 2x6 标签,而不使用列或第 3 方类? 的相关文章

  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • symfony 2 形式的函数 getName 做什么

    这是我的表格类 class CommentType extends AbstractType public function buildForm FormBuilder builder array options builder gt ad
  • 这些加密算法有什么区别?

    两者有什么区别MCRYPT RIJNDAEL 128 MCRYPT RIJNDAEL 256 MCRYPT BLOWFISH等等 哪一种最适合网络数据传输 Rijandel 是 AES 的另一个名称 AES 是当前的 一个好的标准 算法 数
  • 如何在 PHP 中正确分割路径

    执行以下操作的最佳方法是什么 我通过 AJAX 请求获取路径 e g dir1 dir2 dir3 dir4 我需要在我的网页上这样展示它 dir1 gt gt dir2 gt gt dir3 gt gt dir4 它们每个都是 html
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • 如何将 MySql 表导出/转储到文本文件中,包括字段名称(也称为标题或列名称)

    在 MySql 的解释器中 很容易将表及其字段名称转储到屏幕上 似乎没有简单的方法可以将表导出到制表符分隔或 CSV 输出文件包括它的列标题 我尝试仅使用 SQL 或 Linux 命令行来完成此操作 而不用其他语言编写程序 谢谢 将查询通过
  • MySQL 中如何使用继承?

    所以我正在读一本关于数据库设计原理的书 并读到了有关继承的章节 但我对如何在 MySQL 中将子类与其超类 连接 感到困惑 The table structure would for example look like this 那么我如何
  • 使用 Hibernate Dialect 设置表字符集/排序规则?

    我使用 Hibernate MySQLInnoDB Dialect 来生成 DDL hibernate cfg xml
  • WooCommerce:用文本覆盖购物车价格

    我们有很多产品具有以下功能 No price 零价格 我们让它们可以通过内置挂钩购买 但购物车仍然将它们显示为具有0 price结账时 我们希望购物车和结帐摘要显示 特殊订单 或任何其他文本 但 WooCommerce 似乎使基于文本的价格
  • 使用 PDO 在 SQLite 中检索单个(且唯一)行的最简单方法

    我有这个 PDO stmt db gt prepare SELECT FROM channels WHERE id id stmt gt bindValue id id SQLITE3 INTEGER result stmt gt exec
  • 登录后所有页面都应该是https吗?

    这有点难以解释 但我会尽力 有一个网站 每个页面上都有登录表单 其中包含用户名 密码字段 这些页面未使用 SSL 用户填写用户名 密码并提交表单后 表单将被发送到 https 的身份验证页面 对于这种情况我有几个疑问 向 https 页面提
  • ON DUPLICATE KEY UPDATE 的自动增量过多

    我有一个包含列的基本表 id 主要是AI 名称 唯一 etc 如果唯一列不存在 则插入该行 否则更新该行 INSERT INTO pages name etc VALUES bob randomness ON DUPLICATE KEY U
  • 使用 DOM 获取 div 的内容(包括子标签)

    我正在使用 DOM 来获取 div 标签的内容 但内部 html 部分未显示 功能是 dom new DOMDocument libxml use internal errors true dom gt loadHTMLFile url l
  • ZF2 工厂获取参数

    我有一个动态类别导航 在导航工厂中 我想从路线获取参数 我怎样才能做到这一点 在我看来 在我的 module php 中 public function getServiceConfig return array factories gt
  • WordPress 事件按元生效日期排序

    我在获取参数数组以按 Wordpress 中的日期对事件列表进行排序时遇到一些问题 我在 Stack Overflow 和其他地方找到了几个建议的解决方案 但经过大量的试验和错误后 这些解决方案似乎都不起作用 这没什么花哨的 而且应该比这容
  • 无法在 Centos 上安装 php-mysqli 扩展

    我正在尝试将 mysqli 扩展安装到 php yum install php mysqli 我收到下一个错误 Transaction Check Error file usr share mysql charsets Index xml
  • sqlsrv_num_rows 不返回任何值

    我正在尝试获取查询中返回的行数 while 循环遍历结果有效 但由于某种原因 sqlsrv num rows 不返回任何值 result SELECT from dtable WHERE id2 apple query sqlsrv que
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • NodeJS 和 PHP (Laravel) 集成用于 Socket.IO 实时聊天

    目前我有一个我写过的网站PHP通过Laravel 框架 我已经使用写了一个实时聊天nodeJS with 套接字IO and Express现在我想做的是将它集成到我已经编写的 Laravel 网站中 问题是聊天必须在主页中 当前由 Lar
  • PHP 中的 Zip 流

    我有一个 PHP 脚本 可以动态创建 zip 文件并强制浏览器下载该 zip 文件 问题是 我可以直接将zip文件写入连接到用户浏览器的输出流 而不是先将其保存为服务器上的真实文件 然后发送文件吗 提前致谢 如果您的 Web 服务器运行的是

随机推荐

  • 获取用户详细信息、计算年龄并显示所有信息的程序

    我启动了一些代码 但在将用户字符串输入保存到变量中时遇到问题 使用 ReadString 我可以提示用户输入字符串 但是将用户输入保存到名为 AskName1 的变量中 然后显示 AskName1 中保存的信息后 我发现它保存了用户输入的字
  • R中使用循环处理文件夹中的所有文件

    我需要处理一个文件夹中的所有文件 并且文件是按顺序命名的 所以我认为这是循环的好时机 处理单个文件的代码很简单 df lt read table CLIM0101 WTG skip 3 header TRUE df lt df 1 df y
  • Spring Security:在 SecurityContext 中找不到 Authentication 对象

    以下配置 filterChain 在 SpringBoot 2 7 5 中工作正常 但在我尝试在 SpringBoot 3 0 0 RC1 中测试它之后 它不起作用并显示以下消息 如果想要迁移 我需要更改任何内容到 Spring Boot
  • Windows 10 中的 Android AVD 模拟器缩放问题

    我在 Windows 10 Android Studio 2 3 3 上 我创建了一个具有以下配置的 android avd 但显示屏无法正确缩放 显示屏仅在一个角落 Name 4 WVGA Nexus S API 23 CPU ABI G
  • ListView可以在ExpandableListView里面吗?

    我们可以在 ExpandableListView 中包含 ListView 吗 这样我就可以首先拥有组级别 然后拥有子级数组 listView 我已经完成了列表视图课程 它工作得很好 但如何调用可扩展列表视图中的每个组来显示列表视图 布局
  • 这在 PHP 中意味着什么:-> 或 =>

    我一直在 PHP 中看到这些 但我不知道它们的实际含义 什么是 gt 做什么以及做什么 gt 做 我不是在谈论运营商 它们是别的东西 但似乎没有人知道 The 双箭头运算符 gt 用作数组的访问机制 这意味着在数组上下文中 其左侧的值将具有
  • R:将XML数据转换为数据框

    对于家庭作业 我试图将 XML 文件转换为 R 中的数据框架 我尝试了许多不同的方法 并且在互联网上搜索了一些想法 但没有成功 到目前为止 这是我的代码 library XML url lt http www ggobi org book
  • 通知等待模式的C++多线程算法设计

    我正在寻找以下算法在 Windows 上的多线程实现的建议和代码示例 主题1 采取input1 做工作 通知Thread2 继续工作 主题2 采取input2 做工作 等待来自thread2的通知 做一些处理 通知Thread3 继续工作
  • WKWebView:是否可以预加载多个URL?

    刚刚将应用程序迁移到WKWebView想知道是否有任何可能的方法来 预加载 多个 URL 但一次只显示一个 我有 5 个 URL 的列表 我已经知道我会在某个时间点显示 并且我想通过预加载这些内容以在单个时间点中使用来加快体验速度WKWeb
  • Scala Futures:每个新创建或映射的异常的默认错误处理程序

    是否有可能始终使用默认的 onFailure 处理程序创建 Future 块 例如将堆栈跟踪写入控制台 该处理程序还应该自动附加到映射的 future 通过在已经具有默认故障处理程序的 future 上调用映射创建的新 future 另请参
  • 为什么我不能使用 Start-Process 来调用带参数的脚本?

    我正在尝试在 Powershell 中编写一个包装器脚本 该脚本传递可执行文件的名称 进行一些预处理 然后使用该预处理产生的参数调用该可执行文件 我希望可执行文件是可以在 Windows 上运行 打开的任何内容 所以我想使用Start Pr
  • 自引用多对多递归关系代码优先实体框架

    我似乎根本无法完成这项工作 class Member public virtual IList
  • 使用jQuery在IE10中动态提交文件上传表单

    我有一个表单 其唯一目的是上传文件 但出于用户体验的原因 我需要一个漂亮的按钮 加载文件对话框 选择文件后自动提交表单 原来的解决方案是这样的这个 JSFiddle 其中有一个加载文件对话框的链接 然后监听该对话框的change自动提交表单
  • 将 SDL 嵌入 GTK+

    我有一个使用 GTK 来显示一些漂亮的 GUI 的应用程序 但我使用 SDL 在 GTK 内显示一个小的 RGB 帧缓冲区 我使用以下代码将 SDL 引入 GTK char SDL windowhack 32 sprintf SDL win
  • Android使用路径中的空间和通用图像加载器加载本地图像

    我正在开发 Android 应用程序 我想在通用图像加载器的帮助下显示本地图像 但是 当我尝试显示本地图像路径中有空间的图像时 它无法显示图像 我按照以下方式尝试过 Uri fromFile new File newImagePath to
  • OWL:如何从超类中继承两个类之间的属性关系?

    假设我们有两个名为People and Disease 这些类通过对象属性相关has People has Disease People有子类 或个人 John and Disease有子类 或个人 Cancer John a People
  • 如何在Android中应用多个查询来过滤firebase数据结果?

    我想在回收者视图中显示城市 瓦拉纳西 性别 男 且工资在 5000 到 15000 之间的所有工人姓名 在这种情况下 必须显示所显示的工作人员的姓名 必须应用什么查询以及如何实现 首先 我认为你需要用双值保存工资 而不是字符串 您需要在工作
  • 用字符串+整数组成变量名并调用函数

    首先 我对这些很陌生 这个问题可能很愚蠢 无论如何 我有一个这样的程序 procedure Tform1 QueryChange sqltext String query Integer begin if query 1 then begi
  • 如何在 CQL 3 准备好的语句中绑定 IN 子句值?

    我有一张大致类似于 create table mytable id uuid something text primary key id 我正在尝试创建一个具有绑定子句的准备好的语句 PreparedStatement ps session
  • 如何使用 TCPDF 制作包含 2D 条形码的 2x6 标签,而不使用列或第 3 方类?

    三周以来 我想我就是这么慢 我尝试使用 TCPDF 自己的示例以及在该网站上找到的一些建议来弄清楚如何使用数据库记录来做到这一点 当其他人询问如何使用第 3 方补丁 类 来使事情顺利进行时 Asuni 先生回应了一些帮助请求 只是它可以在没