在PHP项目中使用TCPDF生成PDF文档时,我们经常会遇到需要展示反序列化后数组全部元素的场景,比如从缓存中读取序列化数据后渲染到PDF页面。要实现这个需求,需要同时处理好数组反序列化、元素遍历、TCPDF内容输出三个环节的逻辑。

前置知识说明
反序列化操作基础
PHP中序列化是将变量转换为可存储的字符串格式,反序列化则是将序列化字符串还原为原始变量。处理数组时,反序列化后得到的就是原始数组结构,支持所有数组遍历操作。
TCPDF基本输出方法
TCPDF提供了多个内容输出方法,其中Cell方法适合输出单行内容,MultiCell方法适合输出多行文本,遍历数组元素时需要根据内容长度选择合适的输出方法。
完整实现步骤
第一步:反序列化数组数据
首先我们需要获取序列化的字符串,通过unserialize函数将其还原为数组,同时要做好错误处理,避免反序列化失败导致后续逻辑异常。
<?php
// 假设这是从缓存或者数据库中读取的序列化字符串
$serialized_str = 'a:3:{i:0;s:5:"苹果";i:1;s:4:"香蕉";i:2;s:6:"橙子";}';
// 反序列化操作
$arr = unserialize($serialized_str);
// 检查反序列化结果是否有效
if ($arr === false || !is_array($arr)) {
die('反序列化失败,数据格式不正确');
}
?>
第二步:初始化TCPDF实例
创建TCPDF对象,设置基本的文档属性,比如页面方向、单位、编码等,确保中文字符可以正常显示。
<?php
// 引入TCPDF库文件,根据实际路径调整
require_once('tcpdf/tcpdf.php');
// 初始化TCPDF对象,参数依次为页面方向、单位、页面尺寸、是否使用unicode、编码、是否关闭磁盘缓存
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
// 设置文档信息
$pdf->SetCreator('TCPDF示例');
$pdf->SetTitle('反序列化数组显示示例');
// 设置默认字体,支持中文需要设置对应的中文字体
$pdf->SetFont('stsongstdlight', '', 12);
// 添加新页面
$pdf->AddPage();
?>
第三步:遍历数组并输出所有元素
遍历反序列化后的数组,将每个元素按照需求格式输出到PDF中,这里使用foreach循环遍历,根据元素内容长度选择Cell或者MultiCell方法。
<?php
// 设置初始输出位置
$pdf->SetXY(10, 30);
// 先输出标题行
$pdf->Cell(0, 10, '反序列化数组所有元素列表:', 0, 1, 'L');
// 遍历数组输出每个元素
foreach ($arr as $key => $value) {
// 拼接元素展示内容,包含键和值
$content = '键:' . $key . ',值:' . $value;
// 输出单行内容,参数依次为宽度、高度、内容、边框、换行位置、对齐方式
$pdf->Cell(0, 8, $content, 0, 1, 'L');
}
// 输出PDF文档到浏览器
$pdf->Output('array_demo.pdf', 'I');
?>
注意事项
- 反序列化时要验证数据合法性,避免反序列化恶意构造的字符串导致安全问题,不要对不可信的来源数据进行反序列化操作。
- TCPDF默认字体不支持中文,需要引入对应的中文字体文件,否则中文元素会显示为乱码。
- 如果数组元素包含长文本,建议使用
MultiCell方法替代Cell,避免内容超出页面宽度被截断。 - 遍历数组前先判断数组是否为空,为空时可以输出提示信息,避免PDF页面出现空白内容区域。
多行文本元素的处理方案
如果数组元素包含换行符或者较长的内容,需要调整输出逻辑,使用MultiCell方法适配多行展示:
<?php
// 包含换行符的数组示例
$serialized_str = 'a:2:{i:0;s:20:"第一行内容
第二行内容";i:1;s:15:"短文本示例";}';
$arr = unserialize($serialized_str);
$pdf->SetXY(10, 30);
$pdf->Cell(0, 10, '多行元素数组列表:', 0, 1, 'L');
foreach ($arr as $key => $value) {
$content = '键:' . $key . ',值:' . $value;
// MultiCell参数:宽度、高度、内容、边框、对齐方式、填充、换行位置
$pdf->MultiCell(0, 8, $content, 0, 'L', 0, 1);
}
?>