一、java生成word文档
java生成word文档常用的两种方式:
(1)apache下的poi类库处理office文档
(2)freemarker编辑word文件转换的xml文件
通过网上了解,第(1)种方式使用poi操作数据相对麻烦些,对于word07兼容些好些,第(2)种方式使用freemarker的标签处理数据极为方便,生成doc格式文件不会有兼容问题,但是生成docx文件会有兼容性问题,office07以上版本不能直接打开(wps不受影响),但是可以通过程序进行另存为处理后即可解决
下面使用freemarker生成word文件:
导入依赖包:(为了方便使用freemarker,此处直接导入的starter)
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency>
1.将需要生成word文件另外为xml格式(word XML或word 2003 XML都可以),用文本管理器打开会发现xml标签内容的文件啦,可以在里面写freemarker标签了
2.将xml后缀名改成ftl后缀
3.使用freemarker对ftl文件进行渲染
import freemarker.template.Configuration; import freemarker.template.Template; import java.io.*; /** * 创建word文件 * @param clazz * @param path 模板文件所在路径 * @param template 模板文件名 * @param newWordName 生成的文件名 * @param dataMap 渲染数据 */ public static void generateWord(Class clazz, String path,String template, String newWordName,Map<String, Object> dataMap) { try { Configuration configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setClassForTemplateLoading(clazz,path); Template temp = null; //加载模板文件 temp = configuration.getTemplate(template,"utf-8"); File outFile = null; Writer out = null; String filename = newWordName; outFile = new File(newWordName); out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(outFile),"utf-8")); //渲染数据 temp.process(dataMap, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } }
4.渲染后的文件后缀名存为doc,若存为docx,office03以上版本,打开会出错,需要java模拟另存为高版本文件可以解决
二、java word转pdf
doc转pdf最常见的有一下几种方式
(1)使用com.documents4j
(2)使用 com.aspose.words
(3)使用poi、itext
(4)使用openoffice
第(1)种:优点:转换简单,windows环境下几行代码即可实现完美转换,缺点:Linux下需要安装ms-office插件(插件据说官方未提供),否则会出现转换失败。windows服务器环境下有兴趣朋友可以尝试下
见:https://blog.csdn.net/lihaiyang722/article/details/108405355
第(2)种:优点:转换简单,几行代码即可转换,缺点:aspose包依赖下载会失败,需要从第三方下载后手动放到仓库进行依赖,其次,如果部署到Linux下,环境中必须含有和window环境下的字库相一致,否则会出现乱码。
第(3)(4)操作起来相对麻烦些,见:
https://blog.csdn.net/zhangjunli/article/details/104940663
https://www.cnblogs.com/ph7seven/archive/2018/12/21/10158489.html
所以我这边采用第(2)种方案:
导入依赖,jar包从第三方下载放入maven仓库
<dependency> <groupId>com.aspose</groupId> <artifactId>aspose-words-jdk16</artifactId> <version>15.8.0</version> <classifier>jdk16</classifier> </dependency>
word转pdf实现:
import com.aspose.words.License; import com.aspose.words.SaveFormat; import java.io.*; /** *word转pdf * @param docPath word文件路径 * @param pdfPath pdf文件路径 */ public static void doc2pdf(String docPath,String pdfPath){ File pdfFile = new File(pdfPath); try { String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>"; ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes()); License license = new License(); license.setLicense(is); com.aspose.words.Document document = new com.aspose.words.Document(docPath); document.save(new FileOutputStream(pdfFile), SaveFormat.PDF); } catch (Exception e) { logger.info("doc转pdf异常"); e.printStackTrace(); } };
linux下乱码字符处理:
https://blog.csdn.net/qq_40102178/article/details/100738793
https://blog.csdn.net/qq_27319683/article/details/103344196