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

TCPDF技术咨询:相册页面创建完成后调整页面尺寸的方案

解决TCPDF相册页面事后调整(裁剪/单侧放大)的方案

针对你遇到的“需在所有页面创建完成后调整尺寸、保留背景色”的需求,我整理了两种实操性强的方案,结合TCPDF的API特性来实现:


方案1:预创建大尺寸页面,事后裁剪到目标尺寸(推荐,实现简单)

这个思路是先基于“足够大的临时尺寸”创建所有页面,完成内容和背景色绘制后,再根据左右页的属性裁剪出最终页面,完美保留背景色。

步骤1:初始化超大尺寸的PDF

假设你最终需要的单页宽度为$final_width(比如A4的210mm)、高度为$final_height(297mm),我们先把临时页面宽度设为2倍最终宽度,确保有足够空间容纳左右调整:

$final_width = 210;
$final_height = 297;
$temp_width = $final_width * 2; // 临时宽度设为最终尺寸的2倍

// 初始化PDF,使用临时尺寸
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, [$temp_width, $final_height], true, 'UTF-8', false);

步骤2:正常绘制所有页面(含背景色)

绘制内容时,根据后续裁剪逻辑提前规划位置:左页内容放在临时页面左侧,右页内容放在右侧;背景色要填充整个临时页面,确保裁剪后对应区域保留颜色:

// 示例:为页面设置浅黄色背景,填充整个临时页面
$pdf->SetFillColor(255, 255, 200);
$pdf->Rect(0, 0, $temp_width, $final_height, 'F');

// 绘制相册内容(示例图片)
// 左页内容放在临时页面左侧区域
$pdf->Image('left_photo.jpg', 20, 20, 170, 257);
$pdf->AddPage();
// 右页内容放在临时页面右侧区域
$pdf->Image('right_photo.jpg', $final_width + 20, 20, 170, 257);

步骤3:遍历页面,按左右页设置裁剪框

所有页面创建完成后,遍历每一页,判断左右页(通常偶数页为左页、奇数页为右页,可根据你的排版调整),设置裁剪框和媒体框,将页面缩放到最终尺寸:

$total_pages = $pdf->getNumPages();

for ($page = 1; $page <= $total_pages; $page++) {
    $pdf->setPage($page);
    $is_left_page = ($page % 2 == 0); // 偶数页判定为左页

    if ($is_left_page) {
        // 左页:裁剪临时页面的左侧$final_width区域
        $pdf->setPageBox('crop', [0, 0, $final_width, $final_height]);
    } else {
        // 右页:裁剪临时页面的右侧$final_width区域
        $pdf->setPageBox('crop', [$temp_width - $final_width, 0, $final_width, $final_height]);
    }
    // 同步设置媒体框为最终尺寸,确保输出的PDF页面尺寸正确
    $pdf->setPageBox('media', [0, 0, $final_width, $final_height]);
}

// 输出PDF
$pdf->Output('album.pdf', 'I');

方案2:事后单侧放大页面(适合需要拉伸效果的场景)

如果需要的是“单侧放大”而非裁剪,由于TCPDF没有直接的局部缩放API,我们可以通过克隆原页面内容+重绘缩放区域的方式实现,同时保留背景色。

核心思路

  1. 先按最终基础尺寸创建所有页面,完成内容和背景色绘制;
  2. 遍历每一页,判断左右页,创建对应放大后的新页面;
  3. 在新页面中填充背景色,再将原页面内容按需求局部缩放后重绘;
  4. 替换原页面为新页面。

简化代码示例(以左页放大左侧为例)

$final_width = 210;
$final_height = 297;
$scale_factor = 1.2; // 左侧放大20%
$new_width = $final_width + ($final_width * ($scale_factor - 1)); // 放大后的页面宽度

// 初始化基础尺寸的PDF
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, [$final_width, $final_height], true, 'UTF-8', false);

// 正常绘制所有页面(含背景色)
// ... 省略你的页面绘制代码 ...

// 存储原页面内容,准备重绘
$original_pages = $pdf->pages;
$pdf->pages = []; // 清空原页面

foreach ($original_pages as $index => $content) {
    $page_num = $index + 1;
    $is_left_page = ($page_num % 2 == 0);

    // 创建新页面(放大后的尺寸)
    $pdf->AddPage('', [$new_width, $final_height]);
    
    // 填充新页面背景色
    $pdf->SetFillColor(255, 255, 200);
    $pdf->Rect(0, 0, $new_width, $final_height, 'F');

    if ($is_left_page) {
        // 左页:放大左侧区域,使用TCPDF的变换API实现局部缩放
        $pdf->StartTransform();
        // 对左侧区域进行缩放,向右偏移多余宽度
        $pdf->Scale($scale_factor, 1, 0, 0);
        $pdf->WriteHTML($content); // 重绘原页面内容
        $pdf->EndTransform();
    } else {
        // 右页:正常绘制或按需求放大右侧
        $pdf->StartTransform();
        $pdf->Scale($scale_factor, 1, $new_width - $final_width * $scale_factor, 0);
        $pdf->WriteHTML($content);
        $pdf->EndTransform();
    }
}

// 输出PDF
$pdf->Output('scaled_album.pdf', 'I');

关键注意事项

  1. 背景色保留:无论哪种方案,都要确保背景色填充整个临时/新页面,避免裁剪或缩放后出现空白区域;
  2. 页面奇偶判断:可根据你的相册排版逻辑调整左右页的判定规则(比如有些相册第一页是左页);
  3. 单位一致性:全程使用统一单位(TCPDF默认是mm),避免尺寸混乱;
  4. 测试调整:建议先测试1-2页,调整裁剪位置、缩放比例,确保效果符合预期。

内容的提问来源于stack exchange,提问作者mercator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:29:52