当前位置:   article > 正文

Springboot功能模块之 使用poi4.1.2 将word转换成html

Springboot功能模块之 使用poi4.1.2 将word转换成html

    因为自己的任务需要用到word转html,但是poi3.1.2的版本与我poi4.1.2版本冲突,所以尝试用4.1.2版本来写一个word转html,它是可以同时支持doc和docx两种格式,非常好用,当前文章是关于docx转html的,doc相对来说比较简单,有兴趣的可以尝试一下

步骤1:创建项目和依赖

  1. <poi.version>4.1.2</poi.version>
  2. <!--注意版本保持一致 poi poi-ooxml poi-scratchpad-->
  3. <dependency>
  4. <groupId>org.apache.poi</groupId>
  5. <artifactId>poi</artifactId>
  6. </dependency>
  7. <!-- 操作doc ppt xls -->
  8. <dependency>
  9. <groupId>org.apache.poi</groupId>
  10. <artifactId>poi-scratchpad</artifactId>
  11. <version>${poi.version}</version>
  12. </dependency>
  13. <!-- 操作docx pptx xlsx -->
  14. <!--word S-->
  15. <dependency>
  16. <groupId>org.apache.poi</groupId>
  17. <artifactId>poi-scratchpad</artifactId>
  18. <version>${poi.version}</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.apache.poi</groupId>
  22. <artifactId>ooxml-schemas</artifactId>
  23. <version>1.4</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>fr.opensagres.xdocreport</groupId>
  27. <artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId>
  28. <version>2.0.2</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>fr.opensagres.xdocreport</groupId>
  32. <artifactId>fr.opensagres.xdocreport.converter.docx.xwpf</artifactId>
  33. <version>2.0.1</version>
  34. </dependency>
  35. <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
  36. <dependency>
  37. <groupId>org.jsoup</groupId>
  38. <artifactId>jsoup</artifactId>
  39. <version>1.17.2</version>
  40. </dependency>

步骤2:读取Word文档

使用Apache POI库读取Word文档。对于.docx文件,使用XWPFDocument类;对于.doc文件,使用HWPFDocument类。

word07转html

  1. public static String Word2007ToHtml(MultipartFile file) throws IOException{
  2. if (file.isEmpty() || file.getSize() <= 0) {
  3. throw new RuntimeException("文件为空,请添加文件");
  4. }else{
  5. if (file.getOriginalFilename().endsWith(".docx") || file.getOriginalFilename().endsWith(".DOCX")){
  6. try (InputStream input = file.getInputStream()) {
  7. XWPFDocument wordDocument = new XWPFDocument(input);
  8. XHTMLOptions options = XHTMLOptions.create();
  9. // 图片转base64
  10. //options.setImageManager(new Base64EmbedImgManager());
  11. // 获取所有图片数据
  12. options.setImageManager(new CustomImageManager(staticmediaUploadApi));
  13. options.setFragment(true);
  14. //忽略页眉页脚
  15. options.setOmitHeaderFooterPages(true);
  16. options.setIgnoreStylesIfUnused(false);
  17. // 转换html
  18. ByteArrayOutputStream htmlStream = new ByteArrayOutputStream();
  19. XHTMLConverter.getInstance().convert(wordDocument, htmlStream, options);
  20. String htmlStr = htmlStream.toString();
  21. htmlStream.close();
  22. return htmlStr;
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. return null; // 或者抛出异常,取决于你的业务逻辑
  26. }
  27. }
  28. else{
  29. throw new RuntimeException("文件格式错误,只能输入 MS Office 2007+ files");
  30. }
  31. }
  32. }

