You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:52:15