使用PHP和PHPWord库实现合同文档的自动化生成
作者:lskblog
在当今数字化办公环境中,自动化文档生成已成为提高工作效率的关键技术,本文将详细介绍如何使用PHP配合PHPWord库来自动化生成专业合同文档,并提供完整的代码实现,需要的朋友可以参考下
引言
在当今数字化办公环境中,自动化文档生成已成为提高工作效率的关键技术。本文将详细介绍如何使用PHP配合PHPWord库来自动化生成专业合同文档,并提供完整的代码实现。
一、技术准备
1. 环境要求
- PHP 7.0或更高版本
- Composer依赖管理工具
- 服务器写入权限
2. 安装PHPWord
composer require phpoffice/phpword
二、基础合同生成实现
1. 简单合同生成示例
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\Shared\Converter;
// 初始化PHPWord对象
$phpWord = new PhpWord();
// 设置文档属性
$phpWord->getDocInfo()
->setCreator('智能合同生成系统')
->setCompany('XX科技有限公司')
->setTitle('销售合同')
->setDescription('自动生成的电子合同');
// 添加文档部分
$section = $phpWord->addSection();
// 添加合同标题
$section->addText(
'商品销售合同',
['name' => '宋体', 'size' => 16, 'bold' => true],
['alignment' => 'center', 'spaceAfter' => Converter::pointToTwip(24)]
);
// 合同基本信息
$infoTable = $section->addTable(['borderSize' => 1]);
$infoTable->addRow();
$infoTable->addCell(3000)->addText('合同编号:HT-'.date('YmdHis'));
$infoTable->addCell(3000)->addText('签订日期:'.date('Y年m月d日'));
// 合同正文内容
$section->addTextBreak(1);
$section->addText('甲方(卖方):XX科技有限公司', ['bold' => true]);
$section->addText('乙方(买方):___________________', ['bold' => true]);
// 合同条款
$section->addTextBreak(1);
$section->addText('第一条 商品信息', ['underline' => 'single']);
$section->addListItem('商品名称:XX智能设备', 0, null, 'listParagraph');
$section->addListItem('规格型号:Pro-2023', 0, null, 'listParagraph');
$section->addListItem('数量:1台', 0, null, 'listParagraph');
// 保存文档
$filename = 'contract_'.date('YmdHis').'.docx';
$objWriter = IOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save($filename);
echo "合同已生成:<a href='$filename'>下载合同</a>";
三、高级功能实现
- 创建Word模板
- 在开始编写代码之前,你需要准备一个Word模板文件。在这个模板中,所有需要动态替换的内容都应该使用占位符表示。例如,你的合同模板可能看起来像这样:
甲方(借款人):${borBusNm}
身份证号码:${aidcard}
乙方(出借人):${lender}
身份证号码:${bidcard}
- 在这个例子中,
${borBusNm}、${aidcard}、${lender}和${bidcard}是将被替换的变量。
1. 使用模板生成合同
use PhpOffice\PhpWord\TemplateProcessor;
// 合同数据
$contractData = [
'contract_no' => 'HT-'.date('YmdHis'),
'date' => date('Y年m月d日'),
'seller' => 'XX科技有限公司',
'buyer' => '张三',
'product' => 'XX智能设备',
'price' => '¥5,999.00',
'terms' => '1. 质保期1年\n2. 7天无理由退货'
];
// 加载模板
$template = new TemplateProcessor('contract_template.docx');
// 替换模板变量内容
foreach($contractData as $key => $value) {
$template->setValue($key, $value);
}
// 添加签名图片
$template->setImageValue('signature', [
'path' => 'signatures/sign.png',
'width' => 120,
'height' => 60,
'ratio' => true,
'alignment' => 'left',
'spaceBefore' => Converter::pointToTwip(12),
'spaceAfter' => Converter::pointToTwip(12)
]);
// 保存生成的合同
$outputFile = 'contract_'.date('YmdHis').'.docx';
$template->saveAs($outputFile);
2. 复杂表格生成
// 创建商品明细表格
$productsTable = $section->addTable([
'borderSize' => 1,
'borderColor' => '000000',
'cellMargin' => 50
]);
// 表头
$productsTable->addRow();
$productsTable->addCell(1000)->addText('序号', ['bold' => true, 'alignment' => 'center']);
$productsTable->addCell(3000)->addText('商品名称', ['bold' => true]);
$productsTable->addCell(2000)->addText('单价', ['bold' => true]);
$productsTable->addCell(2000)->addText('数量', ['bold' => true]);
// 表格内容
$products = [
['XX智能设备', '¥5,999.00', 1],
['配件套装', '¥299.00', 2]
];
foreach($products as $i => $product) {
$productsTable->addRow();
$productsTable->addCell(1000)->addText($i+1, ['alignment' => 'center']);
$productsTable->addCell(3000)->addText($product[0]);
$productsTable->addCell(2000)->addText($product[1], ['alignment' => 'right']);
$productsTable->addCell(2000)->addText($product[2], ['alignment' => 'center']);
}
四、实用技巧
1. 添加页眉页脚
// 添加页眉
$header = $section->addHeader();
$header->addText('XX科技有限公司销售合同',
['size' => 10, 'color' => '666666'],
['alignment' => 'center']
);
// 添加页脚
$footer = $section->addFooter();
$footer->addPreserveText('第 {PAGE} 页 共 {NUMPAGES} 页',
['size' => 9],
['alignment' => 'center']
);
2. 设置文档样式
// 定义样式
$phpWord->addTitleStyle(1, ['size' => 16, 'bold' => true], ['spaceAfter' => 240]);
$phpWord->addParagraphStyle('indent', ['indentation' => ['firstLine' => 400]]);
// 使用样式
$section->addText('特别条款:', null, 'indent');
3. 生成PDF版本
use PhpOffice\PhpWord\Settings;
// 设置PDF渲染库
Settings::setPdfRendererName(Settings::PDF_RENDERER_DOMPDF);
Settings::setPdfRendererPath('vendor/dompdf/dompdf');
// 生成PDF
$pdfWriter = IOFactory::createWriter($phpWord, 'PDF');
$pdfWriter->save('contract.pdf');
五、完整项目示例
一个完整的合同自动化生成系统应包含以下结构:
/project-root │ ├── /templates # 合同模板目录 │ ├── sales_contract.docx # 销售合同模板 │ └── service_contract.docx # 服务合同模板 │ ├── /signatures # 签名图片目录 │ ├── sign1.png │ └── sign2.png │ ├── /generated # 生成的合同目录 │ ├── composer.json # 依赖配置 └── contract_generator.php # 主程序文件
contract_generator.php 完整示例:
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\Shared\Converter;
class ContractGenerator {
private $templatePath = 'templates/sales_contract.docx';
private $outputDir = 'generated/';
public function generate($data) {
// 检查输出目录
if (!file_exists($this->outputDir)) {
mkdir($this->outputDir, 0777, true);
}
// 加载模板
$template = new TemplateProcessor($this->templatePath);
// 替换基本内容
foreach ($data['basic'] as $key => $value) {
$template->setValue($key, $value);
}
// 添加商品表格
if (!empty($data['products'])) {
$this->addProductsTable($template, $data['products']);
}
// 添加签名
if (!empty($data['signature'])) {
$template->setImageValue('signature', [
'path' => $data['signature']['path'],
'width' => $data['signature']['width'] ?? 120,
'ratio' => true,
'alignment' => 'left',
'spaceBefore' => Converter::pointToTwip(12),
'spaceAfter' => Converter::pointToTwip(12)
]);
}
// 保存文件
$filename = 'contract_'.date('YmdHis').'.docx';
$outputPath = $this->outputDir.$filename;
$template->saveAs($outputPath);
return $outputPath;
}
private function addProductsTable($template, $products) {
// 实现添加商品表格的逻辑
}
}
// 使用示例
$generator = new ContractGenerator();
$contractData = [
'basic' => [
'contract_no' => 'HT-'.date('YmdHis'),
'date' => date('Y年m月d日'),
'seller' => 'XX科技有限公司',
'buyer' => '张三'
],
'products' => [
['name' => 'XX智能设备', 'price' => '¥5,999.00', 'qty' => 1],
['name' => '配件套装', 'price' => '¥299.00', 'qty' => 2]
],
'signature' => [
'path' => 'signatures/sign1.png',
'width' => 150
]
];
$filepath = $generator->generate($contractData);
echo "合同已生成:<a href='$filepath'>下载</a>";
六、总结
通过PHPWord库,我们可以实现:
从模板生成标准化合同文档动态插入文本、表格和图片灵活控制文档样式和格式批量生成不同内容的合同输出为DOCX或PDF格式
这种自动化方案特别适合需要频繁生成标准合同的企业,可以显著提高工作效率,减少人为错误,并确保所有合同格式统一规范。
以上就是使用PHP和PHPWord库实现合同文档的自动化生成的详细内容,更多关于PHP PHPWord自动化生成合同文档的资料请关注脚本之家其它相关文章!
