adobe reader java_使用Adobe Reader控件结合Java实现PDF打印功能
1、在页面引入控件,控件依赖任何第三方js库:
classid="clsid:CA8A9780-280D-11CF-A24D-444553540000">
value="#webUrl("context")/file/download/mergePdf?method=inline&$!reportAttParam&_ws_sn=$math.random">
src="#webUrl("context")/file/download/mergePdf?method=inline&$!reportAttParam&_ws_sn=$math.random"
width="100%" height="100%"
href="http://www.adobe-reader-download.com/">
No adobe reader support.
代码说明:是IE下的控件引入方式,是为了支持非IE浏览器。
object中的及的src属性就是PDF的路径,这里可以是本地磁盘路劲也可以是远程PDF的下载路径,总之要能识别是PDF文件即可。
为了支持批量打印,我使用的是合并多个PDF,再一起输出打印的方式。/file/download/mergePdf就是合并PDF的方法。$!reportAttParam就是我们系统中PDF文件上传后返回的ID,可以传多个。method=inline在线预览的方式打开PDF。
IE下可以直接调用打印:
if (isIE()) {
var pdfReader = document.getElementById("reportPrinterObj");
//pdfReader.setShowToolbar(false);
//pdfReader.setShowScrollbars(false);
pdfReader.printWithDialog();
}
IE判断代码:
return ("ActiveXObject" in window);
2、合并多个PDF返回。
依赖jar包:
org.apache.pdfbox
pdfbox
1.8.10
继续看合并PDF控制层代码
/**
* 把PDF文件合并后下载
*
* @param fileInfoVO 要合并的文件ID列表{@link FileInfoVO#getFileInfoList()}
* @param httpServletRequest {@link HttpServletRequest}
* @param httpServletResponse {@link HttpServletResponse}
* @throws IOException {@link IOException}
*/
@RequestMapping(value = "/file/download/mergePdf", method = RequestMethod.GET)
private void mergePdfAndDownload(FileInfoVO fileInfoVO, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
String contentType = "application/pdf";
httpServletResponse.setContentType(contentType);
String fileName = DataUtils.encodeFileName("合并后的文件.pdf", httpServletRequest);
httpServletResponse.addHeader("Content-Disposition", fileInfoVO.getMethod() + ";filename=" + fileName);
ServletOutputStream out = httpServletResponse.getOutputStream();
ResultVO resultVO = fileService.mergePdf(fileInfoVO, out);
if (ResultVO.FAIL.equals(resultVO.getErrorCode())) {
httpServletResponse.sendRedirect(UrlUtils.getCurUrl(httpServletRequest) + "/file/fileNotExist");
}
}
文件名编码部分的代码:
/**
* 对文件名做对应的编码处理,已兼容中文文件名
*
* @param fileName 要做编码处理的文件名
* @return 编码后的文件名
*/
public static String encodeFileName(String fileName, HttpServletRequest httpServletRequest) {
String encodeFileName = fileName;
if (httpServletRequest.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {
try {
encodeFileName = URLEncoder.encode(fileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
LOGGER.error("编码文件名异常!{}", e.getMessage());
}
} else {
try {
encodeFileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
LOGGER.error("编码文件名异常!{}", e.getMessage());
}
}
return encodeFileName;
}
fileService.mergePdf关键代码:
@Override
public ResultVO mergePdf(FileInfoVO fileInfoVO, OutputStream outputStream) throws IOException {
ResultVO resultVO = new ResultVO();
if (CollectionUtils.isEmpty(fileInfoVO.getFileInfoList())) {
resultVO.setErrorCode(ResultVO.FAIL);
resultVO.setErrorMsg("没有要合并的PDF文件!");
return resultVO;
}
List resultFiles;
try {
// 从文件服务器下载PDF
resultFiles = getDownloadFiles(fileInfoVO.getFileInfoList(), Boolean.TRUE);
} catch (Exception e) {
resultFiles = null;
}
if (CollectionUtils.isEmpty(resultFiles)) {
resultVO.setErrorCode(ResultVO.FAIL);
resultVO.setErrorMsg("根据条件无法从平台获取要合并的PDF!");
return resultVO;
}
PDDocument destinationPdDocument = null;
try {
destinationPdDocument = getMergedPdfDocument(resultFiles, Boolean.FALSE);
if (destinationPdDocument != null) {
destinationPdDocument.save(outputStream);
} else {
resultVO.setErrorCode(ResultVO.FAIL);
resultVO.setErrorMsg("要合并的文件都不是PDF文件!");
return resultVO;
}
outputStream.flush();
if (!ResultVO.SUCCESS.equals(resultVO.getErrorCode())) {
resultVO.setErrorCode(ResultVO.SUCCESS);
resultVO.setErrorMsg("PDF文件合并成功!");
}
return resultVO;
} catch (IOException | COSVisitorException e) {
LOGGER.error("合并PDF异常-->", e);
resultVO.setErrorCode(ResultVO.FAIL);
resultVO.setErrorMsg("在合并PDF时发生未知异常!");
return resultVO;
} finally {
if (outputStream != null) {
outputStream.close();
}
if (destinationPdDocument != null) {
destinationPdDocument.close();
}
}
}
@Override
public PDDocument getMergedPdfDocument(List resultFiles, boolean exitIfNotPdf) throws IOException {
PDFMergerUtility pdfMergerUtility = new PDFMergerUtility();
PDDocument destinationPdDocument = null;
for (FileInfoVO pdfFileInfo : resultFiles) {
if (ArrayUtils.isNotEmpty(pdfFileInfo.getFileContent())) {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(pdfFileInfo.getFileContent());
if (destinationPdDocument == null) {
destinationPdDocument = PDDocument.load(byteArrayInputStream);
} else {
PDDocument appendPdDocument = PDDocument.load(byteArrayInputStream);
pdfMergerUtility.appendDocument(destinationPdDocument, appendPdDocument);
appendPdDocument.close();
}
byteArrayInputStream.close();
} else {
LOGGER.info("要合并的PDF内容为空,直接跳过,FileInfoVO-->{}", pdfFileInfo.toString());
}
}
return destinationPdDocument;
}
最终把合并后的PDF显示在了浏览器,不过在有些IE版本下不能直接预览,会显示一个下载页面点击直接打开才能预览。
adobe reader java_使用Adobe Reader控件结合Java实现PDF打印功能相关推荐
- java程序获取外部java程序的控件,将 Java 小程序迁移到 Microsoft J# 浏览器控件-JSP教程,Java技巧及代码...
visual j# .net 小组 microsoft corporation 摘要:通过 microsoft j# 浏览器控件,开发人员可以将所编写的在 java 虚拟机上运行的 java 小程序迁 ...
- active控件和java脚本_【学习笔记】在原生javascript中使用ActiveX和插件
什么是插件 现在的浏览器提供了大量的内置功能,但仍然有一些工作无法完成,如播放音频和视频.插件及其扩展浏览器功能就尤为重要. 插件是可下载的应用程序,可以插入到浏览器中,现在有很多不同的插件,常用的有 ...
- 使用Google 官方的控件SwipeRefreshLayout实现下拉刷新功能
之前做东西的时候,经常会用到下拉刷新的功能,之前大家都在使用Github上的一个很著名的开源项目 PullToRefresh 但是,现在好消息来了,google在19.1版本的support-v4兼容 ...
- java web 打印控件_web打印,web打印控件,dotnet web打印控件,java web打印控件,webprint...
webprint打印参数设置小插件,主要实现打印纸张,边距,打印机等的设置. 主要功能: 设置页眉页脚属性 设置打印页面左右上下边距 设置打印方向,打印份数,打印指定页 打印模版和指定纸型绑定 设置自 ...
- TreeView控件中实现拖拽的功能
#region 节点拖拽事件 //当用户开始拖动节点时 private void tvModel_ItemDrag(object sender, ItemDragEve ...
- IE内置的WebBrowser控件之--WEB打印
本文主要使用了IE内置的WebBrowser控件,无需用户下载和安装.WebBrowser有很多功能,除打印外的其他功能就不再赘述了,你所能用到的打印功能也几乎全部可以靠它完成,下面的问题就是如何使用 ...
- vba quit此文件正由另一个应用程序或用户使用_VBA|如何添加外部对象库(或控件)引用来扩展VBA功能...
VBA是VB的宏语言,基于对象,有大量的内部对象及其属性和方法可以使用,此外,还可以添加外部对象库引用来扩展VBA功能. 例如你在网上找了一个项目的文件,其中有对listview的使用,但你使用这个项 ...
- UI5控件类似Java反射机制的一个小技巧
一个很小的tip:比如我想把UI5里 table里的每个column 设置成宽度根据显示的内容自适应,需要知道应该call控件的哪个方法来实现. 一种办法当然是查help 文档,得知需要call se ...
- html5人脸拼图,面向眼机交互的界面控件设计方法研究.pdf
摘要 摘要 眼机交互是目前人机交互技术中具有前瞻性研究价值的新方向,目前已逐步应用在 虚拟现实.残疾人辅助.医疗.教育和军事等诸多领域.近年来,越来越多的设备将眼 机交互的方式加入到人机对话中,发挥其 ...
最新文章
- AngularJS第二课(指令,作用域,控制器)
- 从CNN视角看在自然语言处理上的应用 原创 2017年10月24日 00:00:00 1339 作者 | 卞书青 卷积神经网络(Convolutional Neural Network)最早是应用在
- The assembly for System.Buffers could not be loaded;无法加载System.Buffers的程序集
- invalidate(true) 图形不显示_2D图像界面-ATI 图形界面卡
- c++面向对象三大特征封装、继承和多态知识总结
- PHP-面向对象编程教程
- linux字符雨,linux周记
- Zookeeper Tutorial 2 -- Programmer's Guide
- 1006	换个格式输出整数(C语言)
- python3 os.system 异步执行_《sentos python教程》 Python os.system(command),这样执行的command命令,和主程序是异步的吗?...
- OSChina 周六乱弹 —— 表白有风险,装逼需谨慎
- 指针错位导致对FSD误判
- 手机抓直播源工具app_香港卫视 手机在线直播 央视源
- 2014乌云安全峰会文字版记录
- 游戏帧数对比测试监控软件,8款游戏帧数对比实测 5800X多数超越11900K
- 服装行业SCM供应链管理平台优化资源配置效率,促进企业提质增效
- 达梦数据库ODBC连接异常问题
- wps表格错开半行_word表格错开半行-Excel 表格上下怎么错位!
- 平衡二叉树(AVL)
- 微信小程序:语音变声器支持多种音效与流量主
热门文章
- 弃繁就简,一行代码教你摆平Python 日志
- 关于 vue 数据请求 本地跨域 和 线上请求的 ip地址 切换 问题
- STM32CubeMX生成STM32F072 USB 自定义HID Device
- UTM坐标与GPS经纬度(WGS84)的相互转换
- ORACLE EBS出现In order to access this application, you must install the J2SE Plugin version 1.6.0_07
- 2016计算机应用试题答案,2017年计算机应用基础模拟试题「答案」
- 数学模型算法实现之排队论
- word自带的公式编辑器——用法技巧总结
- maven 配置下载jar、源码等先走私服,找不到再走阿里云镜像
- HUSTOJ特判程序Special Judge使用方法整理