• 富文本生成word并在线预览(附源码)


    记录富文本内容生成word并在线预览碰到的问题,以及最终的解决方案。

    一、需求

    当前项目需要将页面富文本中的内容,生成word并在线预览。

    二、解决方案1(未解决)

    1. openoffice word在线预览

    首先我先解决的是word的在线预览问题。这个用的是通用的方案,在电脑上安装openoffice插件,启动插件,然后是代码中调用暴露的API,然后实现word的在线预览。

    2. 将富文本的html内容生成word

    通过调用三方API,将富文本中的html内容生成word文件,然后再去预览。

    问题:在通过将html装成word文件之后,openoffice插件却无法正常预览。通过看了下生成的word文件和正常创建的word文件对比,发现html生成的world,只是将html包裹了一层,和正常生成的word不一样。由此推测可能是该问题导致无法预览。

    三、解决方案2(已解决)

    在遇到方案2的问题时,发现暂时没有办法解决,因此换了一种方式。

    1.将富文本的html内容生成word

    和之前一样,先通过富文本保存的html内容,生成word。

    2.将富文本的html内容生成PDF

    这个多加了一步,通过富文本宝成的html内容,生成对应的PDF。

    3.通过PDF进行预览。

    通过接口,将PDF进行对外在线预览,如有需要将word发送给别人。

    优点:不需要再安装openoffice插件,也不用启动openoffice。可直接进行预览。

    缺点:需要同时生成PDF,当word有变动时,需要重新生成PDF。

    四、源码

    1.maven 依赖

    1. <dependency>
    2. <groupId>org.docx4jgroupId>
    3. <artifactId>docx4j-export-foartifactId>
    4. <version>6.1.0version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.itextpdf.toolgroupId>
    8. <artifactId>xmlworkerartifactId>
    9. <version>5.5.8version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.itextpdfgroupId>
    13. <artifactId>itext-asianartifactId>
    14. <version>5.2.0version>
    15. dependency>

    2. 生成word、pdf

    1. import com.itextpdf.text.Document;
    2. import com.itextpdf.text.pdf.PdfWriter;
    3. import com.itextpdf.tool.xml.XMLWorkerHelper;
    4. import org.springframework.util.StringUtils;
    5. import java.io.*;
    6. import java.nio.charset.Charset;
    7. public class OfficeUtil {
    8. /**
    9. * 通过html生成PDF
    10. *
    11. * @param htmlContent html格式内容
    12. * @param file 输出文件file
    13. */
    14. public static void createdPdfByItextHtml(String htmlContent, File file) {
    15. InputStream inputStream = null;
    16. FileOutputStream outputStream = null;
    17. PdfWriter writer = null;
    18. try {
    19. // 1. 获取生成pdf的html内容
    20. inputStream = new ByteArrayInputStream(htmlContent.getBytes("utf-8"));
    21. outputStream = new FileOutputStream(file);
    22. Document document = new Document();
    23. writer = PdfWriter.getInstance(document, outputStream);
    24. document.open();
    25. // 2. 添加字体
    26. // XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
    27. // fontImp.register(getFontPath());
    28. // 3. 设置编码
    29. XMLWorkerHelper.getInstance().parseXHtml(writer, document, inputStream, Charset.forName("UTF-8"), new CustomXMLWorkerFontProvider());
    30. // 4. 关闭,(不关闭则会生成无效pdf)
    31. document.close();
    32. } catch (Exception ex) {
    33. ex.printStackTrace();
    34. } finally {
    35. try {
    36. if (writer != null) {
    37. writer.close();
    38. }
    39. if (outputStream != null) {
    40. outputStream.close();
    41. }
    42. if (inputStream != null) {
    43. inputStream.close();
    44. }
    45. } catch (IOException ex) {
    46. ex.printStackTrace();
    47. }
    48. }
    49. }
    50. /**
    51. * 通过HTML生成Word
    52. *
    53. * @param htmlbody
    54. * @param fileName
    55. * @return
    56. * @throws Exception
    57. */
    58. public static File createWordByHtml(String htmlbody, String fileName) throws Exception {
    59. File file = new File(fileName);
    60. OutputStream outputStream = new FileOutputStream(file);
    61. outputStream.write(htmlbody.getBytes());
    62. outputStream.flush();
    63. outputStream.close();
    64. return file;
    65. }
    66. public static void createDir(String dirPath) {
    67. File file = new File(dirPath);
    68. if (!file.exists()) {
    69. file.mkdirs();
    70. }
    71. }
    72. public static String generateHtmlBody(String detailContent) {
    73. detailContent = StringUtils.isEmpty(detailContent) ? "

      当前无展示内容

      "
      : detailContent;
    74. String html = "\n" +
    75. "\n" +
    76. "\n" +
    77. "\t\n" +
    78. "\n" +
    79. "\n" +
    80. detailContent +
    81. "\n" +
    82. "";
    83. return html;
    84. }
    85. }
    1. import com.itextpdf.text.BaseColor;
    2. import com.itextpdf.text.Font;
    3. import com.itextpdf.text.pdf.BaseFont;
    4. import com.itextpdf.tool.xml.XMLWorkerFontProvider;
    5. /**
    6. * 解决XMLWorkerHelper中文不显示。
    7. *

      使用iTextAsian.jar中自带的中文字体

    8. */
    9. public class CustomXMLWorkerFontProvider extends XMLWorkerFontProvider {
    10. @Override
    11. public Font getFont(final String fontName, final String encoding, final boolean embedded, final float size, final int style,
    12. final BaseColor color) {
    13. BaseFont bf = null;
    14. try {
    15. bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
    16. Font font = new Font(bf, size, style, color);
    17. font.setColor(color);
    18. // log.info("PDF文档字体初始化完成!");
    19. return font;
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. }
    23. return null;
    24. }
    25. }

    3.预览

    1. public void preview(HttpServletResponse response) {
    2. byte[] data = null;
    3. FileInputStream input = new FileInputStream(new File("文件路径"));
    4. data = new byte[input.available()];
    5. input.read(data);
    6. response.getOutputStream().write(data);
    7. input.close();
    8. } catch (Exception e) {
    9. e.printStackTrace();
    10. }
    11. }

     

  • 相关阅读:
    c++操作mysql(详解)
    【数据结构】排序:经典排序算法原理解析与优劣对比
    RFID在钢筋仓库管理中的应用
    【Azure 环境】【Azure Developer】使用Python代码获取Azure 中的资源的Metrics定义及数据
    Java代码规范
    SpringBoot中的application.properties等一系列的配置文件
    uniapp 开发微信小程序 出现启用组件按需注入问题如何解决
    屡获大奖的界面控件开发包DevExpress v22.1官宣发布
    PMP考试难度大吗?
    若依集成easyexcel实现excel表格增强
  • 原文地址:https://blog.csdn.net/Mr_Zahi/article/details/126358486