http://blog.csdn.net/qq_28533563/article/details/72676425

这位博主提供2种思路,

主要实现方式就是 (openoffice+swftools+flexpaper)和(aspose+pdfjs预览)。

第一种就是上一篇文章的实现,第二种便是这位博主的主要实现

备份原文:

Java实现在线预览附件 office转换PDF

因为项目是做OA这一块,有很多附件需要实现在线预览附件,在网上也看了很多相关的资料。主要实现方式就是 (openoffice+swftools+flexpaper)和(aspose+pdfjs预览)。

主要步骤:
1.需要先将文档转换为PDF文件。
2.用pdfjs预览PDF文件

转换步骤:
* 使用OpenOffice/Aspose 将ppt、word、excel、txt类型的文件转换为pdf

预览步骤:
* 高版本浏览器上,使用pdf.js直接预览PDF文件
* 低版本浏览器上,使用swftools将PDF文件转换为swf文件,再使用flexpaper预览swf(没有做这个步骤)

组件安装:
Aspose
由于OpenOffice的转换效果并不太佳,这里选择了Aspose
在Aspose官网下载Aspose的Java版本,主要选择
* Aspose.words
* Aspose.cells(Excel)
* Aspose.slides(PPT)
* Aspose.pdf
下载完成后,在工程中引用jar包即可。

功能实现:
这里采用的所有组件版本为:
名称 版本
Aspose.words 16.8.0
Aspose.cells 9.0.0
Aspose.slides 116.7.0
Aspose.pdf 11.8.0
文档转换为PDF

使用Aspose进行文档转换很简单,直接引入相应的jar包,调用save方法,转换为PDF即可。

注意:
1. 使用Aspose时,每一个模块(words,cells)都可能有相同的类,如License类,SaveOptions类,SaveFormat类。而在各自模块使用时,一定要用对应模块的类,这个坑我已爬过。
使用Aspose时,需要每次进行转换操作前调用设置License方法。

