java 在线阅读doc_java 在线预览doc,pdf

先说一说如何实现在线预览doc

网上查了很多资料,基本思路就是将 doc 转为 pdf,由于低版本浏览器不支持预览 pdf,所以基本是再将 pdf 转为 swf (使用FlexPaper + swftools)

本文使用 pdf.js + jodconverter + openOffice

Java 如何将doc 转为 pdf?

poi读取doc + itext生成pdf (实现最方便,效果最差,跨平台)

jodconverter + openOffice (一般格式实现效果还行,复杂格式容易有错位,跨平台)

jacob + msOfficeWord + SaveAsPDFandXPS (完美保持原doc格式,效率最慢,只能在windows环境下进行)

准备工作

(正式环境部署安装的是libreoffice,openopenOffice的衍生版,之前有些无法转换的doc文件,使用libreoffice后正常转换)

linux上环境所需要的字体包 和 libreoffice https://pan.baidu.com/s/1mjhpdna 密码: 82ca

安装后,使用以下命令可以启动openoffice

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

windows下查看是否启动

netstat -ano|findstr "8100"

b5db6d43f8d1?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Talk is cheap. Show me the code

jodconverter 所需 maven依赖

com.artofsolving

jodconverter

2.2.1

文件转换核心类

import java.io.BufferedInputStream;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import com.artofsolving.jodconverter.DocumentConverter;

import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;

import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;

import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

/**

* doc docx格式转换

*/

public class DocConverter {

private static final int environment = 1;// 环境 1:windows 2:linux

private String fileString;// (只涉及pdf2swf路径问题)

private String outputPath = "";// 输入路径 ,如果不设置就输出在默认的位置

private String fileName;

private File pdfFile;

private File swfFile;

private File docFile;

public DocConverter(String fileString) {

ini(fileString);

}

/**

* 重新设置file

*

* @param fileString

*/

public void setFile(String fileString) {

ini(fileString);

}

/**

* 初始化

*

* @param fileString

*/

private void ini(String fileString) {

this.fileString = fileString;

fileName = fileString.substring(0, fileString.lastIndexOf("."));

docFile = new File(fileString);

pdfFile = new File(fileName + ".pdf");

swfFile = new File(fileName + ".swf");

}

/**

* 转为PDF

*

* @param file

*/

private void doc2pdf() throws Exception {

if (docFile.exists()) {

if (!pdfFile.exists()) {

OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);

try {

connection.connect();

DocumentConverter converter = new OpenOfficeDocumentConverter(connection);

converter.convert(docFile, pdfFile);

// close the connection

connection.disconnect();

System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");

} catch (java.net.ConnectException e) {

e.printStackTrace();

System.out.println("****swf转换器异常,openoffice服务未启动!****");

throw e;

} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {

e.printStackTrace();

System.out.println("****swf转换器异常,读取转换文件失败****");

throw e;

} catch (Exception e) {

e.printStackTrace();

throw e;

}

} else {

System.out.println("****已经转换为pdf,不需要再进行转化****");

}

} else {

System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");

}

}

/**

* 转换成 swf

*/

@SuppressWarnings("unused")

