pdfrender实现简易版pdf阅读器-支持鼠标拖动浏览
来源:互联网 发布:java文件下载实例 编辑:程序博客网 时间:2024/06/06 06:08
基于pdfrender实现简易版pdf阅读器,支持鼠标上下拖动实现翻页和滚动条支持
看了代码就知道其中的奥妙
PDFComponent类:
import com.sun.pdfview.PDFFile;import com.sun.pdfview.PDFPage;import com.sun.pdfview.PDFRenderer;import javax.swing.*;import java.awt.*;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.print.PageFormat;import java.awt.print.Paper;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.nio.ByteBuffer;/** * pdf显示component * @author yy */public class PDFComponent extends JScrollPane { private static final long serialVersionUID = 1L; // byte array containing the PDF file content //当前文件字符数组 private byte[] bytes = null; //文件名称 private String fileName; //每页高度(当前高度会根据当前窗体大小计算相对高度) private double pageHeight; //页面总高度(画布) private double totalHeight; //当前pdf文件 private PDFFile pdfFile; //当前所查看的页数 private int index = 0; /** * y轴上一个值,鼠标按下时触发,鼠标释放时设置为0 */ private int preY = 0; /** * pdf组件 */ private JPanel pdfPanel; public PDFComponent() { pdfPanel = new JPanel(){ @Override public void paintComponent(Graphics g) { super.paintComponent(g); //绘制当前页和下一页,避免滑动到两页中间位置出现文档显示不全问题(这样也解决了当文档太大时加载整个文档所消耗不必要的时间) draw(g, index); draw(g, index+1); } }; initComponents(); } public PDFComponent(String fileName) { this(); this.fileName = fileName; readFile(); } /** * 初始化组件 */ private void initComponents(){ this.setViewportView(pdfPanel); //添加滚动事件 this.getVerticalScrollBar().addAdjustmentListener((e)->{ int value = e.getValue(); PDFComponent.this.setIndex((int) (value / PDFComponent.this.getPageHeight() + 1)); PDFComponent.this.repaint(); }); pdfPanel.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { preY = e.getYOnScreen(); } @Override public void mouseReleased(MouseEvent e) { preY = 0; } }); pdfPanel.addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { if(preY == 0){//正常情况不会执行到当前方法快 preY = e.getYOnScreen(); return; } int currentY = e.getYOnScreen(); int tmpY = getVerticalScrollBar().getValue(); //如果拖动上一个值和当前值相等就直接返回 if(currentY == preY){ return; } if( currentY > preY){ tmpY -= 50; }else if(currentY < preY){ tmpY += 50; } getVerticalScrollBar().setValue(tmpY); preY = currentY; } }); } /** * 读取当前文件 */ public void readFile() { try (BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(fileName));) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int b; while ((b = inputStream.read()) != -1) { outputStream.write(b); } this.bytes = outputStream.toByteArray(); pdfFile = new PDFFile(ByteBuffer.wrap(this.bytes)); } catch (Exception e) { e.printStackTrace(); } } /** * 改变当前component高度 */ public void changeHeight(){ totalHeight = pageHeight * pdfFile.getNumPages(); Dimension dimension = this.getSize(); dimension.setSize(dimension.getWidth(), totalHeight); pdfPanel.setMinimumSize(dimension); pdfPanel.setPreferredSize(dimension); pdfPanel.setMaximumSize(dimension); pdfPanel.setSize(dimension); } /** * 绘制指定页数 * @param g * @param pageIndex 页码 */ public void draw(Graphics g, int pageIndex) { /** * 如果当前文件或绘制下标超过pdf页数就不绘制 */ if(pdfFile == null || pageIndex > pdfFile.getNumPages()){ return; } PDFPage page = pdfFile.getPage(pageIndex); Paper paper = new Paper(); int formatOrientation = page.getAspectRatio() > 1 ? PageFormat.LANDSCAPE : PageFormat.PORTRAIT; if (formatOrientation == PageFormat.LANDSCAPE) { paper.setSize(page.getHeight(), page.getWidth()); } else { paper.setSize(page.getWidth(), page.getHeight()); } PageFormat pageFormat = new PageFormat(); pageFormat.setPaper(paper); pageFormat.setOrientation(formatOrientation); Graphics2D g2d = (Graphics2D) g.create(); //计算界面宽度与文档宽度的比例 double tmp = this.getSize().getWidth() / page.getWidth(); //重新计算高度(避免pdf变形) pageHeight = pageFormat.getHeight() * tmp; //重新设置panel高度 changeHeight(); //绘制到指定位置 Rectangle imgbounds = new Rectangle(0, (int)((pageIndex - 1) * pageHeight), (int)this.getSize().getWidth(), (int)pageHeight); PDFRenderer renderer = new PDFRenderer(page, g2d, imgbounds, null, Color.WHITE); try { page.waitForFinish(); } catch (InterruptedException e) { // some exception handling e.printStackTrace(); } renderer.run(); } public void setFileName(String fileName) { this.fileName = fileName; } public double getPageHeight() { return pageHeight; } public void setIndex(int index) { this.index = index; }}
MyJFrame:
import java.awt.event.AdjustmentEvent;import java.awt.event.AdjustmentListener;/** * @author Administrator */public class MyJFrame extends javax.swing.JFrame { private int num = 1; /** * Creates new form MyJFrame */ public MyJFrame() { initComponents(); pDFComponent1.setFileName("C:\\Users\\Administrator\\Desktop\\*.pdf"); pDFComponent1.readFile(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { pDFComponent1 = new PDFComponent(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setMinimumSize(new java.awt.Dimension(806, 518)); getContentPane().add(pDFComponent1, java.awt.BorderLayout.CENTER); pack(); }// </editor-fold>//GEN-END:initComponents /** * @param args the command line arguments */ public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(MyJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(MyJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(MyJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(MyJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MyJFrame().setVisible(true); } }); }}jar包就自己download(可直接在maven repository下载),我用的是:pdfrenderer-0.9.1-patched.jar。
阅读全文
0 0
- pdfrender实现简易版pdf阅读器-支持鼠标拖动浏览
- [Swift]iOS开发:简易版PDF阅读器
- mfc下鼠标拖动画面使视图移动的实现方法,类似浏览PDF时用手型鼠标移动视图的效果
- ScrollArea支持鼠标拖动
- 怎样使用PDF阅读器浏览查看PDF文档
- java-支持鼠标拖动面板
- 树状控件支持鼠标拖动
- android 实现PDF浏览
- pdf.js javascript实现pdf阅读器
- 实现鼠标拖动图像
- jquery实现鼠标拖动
- 实现鼠标拖动代码
- web版pdf在线阅读器
- web版pdf在线阅读器
- Linux版Foxit PDF阅读器
- [JAVA]SAX实现的简易RSS阅读器
- 在线浏览pdf文件实现
- Qt 使用Poppler实现pdf阅读器
- Java规范
- 个人总结64
- 14-Longest Common Prefix
- 视频行为理解
- Ubuntu基本命令操作(逐步添加中)
- pdfrender实现简易版pdf阅读器-支持鼠标拖动浏览
- New Start
- Python基础——控制流
- 专业程序员的标准,你达到了吗?
- 当程序员追求佛系,会发生什么……
- Python 笔试集(2):你不知道的 Python 整数
- linux安装maven
- gcc相关
- loading页面(2017.12.13)