java使用PDFRenderer实现预览PDF功能

本文实例为大家分享了java使用PDFRenderer实现预览PDF功能,供大家参考,具体内容如下

需要一个jar PDFRenderer-0.9.0.jar

package com.wonders.stpt.attach.action;

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Arrays;
import java.util.Comparator;
import javax.imageio.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.sun.image.codec.jpeg.JPEGCodec;

import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;
import com.wonders.stpt.attach.model.vo.UploadFile;
import com.wonders.stpt.attach.service.FjshService;
import com.wonders.stpt.userMsg.action.AbstractParamAction;

@SuppressWarnings("serial")
@ParentPackage("struts-default")
@Namespace(value="/attach")
@Component("attachViewerAction")
@Scope("prototype")
public class AttachViewerAction extends AbstractParamAction{

 private FjshService fjshService;
 private final int maxPage = 30; 

 public FjshService getFjshService() {
 return fjshService;
 }

 @Autowired(required=false)
 public void setFjshService(@Qualifier("fjshService")FjshService fjshService) {
 this.fjshService = fjshService;
 }

 /**
 * PDF文档在线以图片格式预览.
 *
 */
 @Action(value="/pdfPreview",results={@Result(name="pdf",location="/attachPreview/pdfViewer.jsp")})
 public String pdfPreview() {
 //按fileId查找出该文件的路径以及文件名.
 //该部分代码copy自附件上传组件

 HttpServletRequest request = servletRequest;
 HttpServletResponse response = servletResponse;
 String fileId = request.getParameter("fileId");
 if("".equals(fileId) || null == fileId) {
  servletRequest.setAttribute("state", "f");
  return "pdf";
 }

 UploadFile upFile = this.fjshService.loadFileById(fileId);
 if(upFile == null) {
  servletRequest.setAttribute("state", "f");
  return "pdf";
 }
 String path = upFile.getPath();   // 文件所在磁盘路径.
 String fileName = upFile.getFileAllName(); // 真实文件名.
 String saveFileName = upFile.getSaveFileName(); // 磁盘上的文件名.
 String version = upFile.getVersion();
 if ("old".equals(request.getParameter("ver"))){
  if (version != null){
  saveFileName = saveFileName.replace(".dat","_v"+version+".dat");
  }
 }

 //当前应用绝对路径
 String appPath = request.getSession().getServletContext().getRealPath ("");
   String imageSavePath = appPath + "\\preview_images\\";

 //按照文件路径读取PDF文档,并将其按页转换为图片

 String filePath = path + saveFileName ;
 if(filePath == null || "".equals(filePath)) {
  servletRequest.setAttribute("state", "f");
  return "pdf";
 }else {
  PDFFile pdfFile = this.getPdfFile(filePath);
  if(this.pdf2Images(pdfFile,imageSavePath,String.valueOf(upFile.getId()))) { //如果转换成功
  return "pdf";
  }else {
  servletRequest.setAttribute("state", "f");
  return "pdf";
  }
 }
 }

 /**
 * 图片文件在线预览
 *
 */
 @Action(value="/imagePreview",results={@Result(name="image",location="/attachPreview/imageViewer.jsp")})
 public String imagePreview() {
 //按fileId查找出该文件的路径以及文件名.
 //该部分代码copy自附件上传组件

 HttpServletRequest request = servletRequest;
 HttpServletResponse response = servletResponse;
 String fileId = request.getParameter("fileId");
 if("".equals(fileId) || null == fileId) {
  servletRequest.setAttribute("state", "f");
  return "image";
 }

 UploadFile upFile = this.fjshService.loadFileById(fileId);
 if(upFile == null) {
  servletRequest.setAttribute("state", "f");
  return "image";
 }
 String path = upFile.getPath();   // 文件所在磁盘路径.
 String fileName = upFile.getFileAllName(); // 真实文件名.
 String saveFileName = upFile.getSaveFileName(); // 磁盘上的文件名.
 String version = upFile.getVersion();
 if ("old".equals(request.getParameter("ver"))){
  if (version != null){
  saveFileName = saveFileName.replace(".dat","_v"+version+".dat");
  }
 }

 //当前应用绝对路径
 String appPath = request.getSession().getServletContext().getRealPath ("");
   String imageSavePath = appPath + "\\preview_images\\";

 //按照文件路径读取文件
 String filePath = path + saveFileName ;
 if(filePath == null || "".equals(filePath)) {
  servletRequest.setAttribute("state", "f");
  return "image";
 }else {
  //如果成功读取文件
  String imageName = String.valueOf(upFile.getId());
  String extName = upFile.getFileExtName();
  if(getImageFile(filePath,imageSavePath,imageName,extName)) {
  return "image";
  }else {
  servletRequest.setAttribute("state", "f");
  return "image";
  }
 }
 }

