最近,在Laravel + Eloquent的一个项目中,我需要制作可打印形式的文档-发票,Word格式的合同。由于系统中有许多不同的文档,因此我决定将其通用化,以便以后可以在其他项目中使用。
结果是实现了将集成到项目中的成本降至最低的实施。
正如我以前制作可打印表格一样。使用不同的方法
- 将标签放置在文档模板中,并在生成期间替换它们。
- 从头开始生成文档文本。
- 生成html并将其转换为word。
- 我制作了自己的系统来类似于本文所述的文档生成系统,但是使用了不同的技术。
每个选项都适合其任务。但是,如果您有Eloquent,那么我强烈建议您使用本文中介绍的选项。
所以,我们连接包装
composer require mnvx/eloquent-print-form
并描述口才的模型(如果尚未描述)。假设您有以下模型。
use Illuminate\Database\Eloquent\Model;
/**
* @property string $number
* @property string $start_at
* @property Customer $customer
* @property ContractAppendix[] $appendixes
*/
class Contract extends Model
{
public function customer()
{
return $this->belongsTo(Customer::class);
}
public function appendixes()
{
return $this->hasMany(ContractAppendix::class);
}
}
/**
* @property string $name
* @property CustomerCategory $category
*/
class Customer extends Model
{
public function category()
{
return $this->belongsTo(CustomerCategory::class);
}
}
/**
* @property string $number
* @property string $date
* @property float $tax
*/
class ContractAppendix extends Model
{
public function getTaxAttribute()
{
$tax = 0;
foreach ($this->items as $item) {
$tax += $item->total_amount * (1 - 100 / (100+($item->taxStatus->vat_rate ?? 0)));
}
return $tax;
}
}
为了清楚起见,关系图
也就是说,描述了带有合同的表(Contract
),合同可以用交易对手(Customer
)填充,交易对手可以填充类别。合同可以包含多个附件(ContractAppendix
)。
生成可打印文件所需要做的只是描述可打印模板中的字段。创建具有此内容的docx文件
Eloquent. , , , ${customer.category.name}
.
, |
, ${number|placeholder}
. , , ${start_at|date|placeholder}
.
placeholder
— "____",date
— 24.12.2020,dateTime
— - 24.12.2020 23:11,int
— 2`145,decimal
— 2`145.07.
. ${entities.#row_number}
.
既然已经描述了文档,剩下的只是简单地开始生成可打印的
use Mnvx\EloquentPrintForm\PrintFormProcessor;
$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);
生成的文件$tempFileName
将包含准备好的可打印内容。
在Laravel项目中,负责生成可打印内容的控制器方法可能如下所示
public function downloadPrintForm(FormRequest $request)
{
$id = $request->get('id');
$entity = Contract::find($id);
$printFormProcessor = new PrintFormProcessor();
$templateFile = resource_path('path_to_print_forms/your_print_form.docx');
$tempFileName = $printFormProcessor->process($templateFile, $entity);
$filename = 'contract_' . $id;
return response()
->download($tempFileName, $filename . '.docx')
->deleteFileAfterSend();
}
总结一下,我会说,我在一个具有很多可打印表格的项目中制作了这个小型库,从而减轻了自己的负担。我不需要为每个代码编写自己的独特代码。我只是如上所述描述变量,并很快得到结果。如果该程序包可以帮助您节省时间,我将很高兴。