富文本生成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 依赖

        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-export-fo</artifactId>
            <version>6.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.8</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

2. 生成word、pdf

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import org.springframework.util.StringUtils;

import java.io.*;
import java.nio.charset.Charset;

public class OfficeUtil {

    /**
     * 通过html生成PDF
     *
     * @param htmlContent html格式内容
     * @param file        输出文件file
     */
    public static void createdPdfByItextHtml(String htmlContent, File file) {
        InputStream inputStream = null;
        FileOutputStream outputStream = null;
        PdfWriter writer = null;
        try {
            // 1. 获取生成pdf的html内容
            inputStream = new ByteArrayInputStream(htmlContent.getBytes("utf-8"));
            outputStream = new FileOutputStream(file);
            Document document = new Document();
            writer = PdfWriter.getInstance(document, outputStream);
            document.open();
            // 2. 添加字体
//            XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
//            fontImp.register(getFontPath());
            // 3. 设置编码
            XMLWorkerHelper.getInstance().parseXHtml(writer, document, inputStream, Charset.forName("UTF-8"), new CustomXMLWorkerFontProvider());
            // 4. 关闭,(不关闭则会生成无效pdf)
            document.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 通过HTML生成Word
     *
     * @param htmlbody
     * @param fileName
     * @return
     * @throws Exception
     */
    public static File createWordByHtml(String htmlbody, String fileName) throws Exception {
        File file = new File(fileName);
        OutputStream outputStream = new FileOutputStream(file);
        outputStream.write(htmlbody.getBytes());
        outputStream.flush();
        outputStream.close();
        return file;
    }

    public static void createDir(String dirPath) {
        File file = new File(dirPath);
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    public static String generateHtmlBody(String detailContent) {
        detailContent = StringUtils.isEmpty(detailContent) ? "<h1 style=\"margin-left:28px\"><strong><span style=\";font-family:宋体;font-size:29px\">当前无展示内容</span></strong></h1>" : detailContent;
        String html = "<!DOCTYPE html>\n" +
                "<html>\n" +
                "<head>\n" +
                "\t<title></title>\n" +
                "</head>\n" +
                "<body>\n" +
                detailContent +
                "</body>\n" +
                "</html>";
        return html;
    }
}
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

/**
 * 解决XMLWorkerHelper中文不显示。
 * <p>使用iTextAsian.jar中自带的中文字体
 */
public class CustomXMLWorkerFontProvider extends XMLWorkerFontProvider {

    @Override
    public Font getFont(final String fontName, final String encoding, final boolean embedded, final float size, final int style,
                        final BaseColor color) {
        BaseFont bf = null;
        try {
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            Font font = new Font(bf, size, style, color);
            font.setColor(color);
            // log.info("PDF文档字体初始化完成!");
            return font;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

3.预览

public void preview(HttpServletResponse response) {
       
            byte[] data = null;

            FileInputStream input = new FileInputStream(new File("文件路径"));
            data = new byte[input.available()];
            input.read(data);
            response.getOutputStream().write(data);
            input.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Word是一款流行的文字处理软件,由微软开发和发布。但是,Word的源代码并没有公开发布,所以目前没有官方的Word在线打开的源码Word源码是微软的商业机密,保持严格的保密措施。 然而,有些公司和个人开发了一些类似Word在线文字处理工具,并且提供了源码。这些源码通常是使用Web开发技术如HTML、CSS和JavaScript编写的。通过这些源码,开发者可以了解这些工具的基本原理和基础功能。 要实现Word在线打开功能,源码通常会包括以下几个重要组件: 1. 前端界面:使用HTML和CSS构建用户界面,包括菜单、工具栏、文本编辑区等。通过JavaScript实现用户与界面的交互和操作。 2. 后端服务:接收用户上传的Word文档,将其解析成可编辑的格式,并提供相关的API供前端调用。后端服务可能使用像Node.js这样的服务器端技术进行开发。 3. 文档解析和渲染:将Word文档换为可在Web上显示和编辑的格式。这可以使用开源的文档处理库,例如Apache POI或JavaScript库,如Docxtemplater和jsPDF来实现。 4. 云存储:为了让用户能够在任何地方访问和编辑他们的文档,可以使用云存储服务(如Google Drive、OneDrive等)来保存用户的文档。通过API和认证机制,将用户的文档与在线编辑器进行关联。 综上所述,虽然Word的官方源码不可获得,但是通过开发者的努力,类似的在线文字处理工具的源码是可以找到的。这些源码可以帮助开发者了解该类型软件的实现原理,从而开发出自己的在线文字处理工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值