如何让TCPDF适配PhpSpreadsheet导出的内容至PDF页面
Excel填充后导出PDF的适配与垂直对齐问题解决
问题概况
加载Excel模板填充内容后,用TCPDF导出PDF时遇到以下问题:
- 内容无法适配单页(Excel在线版无缩放设置可正常导出单页PDF)
- TCPDF忽略单元格垂直对齐设置
- 替换为mpdf/dompdf时,字体排版与原文件差异过大,不符合需求
解决步骤
1. 强制内容适配单页
通过设置工作表的页面布局参数,让内容自动缩放适配页面宽度:
$spreadsheet = IOFactory::load(Storage::path('Time&Attendance Template.xltx')); $sheet = $spreadsheet->getActiveSheet(); // 开启页面适配,设置宽度适配1页,高度自动 $sheet->getPageSetup()->setFitToPage(true); $sheet->getPageSetup()->setFitToWidth(1); $sheet->getPageSetup()->setFitToHeight(0); $sheet->getCell('A1')->setValue(Str::random()); $pdfWriter = new Tcpdf($spreadsheet); $pdfWriter->setPaperSize(PageSetup::PAPERSIZE_A4); $pdfWriter->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); $pdfWriter->save($file = Storage::path('test.pdf'));
setFitToWidth(1)会将所有列缩放至单页宽度,setFitToHeight(0)表示高度自动分页;若需强制单页显示,可将setFitToHeight(1)(需确保内容实际能容纳)。
2. 修复单元格垂直对齐失效问题
TCPDFWriter对Excel样式的解析可能存在遗漏,可手动遍历单元格重新确认对齐样式,或优先确保模板中的对齐是明确设置而非默认值:
// 遍历目标单元格范围(示例:A1到Z20) foreach ($sheet->getRowIterator() as $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(true); foreach ($cellIterator as $cell) { $style = $cell->getStyle(); // 重新显式设置垂直对齐(读取模板原有设置) $verticalAlign = $style->getAlignment()->getVertical(); $style->getAlignment()->setVertical($verticalAlign); } }
同时建议升级PhpSpreadsheet和TCPDFWriter到最新版本,旧版本可能存在样式解析Bug。
3. 额外优化点
- 检查模板字体是否为TCPDF支持的字体,特殊字体需导入TCPDF字体库
- 导出前确认工作表打印区域设置:
$sheet->getPageSetup()->setPrintArea('A1:Z20');
内容的提问来源于stack exchange,提问作者barmaxon
相关产品推荐
相关产品推荐