 /**
 * image文件读取.
 * @param filePath -- 待读取文件的路径.
 * @param imageSavePath -- 图片保存路径.
 * @param imageName -- 图片文件保存后的文件名称(包括后缀).
 * @return boolean instance.
 */
 private boolean getImageFile(String filePath,String imageSavePath,String dirName,String extName) {
 String path = imageSavePath + dirName + "\\";
 File file = new File(path);
 if(!file.exists()){ //判断以文件名命名的文件夹是否存在.
  file.mkdirs();
 }

 try {
  InputStream is = new FileInputStream(filePath);
  String imagePath = path + dirName + "." + extName;
  FileOutputStream os = new FileOutputStream(imagePath); // 输出到文件流.
  byte[] buffer = new byte[1024];
  int n = 0;
  while ((n = is.read(buffer, 0, 1024)) > 0) {
  os.write(buffer, 0, n);
  }
  os.close();
  is.close();
 } catch (Exception ex) {
  ex.printStackTrace();
  return false;
 } 

 servletRequest.setAttribute("state", "s");
 servletRequest.setAttribute("dirName", dirName);
 servletRequest.setAttribute("imageName", dirName + "." + extName);
 return true;
 }

 /**
 * PDF文档读取.
 * @param filePath -- 待读取PDF文件的路径.
 * @return null 或者 PDFFile instance.
 */
 private PDFFile getPdfFile(String filePath) {
 try {
  //load a pdf file from byte buffer.
  File file = new File(filePath);
  RandomAccessFile raf = new RandomAccessFile(file, "r");
  FileChannel channel = raf.getChannel();
  ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0,
   channel.size());
  PDFFile pdfFile = new PDFFile(buf);

  return pdfFile;
 } catch (Exception ex) {
  ex.printStackTrace();
 }
 return null;
 }

 /**
 * PDF文档按页转换为图片.
 * @param pdfFile -- PDFFile instance
 * @param imageSavePath -- 图片保存路径.
 * @param fileName -- 保存图片文件夹名称.
 */
 private boolean pdf2Images(PDFFile pdfFile,String imageSavePath,String fileName) {
 if(pdfFile == null ) { //待转换文档不存在,返回false.
  return false;
 }

 //将转换后图片存放于path路径下

 String path = imageSavePath + fileName + "\\";
 File filePath = new File(path);
 if(!filePath.exists()){ //判断以文件名命名的文件夹是否存在.
  filePath.mkdirs();
 }

 //取得当前文件夹下的所有jpg格式的文件名.
 String[] imageNames = filePath.list(new ImageFilter());
 if(imageNames.length == 0) { //当前文件夹下没有文件.
  //将pdf文档按页转为图片.
  String imagePath = "";
  try {
  //对转换页数进行限制,最多只转换前maxPage页.
  int pages = pdfFile.getNumPages();
  if(pages > maxPage){
   pages = maxPage;
  }

  for (int i = 1; i <= pages; i++) {
   // draw the page to an image
   PDFPage page = pdfFile.getPage(i);
   // get the width and height for the doc at the default zoom
   Rectangle rect = new Rectangle(0,
        0,
        (int) page.getBBox().getWidth(),
        (int) page.getBBox().getHeight());
   // generate the image
   Image img = page.getImage(rect.width, rect.height, // width & height
       rect, // clip rect
       null, // null for the ImageObserver
       true, // fill background with white
       true // block until drawing is done
       );

   BufferedImage tag = new BufferedImage(rect.width,
        rect.height,
        BufferedImage.TYPE_INT_RGB);

   tag.getGraphics().drawImage(img,
      0,
      0,
      rect.width,
      rect.height,
      null);

   imagePath = path + i + ".jpg";
   FileOutputStream out = new FileOutputStream(imagePath); // 输出到文件流.
   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
   encoder.encode(tag);  // JPEG编码.
   out.close();
  }
  }catch (Exception ex) {
  ex.printStackTrace();
  return false;
  }
 }

 //取得当前文件夹下的所有jpg格式的文件名.
 imageNames = filePath.list(new ImageFilter());
 //对文件名排序.
 Arrays.sort(imageNames,new FileNameComparator());

 servletRequest.setAttribute("state", "s");
 servletRequest.setAttribute("fileName", fileName);
 servletRequest.setAttribute("imageNames", imageNames);

 return true;
 }

 //图片后缀名过滤类

 //图片jpg过滤器类
 class ImageFilter implements FilenameFilter {
  public boolean isImageFile(String fileName){
   if(fileName.toLowerCase().endsWith("jpg")) {
   return true;
   }else {
   return false;
   }
  }

  public ImageFilter() {}

  public boolean accept(File dir,String name){
  return isImageFile(name);
  }
 }

 //文件名称比较类

 class FileNameComparator implements Comparator {
 public final int compare(Object first, Object second) {
   String[] fir = ((String)first).split("\\.");
   String[] sec = ((String)second).split("\\.");

   int firstPage = Integer.parseInt(fir[0]);
   int secondPage = Integer.parseInt(sec[0]);
   int diff = firstPage - secondPage;
   if (diff > 0)
   return 1;
   if (diff < 0)
   return -1;
   else
   return 0;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java通过PDF模板填写PDF表单

    本文实例为大家分享了java通过PDF模板填写PDF表单的具体代码,包括图片,供大家参考,具体内容如下 需要用到的java包: itext.jar.iTextAsian.jar的JAR包.这个包里面定义了与中文输出相关的一些文件. 编写的表单如下: import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap;

  • Java设置PDF有序和无序列表的知识点总结

    文档中的设置有序或无序列表是一种反应内容上下级关系或者内容相同属性的方式,与单纯的文字叙述相比,它能有效增强文档内容的条理性,突出重点.因此,本文将分享通过Java编程在PDF文档中设置有序或无序列表的方法. 使用工具:Free Spire.PDF for Java V2.2.2(免费版) Jar文件导入: Step1:在Java程序中新建一个文件夹可命名为Lib.并将下载包中的jar文件(如下图)复制到新建的文件夹下. Step2:复制文件后,添加到引用类库:选中这个jar文件,点击鼠标右键,

  • Java实现PDF打印的解决方案

    1.Java Print Service Java Print Service是Java自带的打印框架,所在的包javax.print.PrintService;. 实现PDF打印的代码流程如下 //1.得到一个文件的输入流 FileInputStream fiStream; try { psStream = new FileInputStream("./sample.PDF"); } catch (FileNotFoundException ffne) { } if (psStrea

  • java利用jacob将word转pdf

    本文实例为大家分享了java开发利用jacob将word转pdf的具体代码,供大家参考,具体内容如下 jacob 缺点:需要 window 环境,而且速度是最慢的需要安装 msofficeWord 以及 SaveAsPDFandXPS.exe ( word 的一个插件,用来把 word 转化为 pdf ) 开发流程: SaveAsPDFandXPS 下载地址 jacob 包下载地址: 1.先安装SaveAsPDFandXPS 2.下载 jacob 解压后存放路径: jacob.jar 放在 C:

  • java实现在pdf模板的指定位置插入图片

    本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.6</version> </dependency> <!--

  • java使用jacob实现word转pdf

    背景:日常开发ERP系统,会有一些工单或者合同之类需要填写打印.我们就会将其word模板来通过系统自动化填写并转换为PDF格式(PDF文件打印可保证文件质量,是一种通用的格式.文件不易去修改,比较稳定).所以我们将通过jacob来实现这些功能. 准备工作: 1.服务器需要安装office2007,因为我们就是调用这个来实现转换. 2.需要安装插件jacob,安装jacob-1.14.3-x86.dll到jdk\jdk1.7.0\jre\bin(你自己电脑安装的jdk) 3.需要使用jacob-1

  • Java创建和填充PDF表单域方法

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加以及填充表单域的方法.这里填充表单域可分为2种情况,一种是在创建表单域时填充,一种是加载已经创建好表单域的文档进行填充.此外,对于已经创建表单域并填写好的文档,也可以设置只读,防止修改.编辑. 要点概括: 1.创建表单域 2.填充表单域 3.设置表单域只读 工具:Free Spire.PDF for

  • java使用PDFRenderer实现预览PDF功能

    本文实例为大家分享了java使用PDFRenderer实现预览PDF功能,供大家参考,具体内容如下 需要一个jar PDFRenderer-0.9.0.jar package com.wonders.stpt.attach.action; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInp

  • Vue实现在线预览pdf文件功能(利用pdf.js/iframe/embed)

    前言 最近在做一个精品课程,需要在线预览课件ppt,我们的思路是将ppt转换为pdf在线预览,所以问题就是如何实现在线预览pdf了. 在实现的过程中,为了更好地显示效果,我采用了多种不同的方法,最终选择效果最好的pdf.js. 实现方法: 1:iframe 采取iframe将pdf嵌入网页从而达到预览效果,想法很美好,实现很简单,但显示很残酷- 虽然一行代码简洁明了,打开谷歌浏览器效果也还行,但缺点也是十分明显的!!!! <iframe src="http......" widt

  • Java预览PDF时的文件名称问题及解决

    目录 Java预览PDF时的文件名称 问题场景 解决思路 解决方案 预览pdf时中文乱码 第一步 第二步 Java预览PDF时的文件名称 问题场景 今天在做新项目的时候,测试提交过来一个bug:在谷歌浏览器上预览一些客户上传的pdf文件时,发现浏览器的标签上展示的要么不是我们看到的文件名,要么就直接是方法名,看起来不太合适,让我想想办法优化优化. 刚开始看到这个问题的时候确实很头疼,因为之前尝试过去解决这个问题,但是当时因为一些其他的原因,没有仔细的去思考这些个问题,这会做新项目刚好有时间去琢磨

  • 如何在Windows Vista中预览PDF文件的方法

    之前我们曾介绍过Windows Vista的预览功能,即在用户不打开相应文件的情况下查看文件的具体内容,这是个相当有用的功能,可以大大提高日常工作的效率.Windows Vista预览功能可支持的对象包括图片.音频.视频.字体.文本.E-mail乃至Office文档如Word.Excel.PowerPoint文件. 不过,对于PDF(Portable Document Format)文件,则没有这么幸运了,即使在Windows Vista中安装了可以创建PDF的Office 2007后,仍然不能

  • ASP.NET MVC 项目直接预览PDF文件

    背景及需求 项目使用的是MVC4框架,其中有一个功能是根据设置生成PDF文件,并在点击时直接预览. 实现过程 1.第一版实现代码: HTML内容 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> &

  • Android快速实现无预览拍照功能

    本文实例为大家分享了Android实现无预览拍照功能的具体代码,供大家参考,具体内容如下 实现思路: 把预览的SurfaceView的宽高设置为肉眼看不出的值,例如0.1dp,其他的就是自定义相机的标准步骤了! 当然,网上自定义相机的文章多的去了,我是不可能再做老生常谈的事的,在这里我推荐一个很好用的第三方库,也许很多人已经了解过并且用过,没用过的同学可以试试,亲测好用. 废话不多说,先上源码地址 这里简单介绍一下用法: 1.在gradle里添加库的依赖:compile 'com.wonderk

  • vue使用pdf.js预览pdf文件的方法

    我们在页面进行pdf预览的时候,由于有些文件不能够进行打印和下载,这时候我们使用window自带的pdf就很难满足客户的需求,因此需要另外的办法来支持我们进行特殊条件的pdf文件预览,这里我采用引入pdf.js文件的形式来达到目的. 第一步:下载pdf.js 引入pdf.js文件 地址如下:http://mozilla.github.io/pdf.js/getting_started/ 第二步,vue引入 我这里是把下载下来的文件放在了根目录的piblic下 第三步,使用 主要是地址"/buil

  • vue3.0使用vue-pdf-embed在线预览pdf 控制页码显示范围不生效问题解决

    目录 vue3.0使用vue-pdf-embed在线预览pdf 控制页码显示范围不生效问题 1.先安装vue-pdf-embed 2.安装后 在使用页面引入 PS:vue3.0借用vue-pdf-embed实现在线预览pdf文件 实现效果 实现步骤 一:安装依赖 二:页面使用 三:可能报错一 问题解决 1:下载依赖 2:配置vue.config.js文件 三:可能报错二 问题原因 问题解决 vue3.0使用vue-pdf-embed在线预览pdf 控制页码显示范围不生效问题 本来想的很简单 觉得

  • jQuery实现上传图片前预览效果功能

    网上很多代码实现了上传图片这个功能,但不支持实时预览图片,下面实现了上传图片前预览效果功能,具体如下 效果如图: 代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>jQuery上传图片之前可以预览效果</title> <script src="http://libs.baidu.com/jquery/1.11.3/jq

  • JS实现上传图片的三种方法并实现预览图片功能

    在常见的用户注册页面,需要用户在本地选择一张图片作为头像,并同时预览. 常见的思路有两种:一是将图片上传至服务器的临时文件夹中,并返回该图片的url,然后渲染在html页面:另一种思路是,直接在本地内存中预览图片,用户确认提交后再上传至服务器保存. 这两种方法各有利弊,方法一很明显,浪费流量和服务器资源:方法二则加重了浏览器的负担,并且对浏览器的兼容性要求更高(在某些低版本中的IE浏览器不支持). 以下是实现上述思路的方法: 1. 模板文件 <!DOCTYPE html> <html l

随机推荐