private void pdf2swf() throws Exception {

Runtime r = Runtime.getRuntime();

if (!swfFile.exists()) {

if (pdfFile.exists()) {

if (environment == 1) {// windows环境处理

try {

Process p = r.exec("D:/Program Files/SWFTools/pdf2swf.exe "+ pdfFile.getPath() + " -o "+ swfFile.getPath() + " -T 9");

System.out.print(loadStream(p.getInputStream()));

System.err.print(loadStream(p.getErrorStream()));

System.out.print(loadStream(p.getInputStream()));

System.err.println("****swf转换成功,文件输出:"

+ swfFile.getPath() + "****");

if (pdfFile.exists()) {

pdfFile.delete();

}

} catch (IOException e) {

e.printStackTrace();

throw e;

}

} else if (environment == 2) {// linux环境处理

try {

Process p = r.exec("pdf2swf " + pdfFile.getPath()

+ " -o " + swfFile.getPath() + " -T 9");

System.out.print(loadStream(p.getInputStream()));

System.err.print(loadStream(p.getErrorStream()));

System.err.println("****swf转换成功,文件输出:"

+ swfFile.getPath() + "****");

if (pdfFile.exists()) {

pdfFile.delete();

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

}

} else {

System.out.println("****pdf不存在,无法转换****");

}

} else {

System.out.println("****swf已经存在不需要转换****");

}

}

static String loadStream(InputStream in) throws IOException {

int ptr = 0;

in = new BufferedInputStream(in);

StringBuffer buffer = new StringBuffer();

while ((ptr = in.read()) != -1) {

buffer.append((char) ptr);

}

return buffer.toString();

}

/**

* 转换主方法

*/

@SuppressWarnings("unused")

public boolean conver() {

if (swfFile.exists()) {

System.out.println("****swf转换器开始工作,该文件已经转换为swf****");

return true;

}

if (environment == 1) {

System.out.println("****swf转换器开始工作,当前设置运行环境windows****");

} else {

System.out.println("****swf转换器开始工作,当前设置运行环境linux****");

}

try {

doc2pdf();

pdf2swf();

} catch (Exception e) {

e.printStackTrace();

return false;

}

if (swfFile.exists()) {

return true;

} else {

return false;

}

}

/**

* 返回文件路径

*

* @param s

*/

public String getswfPath() {

if (swfFile.exists()) {

String tempString = swfFile.getPath();

tempString = tempString.replaceAll("\\\\", "/");

return tempString;

} else {

return "";

}

}

/**

* 设置输出路径

*/

public void setOutputPath(String outputPath) {

this.outputPath = outputPath;

if (!outputPath.equals("")) {

String realName = fileName.substring(fileName.lastIndexOf("/"),

fileName.lastIndexOf("."));

if (outputPath.charAt(outputPath.length()) == '/') {

swfFile = new File(outputPath + realName + ".swf");

} else {

swfFile = new File(outputPath + realName + ".swf");

}

}

}

}

使用PDF.js

将 generic 文件夹复制到项目中即可

我使用的是springboot工程,添加静态资源访问(generic 我重命名为 pdf)

@Configuration

@ComponentScan

public class TXAppConfigurer extends WebMvcConfigurerAdapter implements ApplicationContextAware {

private ApplicationContext applicationContext;

public TXAppConfigurer() {

super();

}

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/pdf/**")

.addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/pdf/");

super.addResourceHandlers(registry);

}

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

this.applicationContext = applicationContext;

}

}

import java.io.File;

import java.io.FileInputStream;

import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import com.txgl.util.DocConverter;

/**

* 文件预览

*

* @author @Taven

*

*/

@Controller

public class FilePreview {

@RequestMapping("/displayPDF/{id}")

public void displayPDF(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) {

//xxx 逻辑

// 调用转换类

DocConverter docConverter = new DocConverter("your filePath");

try {

docConverter.doc2pdf();

File pdf = docConverter.getPdf();

FileInputStream fileInputStream = new FileInputStream(pdf);

response.reset();

response.setHeader("Content-Disposition", "attachment;fileName=test.pdf");

response.setContentType("multipart/form-data");

OutputStream outputStream = response.getOutputStream();

IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);

} catch (Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Apache POI和Aspose.Words这两个Java库来实现在线预览Word文档的功能。 Apache POI是一个用于读取、创建和修改Microsoft Office格式文件(如Word、Excel和PowerPoint)的Java库。可以使用它来读取Word文档内容并将其转换为HTML格式,然后通过浏览器进行在线预览。 Aspose.Words是一个专门用于处理Word文档的Java库,它可以将Word文档转换为HTML格式或PDF格式,然后通过浏览器进行在线预览。 以下是使用Apache POI和Aspose.Words实现在线预览Word文档的示例代码: 1. 使用Apache POI将Word文档转换为HTML格式: ```java import java.io.*; import org.apache.poi.hwpf.*; import org.apache.poi.hwpf.extractor.*; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class WordToHtmlConverter { public static void main(String[] args) throws Exception { // 读取Word文档内容 FileInputStream fis = new FileInputStream(new File("test.doc")); HWPFDocument doc = new HWPFDocument(fis); WordExtractor extractor = new WordExtractor(doc); String content = extractor.getText(); // 将Word文档内容转换为HTML格式 Document html = Jsoup.parse(content); String htmlContent = html.html(); System.out.println(htmlContent); } } ``` 2. 使用Aspose.Words将Word文档转换为HTML格式: ```java import com.aspose.words.*; public class WordToHtmlConverter { public static void main(String[] args) throws Exception { // 加载Word文档 Document doc = new Document("test.doc"); // 将Word文档转换为HTML格式 HtmlSaveOptions options = new HtmlSaveOptions(); doc.save("test.html", options); // 读取HTML文件内容 FileInputStream fis = new FileInputStream(new File("test.html")); byte[] data = new byte[fis.available()]; fis.read(data); String htmlContent = new String(data); System.out.println(htmlContent); } } ``` 需要注意的是,以上示例代码仅供参考,实际使用时可能需要根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值