java导出订单明细_订单导出pdf⽂件原理
原始数据->加载模板->临时⽂件->PDF⽂件
⽅案准备
html模板转pdf 难点:1. 每次变化都要设计师;2. html样式很难控制(个⼈不擅长);3.html转pdf样式难以控制
word模板转pdf 难点:1. 合适插件的选择;2. 中⽂的处理
最终选择,word模板模式
实现步骤
WORD插件 开源地址
composer require phpoffice/phpword
phpword⾮常好⽤,⽀持变量,太⽅便了。
WORD转PDF插件 下载地址
/opt/libreoffice6.4/program/soffice
完整demo关心的话
//⽣成订单pdf
public function order_pdf_f()
{
#1. 准备订单信息
$person_addr = "北京市";
$person_name = "张三";
如何用qq邮箱发邮件$person_mobile= "189********";
#2. ⽣成素材⽂件
$res_dir_path = './res/';输入手机号查物流单号
$templateFile = $res_dir_path.'temp_order.docx';
$wordPath = $res_dir_path.'tmp/hello.docx';//计算机上的⼀个⽂件
word打开是乱码try {
$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($templateFile);
$templateProcessor->setValue('person_name', $person_name);
$templateProcessor->setValue('person_addr', $person_addr);
$templateProcessor->setValue('person_mobile', $person_mobile);
$templateProcessor->saveAs($wordPath);
} catch (Exception $e) {
echo $e->getMessage();
return;
}
#3. ⽣成pdf并下载
try {
四级阅读满分多少分?$pdfPath = $res_dir_path.'tmp';
$set_charset = 'export LANG=zh_CN.UTF-8;';#linux
$cmd = $set_charset."\n"."/opt/libreoffice6.4/program/soffice --headless --convert-to pdf:writer_pdf_Export {$wordPath} --outdir {$pdfPath}";
$status = 1;
$log = null;
$log = shell_exec($cmd);
if(is_null($log)) {
#echo "start exec";
exec($cmd.' 2>&1', $log, $status);
}
sleep(1);
#4. 页⾯跳转到下载
$file =$pdfPath."/hello.pdf";//计算机上的⼀个⽂件
$fileName = basename($file);//获取⽂件名
header("Content-Type:application/octet-stream"); //告诉浏览器⽂档类型(mime类型); octet-stream指的是⼆进制⽂件类型;下载任何类型的⽂件都可以这么指定
header("Content-Disposition:attachment;filename=".$fileName); //告诉浏览器以附件⽅式对待⽂件(即下载⽂件);并设置下载后的⽂件名
header("Accept-ranges:bytes"); //告诉浏览器⽂件⼤⼩的单位
header("Accept-Length:".filesize($file)); //告诉浏览器⽂件的⼤⼩
$h = fopen($file, 'r'); //打开⽂件
echo fread($h, filesize($file));
} catch (Exception $e) {
echo $e->getMessage();
return;
}
}
注意
导出时,⽼是出现乱码,⼀开始⽐较抓狂。不知道哪⾥出了问题。后来冷静分析了⼀下。
数据->word模板->word⽂件,只要⽣成的word⽂件,没有乱码就成功⼀半了 系统环境变量修改
#1. 修改语⾔环境变量
vi /f
LANG=zh_CN.UTF-8
插件底层源码修改
/www/wwwroot/项⽬名/vendor/phpoffice/phpword/src/PhpWord/TemplateProcessor.php 第256⾏
/**
* @param string $subject
*
* @return string
*/
protected static function ensureUtf8Encoded($subject)
{
if (!Text::isUTF8($subject)) {
#$subject = utf8_encode($subject);
$subject = iconv("GB2312","UTF-8//IGNORE",$subject);
}
return $subject;
}
#1. 在CentOS 4.x开始⽤fontconfig来安装字体库
yum -y install fontconfig
#2. 创建中⽂字体路径
mkdir -p /usr/shared/fonts/chinese
#3. ftp上传字体到 /usr/shared/fonts/chinese
音欠
c盘下的Windows/Fonts⽬录
#4. 修改字体权限
chmod -R 755 /usr/share/fonts/chinese
#5. 安装ttmkfdir来搜索⽬录中所有的字体信息
yum -y install ttmkfdir
#6. 执⾏ttmkfdir命令
ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
#7. 引⼊中⽂
vi /etc/f
...
#新加这⾏
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论