当前位置:   article > 正文

word和.txt文件转html 及pdf文件, 使用poi jsoup itext心得

xwpfdocument写入html
                         word和.txt文件转html 及pdf文件, 使用poi jsoup  itext心得本人第一次写博客,有上面不足的或者需要改正的希望大家指出来,一起学习交流讨论。由于在项目中遇到了这一个问题,在网上也找了很多方法,感觉千篇一律,总有一些问题,因此总结出word转html和pdf文件使用方法。虽然poi功能不是很强大,但毕竟不依靠本地office软件,同样还有一种方式使用jacob也可以将word转html,不过这个方式要依靠本地office,而且只能在windows平台下,不支持unix系统。jacob使用起来还是比较简单的,如果大家需要jacob的使用方法,我会分享给大家。关于.txt文件转html,就是使用io操作将.txt文件读取出来然后写入到html中,也不需要额外的jar包。注意:使用poi需要注意以下几项,由于我在做这个功能的时候没有注意这个问题的存在,一直找不出原因,还请有关大牛门指正一下为什么?    1.使用office的文档.doc和.docx格式的都没有问题,但使用wps生成的word文档时,只能转.doc格式的文件,对.docx的文档转出后没有图片,得不到img属性。    2.在使用word文档转pdf格式的文件时,生成的pdf没有中文,对中文显示不是很支持。    3.在将word转成pdf时,需要把生成的html文件转化成标准的html文件,不然解析后会出现<meta>或者<img>标签不闭合的情况。    4.使用的jar包如下,都可以在maven中央仓库下载得到。
  1. 下面就直接附上代码了,希望大家有什么问题在下面评论互相交流和学习,使用时直接调用方法即可。如果大家觉得可以请点一个赞,谢谢大家。package com.kqco.tools;
  2. import org.apache.poi.hwpf.HWPFDocument;
  3. import org.apache.poi.hwpf.converter.PicturesManager;
  4. import org.apache.poi.hwpf.converter.WordToHtmlConverter;
  5. import org.apache.poi.hwpf.usermodel.PictureType;
  6. import org.apache.poi.xwpf.converter.core.BasicURIResolver;
  7. import org.apache.poi.xwpf.converter.core.FileImageExtractor;
  8. import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
  9. import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
  10. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  11. import org.jsoup.Jsoup;
  12. import org.w3c.dom.Document;
  13. import org.w3c.tidy.Tidy;
  14. import org.xhtmlrenderer.pdf.ITextFontResolver;
  15. import org.xhtmlrenderer.pdf.ITextRenderer;
  16. import com.lowagie.text.pdf.BaseFont;
  17. import javax.xml.parsers.DocumentBuilderFactory;
  18. import javax.xml.transform.OutputKeys;
  19. import javax.xml.transform.Transformer;
  20. import javax.xml.transform.TransformerFactory;
  21. import javax.xml.transform.dom.DOMSource;
  22. import javax.xml.transform.stream.StreamResult;
  23. import java.io.BufferedInputStream;
  24. import java.io.BufferedOutputStream;
  25. import java.io.BufferedReader;
  26. import java.io.BufferedWriter;
  27. import java.io.ByteArrayInputStream;
  28. import java.io.ByteArrayOutputStream;
  29. import java.io.DataOutputStream;
  30. import java.io.File;
  31. import java.io.FileInputStream;
  32. import java.io.FileOutputStream;
  33. import java.io.IOException;
  34. import java.io.InputStreamReader;
  35. import java.io.OutputStream;
  36. import java.io.OutputStreamWriter;
  37. import java.io.PrintWriter;
  38. import java.nio.file.Path;
  39. import java.nio.file.Paths;
  40. public class FileConverter {
  41. /*
  42. * word文件转成html文件
  43. * sourceFilePath:源word文件路径
  44. * targetFilePosition:转化后生成的html文件路径
  45. */
  46. public void wordToHtml(String sourceFilePath, String targetFilePosition) throws Exception {
  47. if (".docx".equals(sourceFilePath.substring(sourceFilePath.lastIndexOf(".", sourceFilePath.length())))) {
  48. docxToHtml(sourceFilePath, targetFilePosition);
  49. } else if (".doc".equals(sourceFilePath.substring(sourceFilePath.lastIndexOf(".", sourceFilePath.length())))) {
  50. docToHtml(sourceFilePath, targetFilePosition);
  51. } else {
  52. throw new RuntimeException("文件格式不正确");
  53. }
  54. }
  55. /*
  56. * doc转换为html
  57. * sourceFilePath:源word文件路径
  58. * targetFilePosition:生成的html文件路径
  59. */
  60. private void docToHtml(String sourceFilePath, String targetFilePosition) throws Exception {
  61. final Path imagePath = Paths.get(targetFilePosition).getParent().resolve("image");
  62. HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(sourceFilePath));
  63. Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
  64. WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(document);
  65. // 保存图片,并返回图片的相对路径
  66. wordToHtmlConverter.setPicturesManager(new PicturesManager() {
  67. @Override
  68. public String savePicture(byte[] content, PictureType pictureType, String name, float width, float height) {
  69. try (FileOutputStream out = new FileOutputStream(imagePath.resolve(name).toString())) {
  70. out.write(content);
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. }
  74. return "../tmp/image/" + name;
  75. }
  76. });
  77. wordToHtmlConverter.processDocument(wordDocument);
  78. Document htmlDocument = wordToHtmlConverter.getDocument();
  79. DOMSource domSource = new DOMSource(htmlDocument);
  80. StreamResult streamResult = new StreamResult(new File(targetFilePosition));
  81. TransformerFactory tf = TransformerFactory.newInstance();
  82. Transformer serializer = tf.newTransformer();
  83. serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  84. serializer.setOutputProperty(OutputKeys.INDENT, "yes");
  85. serializer.setOutputProperty(OutputKeys.METHOD, "html");
  86. serializer.transform(domSource, streamResult);
  87. }
  88. /*
  89. * docx转换为html
  90. * sourceFilePath:源word文件路径
  91. * targetFileName:生成的html文件路径
  92. */
  93. private void docxToHtml(String sourceFilePath, String targetFileName) throws Exception {
  94. String imagePathStr = Paths.get(targetFileName).getParent().resolve("../tmp/image/word/media").toString();
  95. OutputStreamWriter outputStreamWriter = null;
  96. try {
  97. XWPFDocument document = new XWPFDocument(new FileInputStream(sourceFilePath));
  98. XHTMLOptions options = XHTMLOptions.create();
  99. // 存放图片的文件夹
  100. options.setExtractor(new FileImageExtractor(new File(imagePathStr)));
  101. // html中图片的路径
  102. options.URIResolver(new BasicURIResolver("../tmp/image/word/media"));
  103. outputStreamWriter = new OutputStreamWriter(new FileOutputStream(targetFileName), "UTF-8");
  104. XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
  105. xhtmlConverter.convert(document, outputStreamWriter, options);
  106. } finally {
  107. if (outputStreamWriter != null) {
  108. outputStreamWriter.close();
  109. }
  110. }
  111. }
  112. /*
  113. * txt文档转html
  114. filePath:txt原文件路径
  115. htmlPosition:转化后生成的html路径
  116. */
  117. public void txtToHtml(String filePath, String htmlPosition) {
  118. try {
  119. String encoding = "GBK";
  120. File file = new File(filePath);
  121. if (file.isFile() && file.exists()) { // 判断文件是否存在
  122. InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
  123. // 考虑到编码格式
  124. BufferedReader bufferedReader = new BufferedReader(read);
  125. // 写文件
  126. FileOutputStream fos = new FileOutputStream(new File(htmlPosition));
  127. OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
  128. BufferedWriter bw = new BufferedWriter(osw);
  129. String lineTxt = null;
  130. while ((lineTxt = bufferedReader.readLine()) != null) {
  131. bw.write(lineTxt + "</br>");
  132. }
  133. bw.close();
  134. osw.close();
  135. fos.close();
  136. read.close();
  137. } else {
  138. System.out.println("找不到指定的文件");
  139. }
  140. } catch (Exception e) {
  141. System.out.println("读取文件内容出错");
  142. e.printStackTrace();
  143. }
  144. }
  145. /*
  146. 移动图片到指定路径
  147. sourceFilePath:原始路径
  148. targetFilePosition:移动后存放的路径
  149. */
  150. public void changeImageUrl(String sourceFilePath,String targetFilePosition) throws IOException {
  151. FileInputStream fis = new FileInputStream(sourceFilePath);
  152. BufferedInputStream bufis = new BufferedInputStream(fis);
  153. FileOutputStream fos = new FileOutputStream(targetFilePosition);
  154. BufferedOutputStream bufos = new BufferedOutputStream(fos);
  155. int len = 0;
  156. while ((len = bufis.read()) != -1) {
  157. bufos.write(len);
  158. }
  159. bufis.close();
  160. bufos.close();
  161. }
  162. /*
  163. * html文件解析成xhtml,变成标准的html文件
  164. * f_in:源html文件路径
  165. * outfile: 输出后xhtml的文件路径
  166. */
  167. private boolean parseToXhtml(String f_in, String outfile) {
  168. boolean bo = false;
  169. ByteArrayOutputStream tidyOutStream = null; // 输出流
  170. FileInputStream fis = null;
  171. ByteArrayOutputStream bos = null;
  172. ByteArrayInputStream stream = null;
  173. DataOutputStream to = null;
  174. try {
  175. // Reader reader;
  176. fis = new FileInputStream(f_in);
  177. bos = new ByteArrayOutputStream();
  178. int ch;
  179. while ((ch = fis.read()) != -1) {
  180. bos.write(ch);
  181. }
  182. byte[] bs = bos.toByteArray();
  183. bos.close();
  184. String hope_gb2312 = new String(bs, "gb2312");// 注意,默认是GB2312,所以这里先转化成GB2312然后再转化成其他的。
  185. byte[] hope_b = hope_gb2312.getBytes();
  186. String basil = new String(hope_b, "gb2312");// 将GB2312转化成 UTF-8
  187. stream = new ByteArrayInputStream(basil.getBytes());
  188. tidyOutStream = new ByteArrayOutputStream();
  189. Tidy tidy = new Tidy();
  190. tidy.setInputEncoding("gb2312");
  191. tidy.setQuiet(true);
  192. tidy.setOutputEncoding("UTF-8");
  193. tidy.setShowWarnings(true); // 不显示警告信息
  194. tidy.setIndentContent(true);//
  195. tidy.setSmartIndent(true);
  196. tidy.setIndentAttributes(false);
  197. tidy.setWraplen(1024); // 多长换行
  198. // 输出为xhtml
  199. tidy.setXHTML(true);
  200. tidy.setErrout(new PrintWriter(System.out));
  201. tidy.parse(stream, tidyOutStream);
  202. to = new DataOutputStream(new FileOutputStream(outfile));// 将生成的xhtml写入
  203. tidyOutStream.writeTo(to);
  204. bo = true;
  205. } catch (Exception ex) {
  206. System.out.println(ex.toString());
  207. ex.printStackTrace();
  208. return bo;
  209. } finally {
  210. try {
  211. if (to != null) {
  212. to.close();
  213. }
  214. if (stream != null) {
  215. stream.close();
  216. }
  217. if (fis != null) {
  218. fis.close();
  219. }
  220. if (bos != null) {
  221. bos.close();
  222. }
  223. if (tidyOutStream != null) {
  224. tidyOutStream.close();
  225. }
  226. } catch (IOException e) {
  227. e.printStackTrace();
  228. }
  229. System.gc();
  230. }
  231. return bo;
  232. }
  233. /*
  234. * xhtml文件转pdf文件
  235. * inputFile:xhtml源文件路径
  236. * outputFile:输出的pdf文件路径
  237. * imagePath:图片的存放路径 例如(file:/D:/test)
  238. */
  239. private boolean convertHtmlToPdf(String inputFile, String outputFile) throws Exception {
  240. OutputStream os = new FileOutputStream(outputFile);
  241. ITextRenderer renderer = new ITextRenderer();
  242. String url = new File(inputFile).toURI().toURL().toString();
  243. renderer.setDocument(url);
  244. // 解决中文支持问题
  245. ITextFontResolver fontResolver = renderer.getFontResolver();
  246. fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  247. // 解决图片的相对路径问题
  248. renderer.getSharedContext().setBaseURL("imagePath");
  249. renderer.layout();
  250. renderer.createPDF(os);
  251. os.flush();
  252. os.close();
  253. return true;
  254. }
  255. /*
  256. * xhtml转成标准html文件
  257. * targetHtml:要处理的html文件路径
  258. */
  259. private static void standardHTML(String targetHtml) throws IOException {
  260. File f = new File(targetHtml);
  261. org.jsoup.nodes.Document doc = Jsoup.parse(f, "UTF-8");
  262. doc.select("meta").removeAttr("name");
  263. doc.select("meta").attr("content", "text/html; charset=UTF-8");
  264. doc.select("meta").attr("http-equiv", "Content-Type");
  265. doc.select("meta").html("&nbsp");
  266. doc.select("img").html("&nbsp");
  267. doc.select("style").attr("mce_bogus", "1");
  268. doc.select("body").attr("font-family", "SimSun");
  269. doc.select("html").before("<?xml version='1.0' encoding='UTF-8'>");
  270. /*
  271. * Jsoup只是解析,不能保存修改,所以要在这里保存修改。
  272. */
  273. FileOutputStream fos = new FileOutputStream(f, false);
  274. OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
  275. osw.write(doc.html());
  276. System.out.println(doc.html());
  277. osw.close();
  278. }
  279. }

  

转载于:https://www.cnblogs.com/chengpanpan/p/6750029.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/391415
推荐阅读
相关标签
  

闽ICP备14008679号