Java实现PDF在线预览
前言:之前一直PDF一直是下载后再查看,一直在想如何如何在线预览,现已找到方法,作此笔记,也希望都对其他人有所帮助
代码实现
@Slf4j
@Controller
@RequestMapping("/file/view")
public class FileViewController {
/**
* 预览pdf
* @param request
* @param response
*/
@GetMapping("/pdf")
public void preViewPDF(HttpServletRequest request, HttpServletResponse response) {
String pdfFilePath = request.getParameter("fileName");
String replace = pdfFilePath.replace('_', File.separatorChar);
try (
FileInputStream inputStream = new FileInputStream(replace);
OutputStream outputStream = response.getOutputStream()
) {
File pdfFile = new File(pdfFilePath);
String suffix = FileUtil.getSuffix(pdfFile); // 获取文件后缀
MimeTypeEnum mimeTypeEnum = MimeTypeEnum.findByExtension(suffix);
if (mimeTypeEnum == null) {
throw new FileException(101, "该文件类型不支持预览");
}
response.setContentType(mimeTypeEnum.getMimeType());
IOUtils.write(IOUtils.toByteArray(inputStream), outputStream);
} catch (FileNotFoundException e) {
log.error("pdf路径不存在", e);
} catch (IOException e) {
log.error("写入出现IO异常", e);
}
}
@GetMapping("/pdf_base64")
@ResponseBody
public String htmlViewPDF(String pdfFilePath){
String base64 = "";
String replace = pdfFilePath.replace('_', File.separatorChar);
try (FileInputStream inputStream = new FileInputStream(replace)){
byte[] data = IOUtils.toByteArray(inputStream);
base64 = Base64Utils.encodeToString(data);
base64 = base64.replaceAll("\r\n",""); // 去除空格和换行替换
base64 = base64.replaceAll("\\+","%2B"); // 对base64中的”+“进行转义
base64 = "data:application/pdf;base64," + base64;
} catch (FileNotFoundException e) {
log.error("pdf路径不存在", e);
} catch (IOException e) {
log.error("写入出现IO异常", e);
}
return base64;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum MimeTypeEnum {
AAC("acc","AAC音频","audio/aac"),
ABW("abw","AbiWord文件","application/x-abiword"),
ARC("arc","存档文件","application/x-freearc"),
AVI("avi","音频视频交错格式","video/x-msvideo"),
AZW("azw","亚马逊Kindle电子书格式","application/vnd.amazon.ebook"),
BIN("bin","任何类型的二进制数据","application/octet-stream"),
BMP("bmp","Windows OS / 2位图图形","image/bmp"),
BZ("bz","BZip存档","application/x-bzip"),
BZ2("bz2","BZip2存档","application/x-bzip2"),
CSH("csh","C-Shell脚本","application/x-csh"),
CSS("css","级联样式表(CSS)","text/css"),
CSV("csv","逗号分隔值(CSV)","text/csv"),
DOC("doc","微软Word文件","application/msword"),
DOCX("docx","Microsoft Word(OpenXML)","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),
EOT("eot","MS Embedded OpenType字体","application/vnd.ms-fontobject"),
EPUB("epub","电子出版物(EPUB)","application/epub+zip"),
GZ("gz","GZip压缩档案","application/gzip"),
GIF("gif","图形交换格式(GIF)","image/gif"),
HTM("htm","超文本标记语言(HTML)","text/html"),
HTML("html","超文本标记语言(HTML)","text/html"),
ICO("ico","图标格式","image/vnd.microsoft.icon"),
ICS("ics","iCalendar格式","text/calendar"),
JAR("jar","Java存档","application/java-archive"),
JPEG("jpeg","JPEG图像","image/jpeg"),
JPG("jpg","JPEG图像","image/jpeg"),
JS("js","JavaScript","text/javascript"),
JSON("json","JSON格式","application/json"),
JSONLD("jsonld","JSON-LD格式","application/ld+json"),
MID("mid","乐器数字接口(MIDI)","audio/midi"),
MIDI("midi","乐器数字接口(MIDI)","audio/midi"),
MJS("mjs","JavaScript模块","text/javascript"),
MP3("mp3","MP3音频","audio/mpeg"),
MPEG("mpeg","MPEG视频","video/mpeg"),
MPKG("mpkg","苹果安装程序包","application/vnd.apple.installer+xml"),
ODP("odp","OpenDocument演示文稿文档","application/vnd.oasis.opendocument.presentation"),
ODS("ods","OpenDocument电子表格文档","application/vnd.oasis.opendocument.spreadsheet"),
ODT("odt","OpenDocument文字文件","application/vnd.oasis.opendocument.text"),
OGA("oga","OGG音讯","audio/ogg"),
OGV("ogv","OGG视频","video/ogg"),
OGX("ogx","OGG","application/ogg"),
OPUS("opus","OPUS音频","audio/opus"),
OTF("otf","otf字体","font/otf"),
PNG("png","便携式网络图形","image/png"),
PDF("pdf","Adobe 可移植文档格式(PDF)","application/pdf"),
PHP("php","php","application/x-httpd-php"),
PPT("ppt","Microsoft PowerPoint","application/vnd.ms-powerpoint"),
PPTX("pptx","Microsoft PowerPoint(OpenXML)","application/vnd.openxmlformats-officedocument.presentationml.presentation"),
RAR("rar","RAR档案","application/vnd.rar"),
RTF("rtf","富文本格式","application/rtf"),
SH("sh","Bourne Shell脚本","application/x-sh"),
SVG("svg","可缩放矢量图形(SVG)","image/svg+xml"),
SWF("swf","小型Web格式(SWF)或Adobe Flash文档","application/x-shockwave-flash"),
TAR("tar","磁带存档(TAR)","application/x-tar"),
TIF("tif","标记图像文件格式(TIFF)","image/tiff"),
TIFF("tiff","标记图像文件格式(TIFF)","image/tiff"),
TS("ts","MPEG传输流","video/mp2t"),
TTF("ttf","ttf字体","font/ttf"),
TXT("txt","文本(通常为ASCII或ISO 8859- n","text/plain"),
VSD("vsd","微软Visio","application/vnd.visio"),
WAV("wav","波形音频格式","audio/wav"),
WEBA("weba","WEBM音频","audio/webm"),
WEBM("webm","WEBM视频","video/webm"),
WEBP("webp","WEBP图像","image/webp"),
WOFF("woff","Web开放字体格式(WOFF)","font/woff"),
WOFF2("woff2","Web开放字体格式(WOFF)","font/woff2"),
XHTML("xhtml","XHTML","application/xhtml+xml"),
XLS("xls","微软Excel","application/vnd.ms-excel"),
XLSX("xlsx","微软Excel(OpenXML)","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
XML("xml","XML","application/xml"),
XUL("xul","XUL","application/vnd.mozilla.xul+xml"),
ZIP("zip","ZIP","application/zip"),
MIME_3GP("3gp", "3GPP audio/video container", "video/3gpp"),
MIME_3GP_WITHOUT_VIDEO("3gp", "3GPP audio/video container doesn't contain video", "audio/3gpp2"),
MIME_3G2("3g2", "3GPP2 audio/video container", "video/3gpp2"),
MIME_3G2_WITHOUT_VIDEO("3g2", "3GPP2 audio/video container doesn't contain video", "audio/3gpp2"),
MIME_7Z("7z","7-zip存档","application/x-7z-compressed")
;
private String extension;
private String explain;
private String mimeType;
public static MimeTypeEnum findByExtension(String extension) {
if(StringUtils.isBlank(extension)){
return null;
}
for (MimeTypeEnum typesEnum : MimeTypeEnum.values()) {
if (extension.equals(typesEnum.getExtension())) {
return typesEnum;
}
}
return null;
}
public static String getContentType(String fileType) {
MimeTypeEnum mimeTypeEnum = MimeTypeEnum.findByExtension(fileType);
if(mimeTypeEnum != null){
return mimeTypeEnum.getMimeType();
}
return "application/octet-stream";
}
}
同理,图片也可以使用这种方法进行实现
提示:fileName这个参数是你服务器上存储PDF的文件地址
修改:之前的代码流没有关掉,现在修改了,然后如果你的pdf文件如果是保存在服务器上,这个fileName这个字段就是你服务器上存储PDF的文件地址,当然也可以做些处理,比如加密啥的,只要能保证解析到这个pdf文件就行,最后这个是预览pdf的地址,如果有需求要预览连接的,就自己在写业务需求的时候把这个连接拼接一下就行了,然后返回给前端
因为有时候需要pdf在页面嵌入展示,因此这边增加了一个可以在页面嵌入展示的方法,原理就是将pdf转为base64的格式,方便页面展示
更多推荐
Java实现PDF在线预览
发布评论