原理

原始数据->加载模板->临时文件->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 = "张三";

$person_mobile= "18932000000";

#2. 生成素材文件

$res_dir_path = './res/';

$templateFile = $res_dir_path.'temp_order.docx';

$wordPath = $res_dir_path.'tmp/hello.docx';//计算机上的一个文件

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 /etc/locale.conf

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/fonts/fonts.conf

...

#新加这行

...

#8. 刷新内存中的字体缓存

fc-cache

#9. 检查是否生效

fc-list

java 导出订单明细_订单导出pdf文件相关推荐

  1. java 使用itextpdf工具实现HTML转PDF文件

    java 使用itextpdf工具实现HTML转PDF文件 本文转载https://my.oschina.net/960823/blog/1588166内容 demo maven依赖包 <dep ...

  2. Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)

    一.效果图 1.带页码效果 2.目录效果 前言:Java 使用iText7生成带页码的PDF文件,同时生成目录PDF,但限于水平,暂时还在摸索合并两个PDF.不过看了一下,iText好像有生成目录的代 ...

  3. java实现通过url实现浏览器下载pdf文件

    java实现通过url实现浏览器下载pdf文件 // 下载pdf文件工具类 public static void toDownload(HttpServletRequest request, Http ...

  4. Java实现多张图片合并成一份PDF文件

    Java实现多张图片合并成一份PDF文件,一行两列展示 引入依赖包 <dependency><groupId>com.lowagie</groupId><ar ...

  5. 网页导出pdf不完整_怎样将PDF文件中的图片提取出来并保存?

    日常工作或学习中经常会接触很多PDF文档,有时其中有些图片是我们需要用到的,应该如何将这些图片从PDF文件中提取出来并且保存呢? 我们可以用PDF编辑器来实现这个需求,首先用极速PDF编辑器打开我们需 ...

  6. 在linux系统下java实现pdf导出汉字无法显示_ubuntu/Linux PDF文件中文无法显示或中文为方块的解决方法...

    ubuntu1004,pdf文件有的无法显示中文,解决办法如下: 1. 先安装字体 A.sudo apt-get install xpdf-chinese-simplified; B. sudo ap ...

  7. java pdf添加透明水印_如何在PDF文件中添加透明水印

    原标题:如何在PDF文件中添加透明水印 有些文件添加水印,但是又不想水印影响文件的使用有时候会设置透明水印,那么PDF怎么设置透明水印呢,应该有很多的小伙伴们都很好奇应该怎么做吧,接下来就为大家分享一 ...

  8. java 获取pdf总页数_如何获取PDF文件的总页数 - iTextSharp,c#

    我需要帮助.我花了最后4个小时试图获得我的PDF文件的总页数.我希望在页脚中有"Page X/Y"之类的内容.有人可以告诉我该怎么做这个代码?如何获取PDF文件的总页数 - iTe ...

  9. JAVA删除pdf空白页_如何编辑PDF文件,如何删除PDF文档中的空白页

    时代在发展,科技在进步,我们现在日常使用的文件也发展了,以前只有Word跟TXT,现在还增加了一个PDF格式的文件,但PDF格式的文件跟Word和TXT文件不一样,Word跟TXT文件可以直接的打开编 ...

最新文章

  1. Java日常开发的21个坑,你踩过几个?
  2. systemd设置静态IP
  3. 三年从前端小工到架构-知乎 Live 学习整理
  4. css中光标的设置,CSS Cursors(光标)
  5. 对一次短路故障的分析与总结
  6. java event 异步_[转]java异步编程
  7. 歪枣网Mysql优化总结
  8. Apache Kylin 部署之不完全指南
  9. SimpleGIS在线地图插件
  10. Linux系统控制文件 /etc/sysctl.conf详解
  11. linux非对称内存,CryptoAPI与OpenSSL RSA非对称加密解密(PKCS1 PADDING)交互
  12. 使用CSS和javascript制作拼图验证码
  13. linux下ace安装教程,linux下安装ACE开发环境
  14. JAVA实验七 图形用户界面的设计与实现
  15. Unix/Linux编程:多协议服务器(TCP/UDP)-----DAYTIME
  16. React native大版本迭代信息记录
  17. Java输出PPT文件(二) - 占位符数据替换
  18. 【图文教程】文件压缩和打包
  19. 怎么写功能测试报告,分享专业的功能报告模板
  20. 医学图像分割新网络:Boundary-aware Context Neural Network for Medical Image Segmentation

热门文章

  1. 网络训练生成飞行轨迹
  2. 武汉大学617计算机综合知识,2019年武汉大学硕士研究生入学考试真题(汇总)...
  3. 磊哥测评之数据库SaaS篇:腾讯云控制台、DMC和小程序
  4. MAC从系统偏好启动mysql无效处理方法
  5. 【乐理学习笔记】五度循环圈
  6. TUM数据集官方说明相应的评估文件evaluate_rpe.py和evaluate_ate.py的使用
  7. mysql pacemaker_corosync+pacemaker+drbd+mysql实现高可用
  8. Brother打印机的安装
  9. 零基础入门转录组分析——第五章(表达定量)
  10. 【最火的ios开发技术】常用工具和ios常用开源框架库