word03版本转html

  1. /**
  2. * 将doc格式的文件转换为html格式
  3. * @param inFileName 输入的doc文件名
  4. * @param outFileName 输出的html文件名
  5. */
  6. public static void docToHtml(String inFileName, String outFileName) {
  7. String content = null;
  8. ByteArrayOutputStream baos = null;
  9. try {
  10. // 新建word输入流,用于读取doc文件内容
  11. FileInputStream source = new FileInputStream(new File(inFileName));
  12. // 获取word对象,用于后续处理
  13. HWPFDocument wordDocument = new HWPFDocument(source);
  14. // 创建WordToHtmlConverter对象,用于转换文档
  15. WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
  16. // 设置图片存放的位置
  17. wordToHtmlConverter.setPicturesManager(new PicturesManager() {
  18. @Override
  19. public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {
  20. File imgPath = new File("F:\\TestFile\\images");
  21. if (!imgPath.exists()) { // 如果图片目录不存在则创建
  22. imgPath.mkdirs();
  23. }
  24. File file = new File("F:\\TestFile\\images" + suggestedName);
  25. try {
  26. OutputStream os = new FileOutputStream(file);
  27. os.write(content);
  28. os.close();
  29. } catch (FileNotFoundException e) {
  30. e.printStackTrace();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. return "F:\\TestFile\\images" + suggestedName;
  35. }
  36. });
  37. // 处理文档转换
  38. wordToHtmlConverter.processDocument(wordDocument);
  39. // 获取转换后的html文档对象
  40. Document htmlDocument = wordToHtmlConverter.getDocument();
  41. // 创建DOMSource对象,用于后续转换
  42. DOMSource domSource = new DOMSource(htmlDocument);
  43. // 创建TransformerFactory对象,用于后续转换操作
  44. TransformerFactory tf = TransformerFactory.newInstance();
  45. // 创建Transformer对象,用于执行实际的转换操作
  46. Transformer serializer = tf.newTransformer();
  47. // 设置输出属性,如编码、缩进等
  48. serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
  49. serializer.setOutputProperty(OutputKeys.INDENT, "yes");
  50. serializer.setOutputProperty(OutputKeys.METHOD, "html");
  51. // 新建输出流,用于写入转换后的html内容到指定文件
  52. FileOutputStream fos = new FileOutputStream(new File(outFileName));
  53. StreamResult streamResult = new StreamResult(fos);
  54. // 执行转换操作,将domSource转换为streamResult
  55. serializer.transform(domSource, streamResult);
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. } finally {
  59. try {
  60. if (baos != null) {
  61. content = new String(baos.toByteArray(), "utf-8");
  62. baos.close();
  63. }
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. }

步骤3:图片处理

  1. /**
  2. * 自定义的图片管理器,继承自ImageManager,用于处理Word文档中的图片。
  3. */
  4. @Slf4j
  5. public class CustomImageManager extends ImageManager {
  6. private MediaUploadApi mediaUploadApi;
  7. private byte[] picture;
  8. private String MediaId;
  9. /**
  10. * 构造函数,初始化基础目录和图片子目录。
  11. *
  12. */
  13. public CustomImageManager(MediaUploadApi staticmediaUploadApi) {
  14. super(new File(""), ""); // 调用父类构造函数
  15. this.mediaUploadApi = staticmediaUploadApi;
  16. }
  17. /**
  18. * 重写extract方法,用于从Word文档中提取图片数据。
  19. *
  20. * @param imagePath 图片的路径
  21. * @param imageData 图片的数据
  22. * @throws IOException 如果读写文件时发生错误
  23. */
  24. @Override
  25. public void extract(String imagePath, byte[] imageData) throws IOException {
  26. this.picture = imageData;// 调用父类的extract方法
  27. File file = FileUtil.writeBytes(imageData, imagePath);
  28. MultipartFile multipartFile;
  29. try {
  30. DiskFileItem item = (DiskFileItem) new DiskFileItemFactory().createItem("file", "image/png", true, file.getName());
  31. Files.copy(Paths.get(file.getAbsolutePath()), item.getOutputStream());
  32. multipartFile = new CommonsMultipartFile(item);
  33. MediaGetResponse upload = mediaUploadApi.upload(multipartFile, null, null, null, null, null, null, null, null);
  34. this.MediaId = upload.getMedia().getMediaId();
  35. log.error(this.MediaId);
  36. } catch (IOException e) {
  37. throw new RuntimeException(e);
  38. }
  39. //byte 转化成 file
  40. }
  41. /**
  42. * 重写resolve方法,用于解析图片的URI。
  43. *
  44. * @param uri 图片的URI
  45. * @return 解析后的图片路径
  46. */
  47. @Override
  48. public String resolve(String uri) {
  49. // 使用上传至云存储的方法
  50. // String imageid = mediaUploadApi.upload()
  51. String imageUrl = "https://api.jizhibao.cn.com/file/download/file/" + this.MediaId;
  52. return imageUrl;
  53. }
  54. /**
  55. * 获取图片相对于基本目录的路径。
  56. *
  57. * @param imagePath 图片的完整路径
  58. * @return 相对路径
  59. */
  60. private String getImageRelativePath(String imagePath) {
  61. return imagePath; // 返回图片的原始路径,未做任何处理
  62. }
  63. }

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