package com.ybg.pf.oamodule.work.module.convert.util;import org.apache.log4j.Logger;import java.io.FileInputStream;
import java.io.InputStream;/*** Aspose注册工具** @author zhumin* @version 1.0.0*          2017年05月16日 15:58* @since Jdk1.7*/
public class AsposeLicenseUtil {private static InputStream inputStream = null;private static Logger logger = Logger.getLogger(AsposeLicenseUtil.class);/*** 获取License的输入流** @return*/private static InputStream getLicenseInput() {ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();try {String path = contextClassLoader.getResource("license.xml").toURI().getPath();inputStream = new FileInputStream(path);} catch (Exception e) {logger.error("license not found!", e);}return inputStream;}/*** 设置License** @return true表示已成功设置License, false表示失败*/public static boolean setWordsLicense() {InputStream licenseInput = getLicenseInput();if (licenseInput != null) {try {com.aspose.words.License aposeLic = new com.aspose.words.License();aposeLic.setLicense(licenseInput);return aposeLic.getIsLicensed();} catch (Exception e) {logger.error("set words license error!", e);}}return false;}/*** 设置License** @return true表示已成功设置License, false表示失败*/public static boolean setCellsLicense() {InputStream licenseInput = getLicenseInput();if (licenseInput != null) {try {com.aspose.cells.License aposeLic = new com.aspose.cells.License();aposeLic.setLicense(licenseInput);return true;} catch (Exception e) {logger.error("set cells license error!", e);}}return false;}/*** 设置License** @return true表示已成功设置License, false表示失败*/public static boolean setSlidesLicense() {InputStream licenseInput = getLicenseInput();if (licenseInput != null) {try {com.aspose.slides.License aposeLic = new com.aspose.slides.License();aposeLic.setLicense(licenseInput);return aposeLic.isLicensed();} catch (Exception e) {logger.error("set ppt license error!", e);}}return false;}/*** 设置Aspose PDF的license* @return true表示设置成功,false表示设置失败*/public static boolean setPdfLicense() {InputStream licenseInput = getLicenseInput();if (licenseInput != null) {try {com.aspose.pdf.License aposeLic = new com.aspose.pdf.License();aposeLic.setLicense(licenseInput);return true;} catch (Exception e) {logger.error("set pdf license error!", e);}}return false;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115

word文档转换代码实例:

package com.ybg.pf.oamodule.work.module.convert.service.impl;import com.aspose.words.Document;
import com.aspose.words.PdfSaveOptions;
import com.aspose.words.SaveFormat;
import com.ybg.pf.oamodule.work.module.convert.domain.ConvertStatus;
import com.ybg.pf.oamodule.work.module.convert.service.File2PdfService;
import com.ybg.pf.oamodule.work.module.convert.util.AsposeLicenseUtil;
import org.apache.log4j.Logger;import java.io.InputStream;
import java.io.OutputStream;/*** 将doc文档转换为pdf文件** @author zhumin* @version 1.0.0*          2017年05月16日 15:58* @since Jdk1.7*/
public class Doc2PdfServiceImpl implements File2PdfService {private Logger logger = Logger.getLogger(getClass());@Overridepublic ConvertStatus convert2Pdf(InputStream inputStream, OutputStream outputStream) {try {if (AsposeLicenseUtil.setWordsLicense()) {Document doc = new Document(inputStream);//                insertWatermarkText(doc, "水印水印"); // 添加水印PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();pdfSaveOptions.setSaveFormat(SaveFormat.PDF);pdfSaveOptions.getOutlineOptions().setHeadingsOutlineLevels(3); // 设置3级doc书签需要保存到pdf的heading中pdfSaveOptions.getOutlineOptions().setExpandedOutlineLevels(1); // 设置pdf中默认展开1级doc.save(outputStream, pdfSaveOptions);inputStream.close();outputStream.flush();outputStream.close();return ConvertStatus.SUCCESS;} else {return ConvertStatus.LICENSE_ERROR;}} catch (Exception e) {return ConvertStatus.CONVERT_DOC2PDF_ERROR;}}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

其他格式就不附下面会提供代码下载。

预览流程:先在后台下载附件到项目指定临时目录,在读取下载文件转换为PDF存储到临时目录


这是目录结构:convertFile附件下载存放目录 outputFilePDF存储目录

package com.ybg.pf.oamodule.common.util;import com.ybg.pf.framework.library.util.FileRWUtils;
import com.ybg.pf.framework.library.util.LogUtil;
import com.ybg.pf.oamodule.work.module.convert.domain.ConvertStatus;
import com.ybg.pf.oamodule.work.module.convert.service.File2PdfService;
import com.ybg.pf.oamodule.work.module.convert.service.impl.Doc2PdfServiceImpl;
import com.ybg.pf.oamodule.work.module.convert.service.impl.Excel2PdfServiceImpl;
import com.ybg.pf.oamodule.work.module.convert.service.impl.PPT2PdfServiceImpl;
import org.apache.commons.lang.StringUtils;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;/*** Created by Administrator on 2017/5/11.* 在线预览工具类* 文件下载工具*/
public class PreviewUtils {//转换服务private static File2PdfService fileConvertService;/*** office转换PDF* @param fileName 需要转换的文件名* @return* @throws Exception*/public static ConvertStatus officeConversionPDF(String fileName) throws Exception{//获取文件后缀String suffix = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());String fileNames = fileName.substring(0,fileName.lastIndexOf("."));//根据后缀判断文件类型实例化对应服务层if (StringUtils.equalsIgnoreCase(suffix,"docx") || StringUtils.equalsIgnoreCase(suffix,"doc")){fileConvertService = new Doc2PdfServiceImpl();}else if (StringUtils.equalsIgnoreCase(suffix,"pptx") || StringUtils.equalsIgnoreCase(suffix,"ppt")){fileConvertService = new PPT2PdfServiceImpl();}else if (StringUtils.equalsIgnoreCase(suffix,"xlsx") || StringUtils.equalsIgnoreCase(suffix,"xls")){fileConvertService = new Excel2PdfServiceImpl();}ConvertStatus convertStatus = null;//获取需要转换文档的所在路径File officeFile = new File(savePath()+File.separator+fileName);File outputFile = new File(outPDFPath(fileNames) +File.separator+ fileNames+".pdf");//PDF保存文件路径//如果文件是 PDF 不用转换直接复制到指定目录if (StringUtils.equalsIgnoreCase(suffix,"pdf")){FileRWUtils.copyFile(officeFile.getPath(),outPDFPath(fileNames));return convertStatus;}if (!outputFile.exists()){InputStream inputStream = new FileInputStream(officeFile);OutputStream outputStream = new FileOutputStream(outputFile);//开始转换convertStatus = fileConvertService.convert2Pdf(inputStream, outputStream);}return convertStatus;}/*** 根据PDF文件名获取PDF存储地址* @param fileName PDF文件名* @return*  没有加.toURI() 有可能中文路径会乱码 加上获取会出错*/public static String outPDFPath(String fileName) throws Exception{String pathName = PreviewUtils.class.getClassLoader().getResource("").getPath();//文件保存位置 如果文件夹不存在创建文件夹File saveDir = new File(pathName+File.separator+"outputFile");if(!saveDir.exists()){saveDir.mkdir();}return saveDir.getPath();}/*** 获取文件保存路径* @return*/public static String savePath(){String pathName = PreviewUtils.class.getClassLoader().getResource("").getPath();//文件保存位置 如果文件夹不存在创建文件夹File saveDir = new File(pathName+File.separator+"convertFile");if(!saveDir.exists()){saveDir.mkdir();}return saveDir.getPath();}/*** 从网络Url中下载文件* @param urlStr 下载地址* @param fileName 文件名* @param savePath  保存地址* @throws IOException*/public static boolean  downLoadFromUrl(String urlStr,String fileName,String savePath){File file = new File(savePath+File.separator+fileName);//文件是否已存在if(file.exists()){return true;}try {URL url = new URL(urlStr);HttpURLConnection conn = (HttpURLConnection)url.openConnection();//设置超时间为30秒conn.setConnectTimeout(30*1000);//防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//得到输入流InputStream inputStream = conn.getInputStream();//获取自己数组byte[] getData = readInputStream(inputStream);FileOutputStream fos = new FileOutputStream(file);if (getData == null){return false;}fos.write(getData);if(fos!=null){fos.close();}if(inputStream!=null){inputStream.close();}if (conn.getResponseCode() == HttpURLConnection.HTTP_OK){return true;}} catch (IOException e) {LogUtil.error("附件下载转换PDF出错!",e);}return false;}/*** 从输入流中获取字节数组* @param inputStream* @return* @throws IOException*/public static  byte[] readInputStream(InputStream inputStream) throws IOException {byte[] buffer = new byte[1024];int len = 0;ByteArrayOutputStream bos = new ByteArrayOutputStream();while((len = inputStream.read(buffer)) != -1) {bos.write(buffer, 0, len);}bos.close();return bos.toByteArray();}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155

由于我们要集成到自己的工程中来,所以此处直接copy了viewer.html页面,修改为了我们工程需要的view_pdfjs.jsp ,其中做了一些修改删除了部分不需要的功能
下面是我修改过后的预览页面 效果图:

<%@ page import="com.ybg.pf.oamodule.common.constant.JspCommonConstant" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String qiyehaoProjectpath = JspCommonConstant.getProjectBasePath();
%>
<!DOCTYPE html>
<!--
Copyright 2012 Mozilla FoundationLicensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.Adobe CMap resources are covered by their own copyright but the same license:Copyright 1990-2015 Adobe Systems Incorporated.See https://github.com/adobe-type-tools/cmap-resources
-->
<html dir="ltr" mozdisallowselectionprint moznomarginboxes>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta name="google" content="notranslate"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>PDF.js viewer</title><link rel="stylesheet" href="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/web/viewer.css"><script src="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/web/compatibility.js"></script><!-- This snippet is used in production (included from viewer.html) --><link rel="resource" type="application/l10n" href="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/web/locale/locale.properties"><script src="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/web/l10n.js"></script><script src="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/build/pdf.js"></script><script src="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/web/debugger.js"></script><script src="<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/web/viewer.js"></script><script type="application/javascript">PDFJS.workerSrc = "<%=qiyehaoProjectpath%>/static/js/pdfjs-dist/build/pdf.worker.js";/*PDFJS.onerror = function(message, moreInfo){var queryString = document.location.search.substring(1);var params = parseQueryStringRegexImpl(queryString);var file = 'file' in params ? params.file : null;// redirect to fileif(file){location.href = file;}}function parseQueryStringRegexImpl(query){var reg = /([^\?\=\&]+)\=([^\&]*)/g;var obj = {};while (reg.exec (query)) {obj[RegExp.$1] = RegExp.$2;}return obj;}*/</script>
</head><body tabindex="1" class="loadingInProgress">
<div id="outerContainer"><div id="sidebarContainer"><div id="toolbarSidebar"><div class="splitToolbarButton toggled"><button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs"><span data-l10n-id="thumbs_label">Thumbnails</span></button><button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="3" data-l10n-id="outline"><span data-l10n-id="outline_label">Document Outline</span></button><button id="viewAttachments" class="toolbarButton group" title="Show Attachments" tabindex="4" data-l10n-id="attachments"><span data-l10n-id="attachments_label">Attachments</span></button></div></div><div id="sidebarContent"><div id="thumbnailView"></div><div id="outlineView" class="hidden"></div><div id="attachmentsView" class="hidden"></div></div></div>  <!-- sidebarContainer --><div id="mainContainer"><div class="findbar hidden doorHanger hiddenSmallView" id="findbar"><label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label><input id="findInput" class="toolbarField" tabindex="91"><div class="splitToolbarButton"><button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="92" data-l10n-id="find_previous"><span data-l10n-id="find_previous_label">Previous</span></button><div class="splitToolbarButtonSeparator"></div><button class="toolbarButton findNext" title="" id="findNext" tabindex="93" data-l10n-id="find_next"><span data-l10n-id="find_next_label">Next</span></button></div><input type="checkbox" id="findHighlightAll" class="toolbarField" tabindex="94"><label for="findHighlightAll" class="toolbarLabel" data-l10n-id="find_highlight">Highlight all</label><input type="checkbox" id="findMatchCase" class="toolbarField" tabindex="95"><label for="findMatchCase" class="toolbarLabel" data-l10n-id="find_match_case_label">Match case</label><span id="findResultsCount" class="toolbarLabel hidden"></span><span id="findMsg" class="toolbarLabel"></span></div>  <!-- findbar --><div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight"><div id="secondaryToolbarButtonContainer"><button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode"><span data-l10n-id="presentation_mode_label">Presentation Mode</span></button><button style="display: none;" id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="52" data-l10n-id="open_file"><span data-l10n-id="open_file_label">Open</span></button><button style="display: none;" id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print"><span data-l10n-id="print_label">Print</span></button><button style="display: none;" id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="54" data-l10n-id="download"><span data-l10n-id="download_label">Download</span></button><a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark"><span data-l10n-id="bookmark_label">Current View</span></a><div class="horizontalToolbarSeparator visibleLargeView"></div><button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page"><span data-l10n-id="first_page_label">Go to First Page</span></button><button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page"><span data-l10n-id="last_page_label">Go to Last Page</span></button><div class="horizontalToolbarSeparator"></div><button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="58" data-l10n-id="page_rotate_cw"><span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span></button><button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="59" data-l10n-id="page_rotate_ccw"><span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span></button><div class="horizontalToolbarSeparator"></div><button id="toggleHandTool" class="secondaryToolbarButton handTool" title="Enable hand tool" tabindex="60" data-l10n-id="hand_tool_enable"><span data-l10n-id="hand_tool_enable_label">Enable hand tool</span></button><div class="horizontalToolbarSeparator"></div><button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties…" tabindex="61" data-l10n-id="document_properties"><span data-l10n-id="document_properties_label">Document Properties…</span></button></div></div>  <!-- secondaryToolbar --><div class="toolbar"><div id="toolbarContainer"><div id="toolbarViewer"><div id="toolbarViewerLeft"><button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar"><span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span></button><div class="toolbarButtonSpacer"></div><button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="12" data-l10n-id="findbar"><span data-l10n-id="findbar_label">Find</span></button><div class="splitToolbarButton"><button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous"><span data-l10n-id="previous_label">Previous</span></button><div class="splitToolbarButtonSeparator"></div><button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next"><span data-l10n-id="next_label">Next</span></button></div><label id="pageNumberLabel" class="toolbarLabel" for="pageNumber" data-l10n-id="page_label">Page: </label><input type="number" id="pageNumber" class="toolbarField pageNumber" value="1" size="4" min="1" tabindex="15"><span id="numPages" class="toolbarLabel"></span></div><div id="toolbarViewerRight"><button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode"><span data-l10n-id="presentation_mode_label">Presentation Mode</span></button><button id="openFile" style="visibility:hidden" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="32" data-l10n-id="open_file"><span data-l10n-id="open_file_label">Open</span></button><button id="print" style="visibility:hidden" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print"><span data-l10n-id="print_label">Print</span></button><button id="download" style="visibility:hidden" class="toolbarButton download hiddenMediumView" title="Download" tabindex="34" data-l10n-id="download"><span data-l10n-id="download_label">Download</span></button><a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark"><span data-l10n-id="bookmark_label">Current View</span></a><div class="verticalToolbarSeparator hiddenSmallView"></div><button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools"><span data-l10n-id="tools_label">Tools</span></button></div><div class="outerCenter"><div class="innerCenter" id="toolbarViewerMiddle"><div class="splitToolbarButton"><button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out"><span data-l10n-id="zoom_out_label">Zoom Out</span></button><div class="splitToolbarButtonSeparator"></div><button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in"><span data-l10n-id="zoom_in_label">Zoom In</span></button></div><span id="scaleSelectContainer" class="dropdownToolbarButton"><select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom"><option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option><option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option><option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option><option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Full Width</option><option id="customScaleOption" title="" value="custom"></option><option title="" value="0.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 50 }'>50%</option><option title="" value="0.75" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 75 }'>75%</option><option title="" value="1" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 100 }'>100%</option><option title="" value="1.25" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 125 }'>125%</option><option title="" value="1.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 150 }'>150%</option><option title="" value="2" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 200 }'>200%</option><option title="" value="3" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 300 }'>300%</option><option title="" value="4" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 400 }'>400%</option></select></span></div></div></div><div id="loadingBar"><div class="progress"><div class="glimmer"></div></div></div></div></div><menu type="context" id="viewerContextMenu"><menuitem id="contextFirstPage" label="First Page"data-l10n-id="first_page"></menuitem><menuitem id="contextLastPage" label="Last Page"data-l10n-id="last_page"></menuitem><menuitem id="contextPageRotateCw" label="Rotate Clockwise"data-l10n-id="page_rotate_cw"></menuitem><menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise"data-l10n-id="page_rotate_ccw"></menuitem></menu><div id="viewerContainer" tabindex="0"><div id="viewer" class="pdfViewer"></div></div><div id="errorWrapper" hidden='true'><div id="errorMessageLeft"><span id="errorMessage"></span><button id="errorShowMore" data-l10n-id="error_more_info">More Information</button><button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>Less Information</button></div><div id="errorMessageRight"><button id="errorClose" data-l10n-id="error_close">Close</button></div><div class="clearBoth"></div><textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea></div></div> <!-- mainContainer --><div id="overlayContainer" class="hidden"><div id="passwordOverlay" class="container hidden"><div class="dialog"><div class="row"><p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p></div><div class="row"><!-- The type="password" attribute is set via script, to prevent warnings in Firefox for all http:// documents. --><input id="password" class="toolbarField"></div><div class="buttonRow"><button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button><button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button></div></div></div><div id="documentPropertiesOverlay" class="container hidden"><div class="dialog"><div class="row"><span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p></div><div class="row"><span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p></div><div class="separator"></div><div class="row"><span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p></div><div class="row"><span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p></div><div class="row"><span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p></div><div class="row"><span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p></div><div class="row"><span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p></div><div class="row"><span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p></div><div class="row"><span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p></div><div class="separator"></div><div class="row"><span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p></div><div class="row"><span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p></div><div class="row"><span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p></div><div class="buttonRow"><button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button></div></div></div></div>  <!-- overlayContainer --></div> <!-- outerContainer -->
<div id="printContainer"></div>
<div id="mozPrintCallback-shim" hidden><style>@media print {#printContainer div {page-break-after: always;page-break-inside: avoid;}}</style><style scoped>#mozPrintCallback-shim {position: fixed;top: 0;left: 0;height: 100%;width: 100%;z-index: 9999999;display: block;text-align: center;background-color: rgba(0, 0, 0, 0.5);}#mozPrintCallback-shim[hidden] {display: none;}@media print {#mozPrintCallback-shim {display: none;}}#mozPrintCallback-shim .mozPrintCallback-dialog-box {display: inline-block;margin: -50px auto 0;position: relative;top: 45%;left: 0;min-width: 220px;max-width: 400px;padding: 9px;border: 1px solid hsla(0, 0%, 0%, .5);border-radius: 2px;box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);background-color: #474747;color: hsl(0, 0%, 85%);font-size: 16px;line-height: 20px;}#mozPrintCallback-shim .progress-row {clear: both;padding: 1em 0;}#mozPrintCallback-shim progress {width: 100%;}#mozPrintCallback-shim .relative-progress {clear: both;float: right;}#mozPrintCallback-shim .progress-actions {clear: both;}</style><div class="mozPrintCallback-dialog-box"><!-- TODO: Localise the following strings -->Preparing document for printing...<div class="progress-row"><progress value="0" max="100"></progress><span class="relative-progress">0%</span></div><div class="progress-actions"><input type="button" value="Cancel" class="mozPrintCallback-cancel"></div></div>
</div></body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • 349
  • 350
  • 351
  • 352
  • 353
  • 354
  • 355
  • 356
  • 357
  • 358
  • 359
  • 360
  • 361
  • 362
  • 363
  • 364
  • 365
  • 366
  • 367
  • 368
  • 369
  • 370
  • 371
  • 372
  • 373
  • 374
  • 375
  • 376
  • 377
  • 378
  • 379
  • 380
  • 381
  • 382
  • 383
  • 384
  • 385
  • 386
  • 387
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • 399
  • 400
  • 401
  • 402
  • 403
  • 404
  • 405
  • 406
  • 407
  • 408
  • 409
  • 410
  • 411
  • 412
  • 413
  • 414
  • 415
  • 416
  • 417
  • 418
  • 419
  • 420
  • 421
  • 422
  • 423
  • 424
  • 425
  • 426
  • 427
  • 428
  • 429
  • 430
  • 431
  • 432
  • 433
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439
  • 440
  • 441
  • 442
  • 443
  • 444

预览
pdf.js使用参数file来指定需要预览的文件。例如我们的view_pdfjs.jsp对应的controller地址为:http://localhost:8080/pf_oamodule/openmodule/showPDF?file=test.pdf

跨域
如果pdf.js预览页面同pdf文件资源在同一个域下,此处可以忽略。

pdf.js使用的异步请求来请求的pdf文件资源,这也就意味着会存在跨域问题。pdf.js中主动检测了file参数对应的地址是否是同一个域中。

用 H5 iframe标签嵌套加载PDF页面

<%@ page import="com.ybg.pf.oamodule.common.constant.JspCommonConstant" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%String qiyehaoProjectpath = JspCommonConstant.getProjectBasePath();
%>
<html>
<head><title>${pdfName}</title><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><script type="text/javascript" src="<%=qiyehaoProjectpath%>/static/js/zepto.min.js"></script>
</head>
<style>*{margin:0;padding:0}
</style>
<body>
<iframe  src="<c:url value="/openmodule/showPDF" />?file=<%=qiyehaoProjectpath%>/openmodule/displayPDF?pdfName=${pdfName}"width="100%" height="100%"></iframe>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

我目前采用的方式是封装一个同域下的controller请求,该controller请求会拿到请求资源然后再回写。实现controller代码:

package com.ybg.pf.oamodule.work.module_open;import com.ybg.pf.framework.library.util.LogUtil;
import com.ybg.pf.oamodule.common.util.PreviewUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;/*** Created by Administrator on 2017/5/11.* 在线预览PDF*/
@Controller
@RequestMapping("/openmodule")
public class ShowPDFController {/*** 要在线预览PDF直接调用这个控制器会自己去加载页面* @param request* @param pdfName 必须传递参数PDF文件名* @return*/@RequestMapping(value = "/loadPDF" , method = RequestMethod.GET)public ModelAndView loadPDF(HttpServletRequest request,@RequestParam String pdfName){pdfName = pdfName.replaceAll("\\+","%2B");request.setAttribute("pdfName",pdfName);return new ModelAndView("pdf/show");}/*** 调用PDF显示页面* @return*/@RequestMapping(value = "/showPDF" , method = RequestMethod.GET)public ModelAndView showPDF(){return new ModelAndView("pdf/view_pdfjs");}/*** 返回一个PDF给页面加载* @param response* @param request* @param pdfName PDF文件名*/@RequestMapping(value = "/displayPDF" , method = RequestMethod.GET)public void displayPDF(HttpServletResponse response,HttpServletRequest request,@RequestParam String pdfName) {try {File file = new File(PreviewUtils.outPDFPath(pdfName) +File.separator+ pdfName+".pdf");//PDF保存文件路径FileInputStream fileInputStream = new FileInputStream(file);response.setHeader("Content-Disposition", "attachment;fileName="+pdfName+".pdf");response.setContentType("multipart/form-data");OutputStream outputStream = response.getOutputStream();IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);} catch(Exception e) {LogUtil.error("PDF读取出错!");}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

主要实现流程就是这些,做完发现在线预览也没有想像的那么难,最后附上核心代码可以下载参考!

Java在线预览核心代码下载
aspose-slides-16.7.0 - aspose-words-16.8.0 包
aspose-cells-9.0.0 - aspose-pdf-11.8.0 包

Java web 在线预览--参考二相关推荐

  1. java web在线预览pdf_JAVAWEB实现在线预览PDF

    一.场景再现 由于项目上传pdf文件后要实现在线预览(点击PDF) 二.实现方法 HTML:(传文件路径) JS: function openFile(filePath,wdbh,obj){ var ...

  2. 使用kkfileview实现web在线预览

    使用kkfileview实现web在线预览文件 场景:一个业务场景是,针对单据上传附件(放到FTP),后续通过web实现对附件的在线预览打印 使用工具 :kkFileView 官网地址:https:/ ...

  3. Java实现在线预览功能

    java实现在线预览功能,需要用到  jacob.dll jacob.jar   预览pdf所需js  pdfobject.min.js 将上传文件转为pdf保存. <divclass=&quo ...

  4. java实现在线预览txt转pdf

    java实现在线预览txt转pdf 首先引入itext的jar包 <dependency><groupId>com.itextpdf</groupId><ar ...

  5. 二维三维图纸web在线预览

    前言:因公司业务需求,需要实现dwg.dwf.stl.stp.x_t等二三维图纸在web端在线预览的功能.图纸兼容与浏览器兼容都很重要,经过这段时间的技术调研,基本确认了几种实现方案,选择(自主开发难 ...

  6. WEB在线预览PDF,WORD方案总结

    好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受. 目录 一.PDF的预览方式 1.PDFObject 2.PDF.JS 3.jsPDF 4.jQuery Media ...

  7. java word在线预览_java实现word转pdf在线预览(前端使用PDF.js;后端使用openoffice、aspose)...

    背景 之前一直是用户点击下载word文件到本地,然后使用office或者wps打开.需求优化,要实现可以直接在线预览,无需下载到本地然后再打开. 随后开始上网找资料,网上资料一大堆,方案也各有不同,大 ...

  8. WEB在线预览PDF

    这是我在博客园发表的第一篇文章.以后会陆续把在线预览其他格式文档的解决方案发表出来. 解决思路:把pdf转换成html显示. 在线预览pdf我暂时了解3种解决方案,欢迎大家补充. 方案一: 利用pdf ...

  9. java实现在线预览word,excel,ppt文档

    项目中遇到的word文档在线预览需求,查阅很多资料决定利用openoffice转换word文档为pdf进行预览实现. 1.下载openoffice4安装 www.openoffice.org: 2.导 ...

  10. 文档在线预览(二)word、pdf、excel文件转html以实现文档在线预览

    文章目录 一.前言 1.aspose 2 .poi + pdfbox 3 spire 二.将文件转换成html字符串 1.将word文件转成html字符串 1.1 使用aspose 1.2 使用poi ...

最新文章

  1. 聊聊数据库中的那些锁
  2. 多线程技术(四)线程的优先级
  3. VM虚拟机桥接模式无法联网解决办法
  4. LeetCode171——Excel Sheet Column Number
  5. ubuntu dpkg initramfs-tools错误的解决方法
  6. 员工转正申请书_员工有了归属感 企业实现大发展!通机股份在党工共建中摸索经验...
  7. Codeforces Round #453 (Div. 1) D. Weighting a Tree 构造 + dfs树
  8. ffmpeg 静态库使用,undefined reference错误
  9. ubuntu 19.04 + lenovo-xiaoxin-I2000 触摸板右键单击无法使用
  10. 泰坦尼克号数据下载链接
  11. maiark京东短信登录
  12. python期货程序化交易高手心得_10分钟打造WonderTrader上的期货日内交易策略
  13. Steam一直显示断开服务器,为什么吃鸡老于steam服务器断开连接 | 手游网游页游攻略大全...
  14. 自定义计时器_笑死我了_哈哈哈哈哈嗝儿
  15. ubuntu 14.04 opera浏览器flash插件安装
  16. 百度地图和51地图API应用开发
  17. 联想台式计算机设置u盘启动不了,联想台式电脑设置bios时U盘、光盘都启动不了是怎么回事?...
  18. CF专题(长安大学)
  19. 分布式系统论文精读3:容错虚拟机
  20. ESP32 E (10309) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdo

热门文章

  1. 中国互联网发展状况报告:境内约 2.6 万网站被植入后门
  2. CodeSmith 介绍
  3. Oracle-Oracle数据库备份与恢复
  4. SQLServer安装Northwind数据库
  5. [创业]赢在中国,马云点评创业,经典
  6. fc安卓模拟器_MAME街机模拟器0.224经典游戏全收藏
  7. 周育如的音标口诀大全_一年级汉语音标口诀记忆方法
  8. Word中英语音标出现乱码情况,解决办法
  9. 世界上再也找不到第二位程序员大叔能写出这样纯美的数学小说了
  10. java 命令行工具_分享java自带命令行工具jmap、jhat与jinfo的方法详解