您好,登錄后才能下訂單哦!
怎么在java中使用PDFRenderer實(shí)現(xiàn)一個(gè)預(yù)覽PDF功能?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
具體內(nèi)容如下
需要一個(gè)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文檔在線以圖片格式預(yù)覽. * */ @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(); // 文件所在磁盤(pán)路徑. String fileName = upFile.getFileAllName(); // 真實(shí)文件名. String saveFileName = upFile.getSaveFileName(); // 磁盤(pán)上的文件名. String version = upFile.getVersion(); if ("old".equals(request.getParameter("ver"))){ if (version != null){ saveFileName = saveFileName.replace(".dat","_v"+version+".dat"); } } //當(dāng)前應(yīng)用絕對(duì)路徑 String appPath = request.getSession().getServletContext().getRealPath (""); String imageSavePath = appPath + "\\preview_images\\"; //按照文件路徑讀取PDF文檔,并將其按頁(yè)轉(zhuǎn)換為圖片 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()))) { //如果轉(zhuǎn)換成功 return "pdf"; }else { servletRequest.setAttribute("state", "f"); return "pdf"; } } } /** * 圖片文件在線預(yù)覽 * */ @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(); // 文件所在磁盤(pán)路徑. String fileName = upFile.getFileAllName(); // 真實(shí)文件名. String saveFileName = upFile.getSaveFileName(); // 磁盤(pán)上的文件名. String version = upFile.getVersion(); if ("old".equals(request.getParameter("ver"))){ if (version != null){ saveFileName = saveFileName.replace(".dat","_v"+version+".dat"); } } //當(dāng)前應(yīng)用絕對(duì)路徑 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 -- 圖片文件保存后的文件名稱(chēng)(包括后綴). * @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文檔按頁(yè)轉(zhuǎn)換為圖片. * @param pdfFile -- PDFFile instance * @param imageSavePath -- 圖片保存路徑. * @param fileName -- 保存圖片文件夾名稱(chēng). */ private boolean pdf2Images(PDFFile pdfFile,String imageSavePath,String fileName) { if(pdfFile == null ) { //待轉(zhuǎn)換文檔不存在,返回false. return false; } //將轉(zhuǎn)換后圖片存放于path路徑下 String path = imageSavePath + fileName + "\\"; File filePath = new File(path); if(!filePath.exists()){ //判斷以文件名命名的文件夾是否存在. filePath.mkdirs(); } //取得當(dāng)前文件夾下的所有jpg格式的文件名. String[] imageNames = filePath.list(new ImageFilter()); if(imageNames.length == 0) { //當(dāng)前文件夾下沒(méi)有文件. //將pdf文檔按頁(yè)轉(zhuǎn)為圖片. String imagePath = ""; try { //對(duì)轉(zhuǎn)換頁(yè)數(shù)進(jìn)行限制,最多只轉(zhuǎn)換前maxPage頁(yè). 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; } } //取得當(dāng)前文件夾下的所有jpg格式的文件名. imageNames = filePath.list(new ImageFilter()); //對(duì)文件名排序. Arrays.sort(imageNames,new FileNameComparator()); servletRequest.setAttribute("state", "s"); servletRequest.setAttribute("fileName", fileName); servletRequest.setAttribute("imageNames", imageNames); return true; } //圖片后綴名過(guò)濾類(lèi) //圖片jpg過(guò)濾器類(lèi) 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); } } //文件名稱(chēng)比較類(lèi) 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; } } }
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。