zoukankan      html  css  js  c++  java
  • 【转载】Java实现word转pdf

    最近遇到一个项目需要把word转成pdf,GOOGLE了一下网上的方案有很多,比如虚拟打印、给word装扩展插件等,这些方案都依赖于ms word程序,在java代码中也得使用诸如jacob或jcom这类Java COM Bridge,使得服务器受限于win平台,而且部署起来也很麻烦。后来在某外文论坛看到了一个openoffice+jodconverter的转换方案,可以用纯的java代码完成转换工作,服务器端需要安装openoffice,但是需求一步额外的操作--需要在服务器上的某个端口提供一个openoffice服务,这对部署起来显得麻烦了点。

    偶然机会发现了google code上有一个jodconverter 3,此版完全把2给重构了,它可以帮你创建oo服务监听在指定端口.

    以下为官网介绍:

    JODConverter automates conversions between office document formats using OpenOffice.org or LibreOffice. 

    Supported formats include OpenDocument, PDF, RTF, HTML, Word, Excel, PowerPoint, and Flash. 

    It can be used as a Java library, a command line tool, or a web application.

    JODConverter 3.0 requires:

    • Java 1.5 or later 
    • OpenOffice.org 3.0.0 or later
    package org.artofsolving.jodconverter.sample.web;
     
    import java.io.File;
    import java.util.logging.Logger;
     
    import javax.servlet.ServletContext;
     
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.artofsolving.jodconverter.OfficeDocumentConverter;
    import org.artofsolving.jodconverter.office.ManagedProcessOfficeManager;
    import org.artofsolving.jodconverter.office.ManagedProcessOfficeManagerConfiguration;
    import org.artofsolving.jodconverter.office.OfficeConnectionMode;
    import org.artofsolving.jodconverter.office.OfficeManager;
     
    public class WebappContext {
     
            public static final String PARAMETER_OFFICE_PORT = "office.port";
        public static final String PARAMETER_OFFICE_HOME = "office.home";
        public static final String PARAMETER_OFFICE_PROFILE = "office.profile";
        public static final String PARAMETER_FILEUPLOAD_FILE_SIZE_MAX = "fileupload.fileSizeMax";
     
        private final Logger logger = Logger.getLogger(getClass().getName());
     
        private static final String KEY = WebappContext.class.getName();
     
        private final ServletFileUpload fileUpload;
     
        private final OfficeManager officeManager;
        private final OfficeDocumentConverter documentConverter;
     
        public WebappContext(ServletContext servletContext) {
            DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
            String fileSizeMax = servletContext.getInitParameter(PARAMETER_FILEUPLOAD_FILE_SIZE_MAX);
            fileUpload = new ServletFileUpload(fileItemFactory);
            if (fileSizeMax != null) {
                fileUpload.setFileSizeMax(Integer.parseInt(fileSizeMax));
                logger.info("max file upload size set to " + fileSizeMax);
            } else {
                logger.warning("max file upload size not set");
            }
     
            int officePort = 8100;
            String officePortParam = servletContext.getInitParameter(PARAMETER_OFFICE_PORT);
            if (officePortParam != null) {
                officePort = Integer.parseInt(officePortParam);
            }
            OfficeConnectionMode connectionMode = OfficeConnectionMode.socket(officePort);
                    ManagedProcessOfficeManagerConfiguration configuration = new ManagedProcessOfficeManagerConfiguration(connectionMode);
            String officeHomeParam = servletContext.getInitParameter(PARAMETER_OFFICE_HOME);
            if (officeHomeParam != null) {
                configuration.setOfficeHome(new File(officeHomeParam));
            }
            String officeProfileParam = servletContext.getInitParameter(PARAMETER_OFFICE_PROFILE);
            if (officeProfileParam != null) {
                configuration.setTemplateProfileDir(new File(officeProfileParam));
            }
     
            officeManager = new ManagedProcessOfficeManager(configuration);
            documentConverter = new OfficeDocumentConverter(officeManager);
        }
     
        protected static void init(ServletContext servletContext) {
            WebappContext instance = new WebappContext(servletContext);
            servletContext.setAttribute(KEY, instance);
            instance.officeManager.start();
        }
     
        protected static void destroy(ServletContext servletContext) {
            WebappContext instance = get(servletContext);
            instance.officeManager.stop();
        }
     
        public static WebappContext get(ServletContext servletContext) {
            return (WebappContext) servletContext.getAttribute(KEY);
        }
     
        public ServletFileUpload getFileUpload() {
            return fileUpload;
        }
     
        public OfficeManager getOfficeManager() {
                    return officeManager;
            }
     
        public OfficeDocumentConverter getDocumentConverter() {
                    return documentConverter;
            }
     
    }

    在web应用启动时初始化:

    package org.artofsolving.jodconverter.sample.web;
     
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
     
    public class WebappContextListener implements ServletContextListener {
     
        public void contextInitialized(ServletContextEvent event) {
            WebappContext.init(event.getServletContext());
        }
     
        public void contextDestroyed(ServletContextEvent event) {
            WebappContext.destroy(event.getServletContext());
        }
     
    }

    转换servlet

    package org.artofsolving.jodconverter.sample.web;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    import java.util.logging.Logger;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.FilenameUtils;
    import org.apache.commons.io.IOUtils;
    import org.artofsolving.jodconverter.DocumentFormat;
    import org.artofsolving.jodconverter.OfficeDocumentConverter;
     
    public class ConverterServlet extends HttpServlet {
     
        private static final long serialVersionUID = -591469426224201748L;
     
        private final Logger logger = Logger.getLogger(getClass().getName());
     
        @Override
        protected void doPost(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {
            if (!ServletFileUpload.isMultipartContent(request)) {
                response.sendError(HttpServletResponse.SC_FORBIDDEN,
                        "only multipart requests are allowed");
                return;
            }
     
            WebappContext webappContext = WebappContext.get(getServletContext());
            ServletFileUpload fileUpload = webappContext.getFileUpload();
            OfficeDocumentConverter converter = webappContext
                    .getDocumentConverter();
     
            String outputExtension = FilenameUtils.getExtension(request
                    .getRequestURI());
     
            FileItem uploadedFile;
            try {
                uploadedFile = getUploadedFile(fileUpload, request);
            } catch (FileUploadException fileUploadException) {
                throw new ServletException(fileUploadException);
            }
            if (uploadedFile == null) {
                throw new NullPointerException("uploaded file is null");
            }
            String inputExtension = FilenameUtils.getExtension(uploadedFile
                    .getName());
     
            String baseName = FilenameUtils.getBaseName(uploadedFile.getName());
            File inputFile = File.createTempFile(baseName, "." + inputExtension);
            writeUploadedFile(uploadedFile, inputFile);
            File outputFile = File.createTempFile(baseName, "." + outputExtension);
            try {
                DocumentFormat outputFormat = converter.getFormatRegistry()
                        .getFormatByExtension(outputExtension);
                long startTime = System.currentTimeMillis();
                converter.convert(inputFile, outputFile);
                long conversionTime = System.currentTimeMillis() - startTime;
                logger.info(String.format(
                        "successful conversion: %s [%db] to %s in %dms",
                        inputExtension, inputFile.length(), outputExtension,
                        conversionTime));
                response.setContentType(outputFormat.getMediaType());
                response.setHeader("Content-Disposition", "attachment; filename="
                        + baseName + "." + outputExtension);
                sendFile(outputFile, response);
            } catch (Exception exception) {
                logger.severe(String.format(
                        "failed conversion: %s [%db] to %s; %s; input file: %s",
                        inputExtension, inputFile.length(), outputExtension,
                        exception, inputFile.getName()));
                throw new ServletException("conversion failed", exception);
            } finally {
                outputFile.delete();
                inputFile.delete();
            }
        }
     
        private void sendFile(File file, HttpServletResponse response)
                throws IOException {
            response.setContentLength((int) file.length());
            InputStream inputStream = null;
            try {
                inputStream = new FileInputStream(file);
                IOUtils.copy(inputStream, response.getOutputStream());
            } finally {
                IOUtils.closeQuietly(inputStream);
            }
        }
     
        private void writeUploadedFile(FileItem uploadedFile, File destinationFile)
                throws ServletException {
            try {
                uploadedFile.write(destinationFile);
            } catch (Exception exception) {
                throw new ServletException("error writing uploaded file", exception);
            }
            uploadedFile.delete();
        }
     
        private FileItem getUploadedFile(ServletFileUpload fileUpload,
                HttpServletRequest request) throws FileUploadException {
            @SuppressWarnings("unchecked")
            List<FileItem> fileItems = fileUpload.parseRequest(request);
            for (FileItem fileItem : fileItems) {
                if (!fileItem.isFormField()) {
                    return fileItem;
                }
            }
            return null;
        }
     
    }
  • 相关阅读:
    Java Object类及其常用方法
    Java 抽象类和抽象方法
    Java 多态
    Java 继承
    Java Scanner类
    正则表达_1
    「暑期集训day14」掠影
    「暑期集训day13」苦闷
    「暑期集训day12」苦楚
    「暑期集训day11」旧殤
  • 原文地址:https://www.cnblogs.com/zhangxsh/p/3636005.html
Copyright © 2011-2022 走看看