singlepagedocumentviewport.java

来自「Java生成PDF Java生成PDF Java生成PDF」· Java 代码 · 共 405 行 · 第 1/2 页

JAVA
405
字号
        }    }        public void redraw(Object o) {        if (o==getPage()) {            pagepanel.setPage(getPage(), pagepanel.getView(), pagepanel.getDPI());        } else if (o instanceof PDFAnnotation) {            pagepanel.redrawAnnotation((PDFAnnotation)o);        }    }    /**     * Subclass to handle all the events we're listning for     */    private class Listener implements PagePanelListener, AdjustmentListener, MouseWheelListener, ComponentListener, KeyListener, MouseListener {        public void componentHidden(ComponentEvent e) { }        public void componentShown(ComponentEvent e) { }        public void componentMoved(ComponentEvent e) { }        public void mouseReleased(MouseEvent event) { }        public void mouseClicked(MouseEvent event) { }        public void mouseExited(MouseEvent event) { }        public void mouseEntered(MouseEvent event) { }        public void keyPressed(KeyEvent e) { }        public void keyTyped(KeyEvent e) { }        public void mousePressed(MouseEvent event) {            requestFocusInWindow();        }        public void keyReleased(KeyEvent e) {            int code = e.getKeyCode();            if (code==e.VK_LEFT) {                getDocumentPanel().runAction(PDFAction.named("PrevPage"));            } else if (code==e.VK_RIGHT) {                getDocumentPanel().runAction(PDFAction.named("NextPage"));            }        }        public void componentResized(ComponentEvent e) {            if (pagepanel.getPage()!=null) {                updateScrollBarExtent(pagepanel.getView(), pagepanel.getDPI());                if (fullimage) {                    updateFullImagePosition();                } else {                    redrawPartialImage(pagepanel.getPage(), sbh.getValue(), sbv.getValue(), pagepanel.getDPI());                }            }        }        public void mouseWheelMoved(MouseWheelEvent e) {            if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {                sbv.setValue(sbv.getValue() + e.getUnitsToScroll());            }        }        public void adjustmentValueChanged(AdjustmentEvent e) {         // On scrollbar setValue             if (fullimage) {                updateFullImagePosition();            } else {                redrawPartialImage(pagepanel.getPage(), sbh.getValue(), sbv.getValue(), pagepanel.getDPI());            }        }        public void pageUpdated(PagePanelEvent e) {            if (e.getType()=="redrawn") {                PagePanel pagepanel = e.getPagePanel();                Rectangle2D viewpos = pagepanel.getView();                Rectangle2D fullpos = PagePanel.getFullPageView(pagepanel.getPage());                fullimage = PagePanel.equalsRectangle2D(viewpos, fullpos);                updateScrollBarExtent(viewpos, pagepanel.getDPI());                if (fullimage) {                    updateFullImagePosition();                } else {                    pagepanel.setLocation(0, 0);                }            }        }    }    /**     * Update the range of the scrollbars     * @param position the current position being displayed     * @param dpi the DPI of the image     */    private void updateScrollBarExtent(Rectangle2D position, float dpi) {        int viewwidth = (int)(viewport.getWidth()/dpi*72);        int viewheight = (int)(viewport.getHeight()/dpi*72);        Rectangle2D fullsize = PagePanel.getFullPageView(pagepanel.getPage());        sbh.setMaximum((int)fullsize.getWidth());        if (viewwidth+sbh.getValue() > sbh.getMaximum()) sbh.setValue(sbh.getMaximum()-viewwidth);        sbh.setVisibleAmount(viewwidth);        sbv.setMaximum((int)fullsize.getHeight());        if (viewheight+sbv.getValue() > sbv.getMaximum()) sbv.setValue(sbv.getMaximum()-viewheight);        sbv.setVisibleAmount(viewheight);    }    /**     * Update the position of the "pagepanel" relative to "viewport" if the full     * image is being displayed.     */    private void updateFullImagePosition() {        float dpi = pagepanel.getDPI();        int viewwidth = viewport.getWidth();        int pagewidth = pagepanel.getWidth();        int viewheight = viewport.getHeight();        int pageheight = pagepanel.getHeight();        int x = viewwidth > pagewidth ? (viewwidth-pagewidth)/2 : (int)(sbh.getValue()*dpi/-72f);        int y = viewheight > pageheight ? (viewheight-pageheight)/2 : (int)(sbv.getValue()*dpi/-72f);        pagepanel.setLocation(x, y);        viewport.repaint();    }    /**     * Redraw the partial section of image being displayed.     * @param page the page being drawn     * @param x the X co-ordinate of the left edge, from the getFullPageView box     * @param y the Y co-ordinate of the top edge, from the getFullPageView box (0 is top)     * @param dpi the DPI of the image     */    private void redrawPartialImage(PDFPage page, float x, float y, float dpi) {        float width = (viewport.getWidth()==0 ? 300 : viewport.getWidth()) * 72/dpi;        float height = (viewport.getHeight()==0 ? 300 : viewport.getHeight()) * 72/dpi;        Rectangle2D rect = PagePanel.getFullPageView(page);        if (x+width > rect.getWidth())   x = (float)rect.getWidth()-x;        if (y+height > rect.getHeight()) y = (float)rect.getHeight()-y;        x += rect.getMinX();        y = (float)(rect.getMinY() + rect.getHeight() - y - height);        Rectangle2D oldview = pagepanel.getView();        Rectangle2D newview = new Rectangle2D.Float(x, y, width, height);        if (page!=pagepanel.getPage() || !PagePanel.equalsRectangle2D(oldview, newview) || Math.abs(dpi - pagepanel.getDPI())>=0.5) {            pagepanel.setPage(page, new Rectangle2D.Float(x, y, width, height), dpi);        }    }    /*    public static void main(final String args[]) throws Exception {        final PDF pdf = new PDF(new PDFReader(new File(args[0])));        final SinglePageDocumentViewport panel = new SinglePageDocumentViewport();        SwingUtilities.invokeLater(new Runnable() {            public void run() {                JFrame frame = new JFrame("BFO");                frame.getContentPane().add("Center", panel);                frame.pack();                frame.setSize(300, 300);                frame.setVisible(true);                panel.pagepanel.setParser(new PDFParser(pdf));            }        });    }    */    private FocusTraversalPolicy createFocusTraversalPolicy() {        return new FocusTraversalPolicy() {            private PDFAnnotation getAnnot(Component comp) {                if (comp instanceof JComponent) {                    return (PDFAnnotation)((JComponent)comp).getClientProperty("pdf.annotation");                } else {                    return null;                }            }            public Component getComponentAfter(Container root, Component comp) {                PDFAnnotation annot = getAnnot(comp);                List annots = getPage().getAnnotations();                Map annotcomponents = pagepanel.getAnnotationComponents();                for (int i=0;i<annots.size()-1;i++) {                    if (annots.get(i)==annot) {                        return (Component)annotcomponents.get(annots.get(i+1));                    }                }                return null;            }            public Component getComponentBefore(Container root, Component comp) {                PDFAnnotation annot = getAnnot(comp);                List annots = getPage().getAnnotations();                Map annotcomponents = pagepanel.getAnnotationComponents();                for (int i=1;i<annots.size();i++) {                    if (annots.get(i)==annot) {                        return (Component)annotcomponents.get(annots.get(i-1));                    }                }                return null;            }            public Component getDefaultComponent(Container root) {                return getFirstComponent(root);            }            public Component getFirstComponent(Container root) {                List l = getPage().getAnnotations();                if (l.size()==0) {                    return null;                } else {                    Map annotcomponents = pagepanel.getAnnotationComponents();                    return (Component)annotcomponents.get(l.get(0));                }            }            public Component getLastComponent(Container root) {                List l = getPage().getAnnotations();                if (l.size()==0) {                    return null;                } else {                    Map annotcomponents = pagepanel.getAnnotationComponents();                    return (Component)annotcomponents.get(l.get(l.size()-1));                }            }        };    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?