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打印功能相关推荐

  1. java程序获取外部java程序的控件,将 Java 小程序迁移到 Microsoft J# 浏览器控件-JSP教程,Java技巧及代码...

    visual j# .net 小组 microsoft corporation 摘要:通过 microsoft j# 浏览器控件,开发人员可以将所编写的在 java 虚拟机上运行的 java 小程序迁 ...

  2. active控件和java脚本_【学习笔记】在原生javascript中使用ActiveX和插件

    什么是插件 现在的浏览器提供了大量的内置功能,但仍然有一些工作无法完成,如播放音频和视频.插件及其扩展浏览器功能就尤为重要. 插件是可下载的应用程序,可以插入到浏览器中,现在有很多不同的插件,常用的有 ...

  3. 使用Google 官方的控件SwipeRefreshLayout实现下拉刷新功能

    之前做东西的时候,经常会用到下拉刷新的功能,之前大家都在使用Github上的一个很著名的开源项目 PullToRefresh 但是,现在好消息来了,google在19.1版本的support-v4兼容 ...

  4. java web 打印控件_web打印,web打印控件,dotnet web打印控件,java web打印控件,webprint...

    webprint打印参数设置小插件,主要实现打印纸张,边距,打印机等的设置. 主要功能: 设置页眉页脚属性 设置打印页面左右上下边距 设置打印方向,打印份数,打印指定页 打印模版和指定纸型绑定 设置自 ...

  5. TreeView控件中实现拖拽的功能

    #region 节点拖拽事件         //当用户开始拖动节点时         private void tvModel_ItemDrag(object sender, ItemDragEve ...

  6. IE内置的WebBrowser控件之--WEB打印

    本文主要使用了IE内置的WebBrowser控件,无需用户下载和安装.WebBrowser有很多功能,除打印外的其他功能就不再赘述了,你所能用到的打印功能也几乎全部可以靠它完成,下面的问题就是如何使用 ...

  7. vba quit此文件正由另一个应用程序或用户使用_VBA|如何添加外部对象库(或控件)引用来扩展VBA功能...

    VBA是VB的宏语言,基于对象,有大量的内部对象及其属性和方法可以使用,此外,还可以添加外部对象库引用来扩展VBA功能. 例如你在网上找了一个项目的文件,其中有对listview的使用,但你使用这个项 ...

  8. UI5控件类似Java反射机制的一个小技巧

    一个很小的tip:比如我想把UI5里 table里的每个column 设置成宽度根据显示的内容自适应,需要知道应该call控件的哪个方法来实现. 一种办法当然是查help 文档,得知需要call se ...

  9. html5人脸拼图,面向眼机交互的界面控件设计方法研究.pdf

    摘要 摘要 眼机交互是目前人机交互技术中具有前瞻性研究价值的新方向,目前已逐步应用在 虚拟现实.残疾人辅助.医疗.教育和军事等诸多领域.近年来,越来越多的设备将眼 机交互的方式加入到人机对话中,发挥其 ...

最新文章

  1. AngularJS第二课(指令,作用域,控制器)
  2. 从CNN视角看在自然语言处理上的应用 原创 2017年10月24日 00:00:00 1339 作者 | 卞书青 卷积神经网络(Convolutional Neural Network)最早是应用在
  3. The assembly for System.Buffers could not be loaded;无法加载System.Buffers的程序集
  4. invalidate(true) 图形不显示_2D图像界面-ATI 图形界面卡
  5. c++面向对象三大特征封装、继承和多态知识总结
  6. PHP-面向对象编程教程
  7. linux字符雨,linux周记
  8. Zookeeper Tutorial 2 -- Programmer's Guide
  9. 1006 换个格式输出整数(C语言)
  10. python3 os.system 异步执行_《sentos python教程》 Python os.system(command),这样执行的command命令,和主程序是异步的吗?...
  11. OSChina 周六乱弹 —— 表白有风险,装逼需谨慎
  12. 指针错位导致对FSD误判
  13. 手机抓直播源工具app_香港卫视 手机在线直播 央视源
  14. 2014乌云安全峰会文字版记录
  15. 游戏帧数对比测试监控软件,8款游戏帧数对比实测 5800X多数超越11900K
  16. 服装行业SCM供应链管理平台优化资源配置效率,促进企业提质增效
  17. 达梦数据库ODBC连接异常问题
  18. wps表格错开半行_word表格错开半行-Excel 表格上下怎么错位!
  19. 平衡二叉树(AVL)
  20. 微信小程序:语音变声器支持多种音效与流量主

热门文章

  1. 弃繁就简,一行代码教你摆平Python 日志
  2. 关于 vue 数据请求 本地跨域 和 线上请求的 ip地址 切换 问题
  3. STM32CubeMX生成STM32F072 USB 自定义HID Device
  4. UTM坐标与GPS经纬度(WGS84)的相互转换
  5. ORACLE EBS出现In order to access this application, you must install the J2SE Plugin version 1.6.0_07
  6. 2016计算机应用试题答案,2017年计算机应用基础模拟试题「答案」
  7. 数学模型算法实现之排队论
  8. word自带的公式编辑器——用法技巧总结
  9. maven 配置下载jar、源码等先走私服,找不到再走阿里云镜像
  10. HUSTOJ特判程序Special Judge使用方法整理