技术标签: spring visual studio code java SpringBoot
大家好,我是“Java分布式架构实战”的作者Jamesfu。
最近在做一个项目,需要将CMS中的内容动态地生成word文档和pdf文档。
Word模板主要包括页眉、页脚、正文。正文中又分为标题、题注、富文本内容。
word模板
//构造规章文档生成参数
String notes = "";
if (StringUtils.isNotBlank(articleInsertVo.getNotes())) {
notes = "(" + articleInsertVo.getNotes() + ")";
}
Map<String, String> params = new HashMap<>();
params.put("title", articleInsertVo.getTitle());
params.put("notes", notes);
params.put("content", articleInsertVo.getContent());
XWPFDocument doc = WordExportUtil.exportWord07(templatePath, data)
FileOutputStream fos = new FileOutputStream(outputFile)
doc.write(fos);
fos.flush();
fos.close();
### 对html进行标准化处理并增加字符集设置
Document document = org.jsoup.Jsoup.parse(htmlContent);
document.head().prepend("<meta charset=\"utf-8\"/>");
String normalizedHtmlContent = document.html();
### 将标准化后的html内容插入word文件
WordprocessingMLPackage aPackage = WordprocessingMLPackage.load(outputFile);
MainDocumentPart mainDocumentPart = aPackage.getMainDocumentPart();
mainDocumentPart.addAltChunk(AltChunkType.Html, normalizedHtmlContent.getBytes(Charsets.UTF_8));
aPackage.save(outputFile);
### 将本地文件转换成MultipartFile后,执行上传
private MultipartFile fileToMultipartFile(File localFile) throws IOException {
FileItem fileItem = new DiskFileItem("file",
Files.probeContentType(localFile.toPath()),
false, localFile.getName(),
(int) localFile.length(),
localFile.getParentFile());
MultipartFile multipartFile;
try (InputStream input = new FileInputStream(localFile); OutputStream os = fileItem.getOutputStream()) {
IOUtils.copy(input, os);
multipartFile = new CommonsMultipartFile(fileItem);
return multipartFile;
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
最终,通过了Windows,MacOS上的Microsoft Word\WPS测试。
easypoi无法插入富文本内容
Document document = org.jsoup.Jsoup.parse(htmlContent);
document.head().prepend("<meta charset=\"utf-8\"/>");
String normalizedHtmlContent = document.html();
富文本内容缺少html根元素,导致没有解析成页面。
<meta charset="utf-8"/>
导出的word中html页面内容乱码
本项目的难点在于正文是富文本编辑器产生的一段html内容,最终通过Easypoi和docx4j组合来生成word文档。在测试过程中,本来想用word转pdf,经过测试发现docx4j转pdf不能正常处理页眉、页脚和html内容部分。后来发现可以考虑用wkhtmltopdf来生成pdf。
/usr/local/bin/wkhtmltopdf \
--enable-local-file-access \
--header-html file:///Users/jamesfu/data/temp/ruleArticle/header.html \
--footer-html file:///Users/jamesfu/data/temp/ruleArticle/footer.html \
/Users/jamesfu/data/temp/ruleArticle/gz.html \
/Users/jamesfu/data/temp/ruleArticle/gz.pdf
wkhtmltopdf转换出来的页面乱码
看到这个结果我还是挺兴奋的,wkhtmltopdf帮助我们打印出来漂亮的页眉、页脚和内容,只是出现了乱码而已。此乱码问题,应该是文件乱码导致的。通过Visual Studio Code查看文件发现是UTF-8编码.
vscode打开本地文件时默认以UTF-8编码展示
那为什么还会打印出乱码呢?结果发现文件本身的编码是ascii
我点击右下角的编码,弹出菜单,选择“Save with Encoding”, 文件重新保存为“UTF-8”。
将文件编码修改为UTF-8
文件编码调整为“UTF-8”后,重新打印为pdf文件,一切正常了,接下来还需要研究书签和目录。
最终乱码问题解决,页眉、页脚也生成了,只是还需要再调整一下页眉和页脚的布局,正文的间距等细节。
先简单写到这里吧,这一周为这个事费了不少精力。
遇到个很蛋疼的事儿,centOS7.2,yum安装的lnmp环境。nginx是编译安装的,放在/usr/local/nginx目录下。目前遇到的问题:1,通过service nginx start和service php-fpm start启动正常,关闭什么都正常,但是找不到php文件,只要是php文件访问都是file not found,访问静态文件正常。配置文件完全没有错误,可见2.2,通过/...
闲聊: 自学计算机也有一段时间了,随着一步步的深入以前看书的重要知识点更加清晰了,今天看C#看到了数据进制的转换,以前看的基本忘记了。忘记的原因或许是理解不深刻吧。现在记录一下数据进制新学习的内容。 10进制:十进制的产生或跟是10手指头容易计数的缘故吧,十进制数据以10为计数基数,从0-9这10个数字构成,满十进一。这个概念很重要,我们可以依次运用到其他进制中。 二进
JNI/NDK入门指南之javah和javap的使用和集成 Android JNI/NDK入门指南目录 JNI/NDK入门指南之正确姿势了解JNI和NDK JNI/NDK入门指南之JavaVM和JNIEnv JNI/NDK入门指南之JNI数据类型,描述符详解...
#include #include #define __STDC_CONSTANT_MACROS#ifdef _WIN32 //Windowsextern "C" {#include "libavformat/avformat.h"};#else //Linux...#ifdef __cplusplusextern "C" {#endif#include #ifde
在Linux操作系统:一提到自主访问控制,人们想到的是基于属主、属组的读写执行的访问控制体系。一提到强制访问控制,人们想到的是Selinux,基于Se的策略控制主体对客体的访问。自主访问控制、强制访问控制,是一种安全策略,不能将其与具体的安全实现划等号。即使我们使用基于属主、属组的安全机制,也同样能够实现强制访问控制。什么是自主访问控制、强制访问控制?自主访问控
Zeppelin介绍Apache Zeppelin提供了web版的类似ipython的notebook,用于做数据分析和可视化。背后可以接入不同的数据处理引擎,包括Spark, hive, tajo等,原生支持Scala, Java, shell, markdown等。它的整体展现和使用形式和Databricks Cloud是一样的,就是来自于当时的demo。Zeppeli
自学编程是一个艰苦的过程,同时也是一个励志的过程。编程不是纯技术,而是一门艺术,编程教会人如何思考。语言只是工具,重要的是思想。问题分析透彻后,你会知道什么编程语言最合适。如何分析与解决问题是选择编程语言的重点。编程从何入手?实用第一,适合就好。Web Apps开发己势不可挡,当然选择从最有意义最有价值的编程语言入门,HTML5+Css3+JavaScript已经密不可分,W...
有人说程序员只能吃青春饭,企业在招聘时会很在意程序员的年龄,大龄程序员一旦离职找工作就会变得艰难。面对年龄很多程序员都表示束手无策。其实,程序员和其他职业一样,干的越久技术越熟练,经验自然更丰富。如果你的年龄和你的薪资不相符,你就应该考虑是不是年龄上去了能力却没上去,你所求的薪资和你要求的岗位,要让企业觉得你值这个价,自然不会被淘汰。如今程序员越来越多,应该怎样规划自己的职业道路呢?程序员的出...
电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
虚拟机Ubuntu18.04装了open-vm-tools之后,可能是由于安全功能加强,共享文件夹不再自动加载,我们必须手工加载使用命令查看共享文件夹vmware-hgfsclientsudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other可能出现下面的提示sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o ...
有人说,人生的质量不在于生命的长短,而在于顿悟的早晚。什么是顿悟?就是人生轨迹发生转折的起点!很多人可能一辈子也不会有顿悟,始终过着按部就班、循规蹈矩、庸庸碌碌的日子。有些人在遭遇重大变故的时候获得了顿悟,最终走上一条全新的人生道路。而聪明人则会通过主动的学习,不断地调整自己对人生的感悟,就象驾车一样,始终瞄准一个最佳的人生方向!有效的学习不需要穷经皓首!有道是“真传一句话,假传万卷书”,很多时候