最近项目上遇到个问题,需要后端实现用word简历模板生成所有学生的简历,并转换成 pdf,然后交给前端去下载。看似很简单的需求,却卡在word转pdf上了。
因为在word版简历模板上不止有水印,还有各种各样的字体,看似很美观,通过代码转换成pdf却出现了乱码与格式错乱。原因在于 字体缺失。word转pdf只能设置pdf文件整体的字体却不能一个个的去设置每一处的字体。
试了linux服务器安装LibreOffice,然后通过命令行转换;也试了用python写批处理文件去转换,但最终都逃不开字体的问题,还是无法设置每一处的字体。如果用tcpdf逐行去手动写入数据到pdf,又工程量巨大,且美观度大打折扣。
正向不行,反向可好?!舍弃“转换”这个思路,直接把word简历,手动转换成pdf,使之成为新的模板。拿着这pdf的简历模板去做"填空题"可好?
有了这个想法,顺着这个思路,终于成了。
首先,通过composer安装tcpdf
composer require tecnickcom/tcpdf
然后,new TcpdfFpdi() ,导入模板文件,多页pdf,需要一页一页去加载。
设置字体,通过坐标,把文字写入到PDF对应的位置。输出即可。
源码如下:
$pdf = new TcpdfFpdi();
$pdf->AddPage();
// 导入模板文件
$templateFile = './template.pdf';
$pdf->setSourceFile($templateFile);
//导入第一页
$tplIdx = $pdf->importPage(1);
// 使用模板页面
$pdf->useTemplate($tplIdx,0,0);
// 设置字体
$fontSong = TCPDF_FONTS::addTTFfont('font/Deng.ttf', 'TrueTypeUnicode', '',32);
$pdf->SetFont($fontSong , '', 12);
// 在指定位置输出文本
$pdf->Text(8, 35, '张三',0,false,true,0,0,'C');
//导入第二页
$tplIdx = $pdf->importPage(2);
$pdf->AddPage();
// 使用模板页面
$pdf->useTemplate($tplIdx,0,0);
// 输出 PDF 文件
ob_end_clean();
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="demo.pdf"');
header('Cache-Control: max-age=0');
$pdf->Output('demo.pdf', 'I');