在 Word 文档中设置奇偶页不同的页眉
在 PHPWord 中设置奇偶页不同的页眉需要配置文档的页面布局并使用特定的方法。下面是详细的解决方案:
核心实现代码
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
public function generateDocumentWithOddEvenHeaders()
{
$phpWord = new PhpWord();
// 设置文档启用奇偶页不同的页眉
$settings = $phpWord->getSettings();
$settings->setEvenAndOddHeaders(true); // 关键设置
// 添加节(section)
$section = $phpWord->addSection([
'differentOddEven' => true, // 启用奇偶页不同
'headerHeight' => 400 // 设置页眉高度(单位:twip)
]);
// ===== 奇数页页眉 =====
$oddHeader = $section->addHeader(); // 默认添加奇数页页眉
$oddHeader->addText('奇数页页眉 - 公司内部文档', ['bold' => true]);
$oddHeader->addImage('path/to/logo_odd.png', ['width' => 50, 'height' => 20, 'alignment' => 'right']);
// ===== 偶数页页眉 =====
$evenHeader = $section->addHeader('even'); // 添加偶数页页眉
$evenHeader->addText('偶数页页眉 - 机密文件', ['italic' => true, 'color' => 'FF0000']);
$evenHeader->addImage('path/to/logo_even.png', ['width' => 50, 'height' => 20, 'alignment' => 'left']);
// ===== 添加文档内容(确保有足够内容分页) =====
$section->addTitle('文档标题', 1);
for ($i = 1; $i <= 50; $i++) {
$section->addText("第 {$i} 段内容 - 这是一个示例文档,用于演示奇偶页不同的页眉设置。");
$section->addTextBreak();
}
// 保存文档
$filename = 'odd_even_headers.docx';
$tempFile = tempnam(sys_get_temp_dir(), $filename);
$writer = IOFactory::createWriter($phpWord);
$writer->save($tempFile);
return $tempFile;
}
在 Laravel 控制器中使用
namespace App\Http\Controllers;
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class DocumentController extends Controller
{
public function downloadDocumentWithHeaders(): BinaryFileResponse
{
$filePath = $this->generateDocumentWithOddEvenHeaders();
return response()->download(
$filePath,
'professional_document.docx',
['Content-Type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document']
)->deleteFileAfterSend(true);
}
private function generateDocumentWithOddEvenHeaders(): string
{
// 上面的生成代码...
}
}
路由设置
// routes/web.php
use App\Http\Controllers\DocumentController;
Route::get('/download-document', [DocumentController::class, 'downloadDocumentWithHeaders'])
->name('document.download')
->middleware('auth');
关键点说明
-
启用奇偶页设置:
$settings = $phpWord->getSettings(); $settings->setEvenAndOddHeaders(true);
-
创建节时启用不同页眉:
$section = $phpWord->addSection([ 'differentOddEven' => true, 'headerHeight' => 400 ]);
-
添加不同页眉:
- 奇数页页眉:
$section->addHeader()
- 偶数页页眉:
$section->addHeader('even')
- 奇数页页眉:
完整功能扩展(含页脚)
public function generateFullDocument()
{
$phpWord = new PhpWord();
// 启用奇偶页不同设置
$settings = $phpWord->getSettings();
$settings->setEvenAndOddHeaders(true);
// 添加节
$section = $phpWord->addSection([
'differentOddEven' => true,
'headerHeight' => 400,
'footerHeight' => 400
]);
// === 奇数页页眉 ===
$oddHeader = $section->addHeader();
$oddHeader->addText('奇数页页眉', ['bold' => true]);
// === 偶数页页眉 ===
$evenHeader = $section->addHeader('even');
$evenHeader->addText('偶数页页眉', ['bold' => true, 'color' => '0000FF']);
// === 奇数页页脚 ===
$oddFooter = $section->addFooter();
$oddFooter->addPreserveText('奇数页 - 第 {PAGE} 页 / 共 {NUMPAGES} 页', null, ['alignment' => 'left']);
// === 偶数页页脚 ===
$evenFooter = $section->addFooter('even');
$evenFooter->addPreserveText('偶数页 - 第 {PAGE} 页 / 共 {NUMPAGES} 页', null, ['alignment' => 'right']);
// 添加文档内容...
return $this->saveDocument($phpWord);
}
private function saveDocument(PhpWord $phpWord): string
{
$filename = 'full_document.docx';
$tempFile = tempnam(sys_get_temp_dir(), $filename);
$writer = IOFactory::createWriter($phpWord);
$writer->save($tempFile);
return $tempFile;
}
使用模板处理奇偶页页眉
public function processTemplateWithHeaders()
{
$template = new TemplateProcessor('template.docx');
// 替换奇数页页眉内容
$template->setValue('odd_header_text', '公司名称 - 奇数页');
// 替换偶数页页眉内容
$template->setValue('even_header_text', '机密文档 - 偶数页');
// 替换页眉图片(如果模板中有)
$template->setImageValue('odd_header_logo', 'path/to/logo_odd.png');
$template->setImageValue('even_header_logo', 'path/to/logo_even.png');
$template->saveAs('processed_document.docx');
}
注意事项
- 确保足够的分页内容:需要至少两页内容才能看到奇偶页效果
- 页眉元素定位:
- 使用
alignment
参数控制对齐方式 - 使用表格进行复杂布局
- 使用
- 单位系统:
- 尺寸单位:twip(1 cm = 567 twip)
- 边距单位:twip
- 页码标记:
- 使用
{PAGE}
表示当前页码 - 使用
{NUMPAGES}
表示总页数 - 必须使用
addPreserveText()
方法
- 使用
以上代码提供了完整的奇偶页页眉实现方案,包括基本设置、控制器集成和模板处理方法。可以根据实际需求调整内容和样式。