java文件预览_java 在线预览doc,pdf

先说一说如何实现在线预览doc网上查了很多资料,基本思路就是将doc 转为 pdf,由于低版本浏览器不支持预览pdf,所以基本是再将pdf 转为 swf。

由于我这次做的需求只需要兼容chrome即可,所以我选择直接使用pdf.js在线预览pdf,本文使用 pdf.js + jodconverter + openOffice

如何将doc 转为 pdf?java将doc文件转换为pdf文件的三种方法poi读取doc + itext生成pdf (实现最方便,效果最差,跨平台)

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

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

环境安装:

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

openOffice下载

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

安装后,使用以下命令可以启动openofficesoffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

windows下查看是否启动netstat -ano|findstr "8100"

AAffA0nNPuCLAAAAAElFTkSuQmCC

windows示例

jodconverter 所需 maven依赖

com.artofsolving

jodconverter

2.2.1

下面是在CSDN找的一段转换类的代码,我只用到了doc2pdf()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的使用

百度网盘: https://pan.baidu.com/s/1dHk0IQH 密码: n47x

下载后我们需要用到generic文件夹下的两个目录,新建pdf文件夹

AAffA0nNPuCLAAAAAElFTkSuQmCC

文件目录

我使用的是springboot工程,添加静态资源访问

@Configuration@ComponentScanpublic 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.entity.FaultFileEntity;import com.txgl.service.FaultService;import com.txgl.util.DocConverter;/**

* 文件预览

*

* @author @Taven

*

*/@Controllerpublic class FilePreview {

@Autowired

private FaultService faultService;

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

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

FaultFileEntity file = faultService.findFaultFile(id);        // 调用转换类

DocConverter docConverter = new DocConverter(file.getFilePath());        try {

docConverter.doc2pdf();

File pdf = docConverter.getPdf();

FileInputStream fileInputStream = new FileInputStream(pdf);

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();

}

}

}

作者:殷天文

链接:https://www.jianshu.com/p/b5db6d43f8d1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值