singlepagedocumentviewport.java
来自「Java生成PDF Java生成PDF Java生成PDF」· Java 代码 · 共 405 行 · 第 1/2 页
JAVA
405 行
// $Id: SinglePageDocumentViewport.java,v 1.21 2007/11/12 01:11:33 mike Exp $package org.faceless.pdf2.viewer2;import java.awt.*;import java.awt.image.*;import java.awt.event.*;import java.awt.geom.*;import java.awt.print.*;import javax.print.*;import javax.print.attribute.*;import javax.print.attribute.standard.*;import java.io.*;import java.util.*;import java.util.List;import javax.print.*;import javax.swing.*;import javax.swing.border.*;import java.awt.event.MouseEvent;import org.faceless.pdf2.*;import org.faceless.pdf2.Event;/** * A type of {@link DocumentViewport} that displays a single page. The Page can be zoomed * in or out, and if it grows beyond the size of this viewport scrollbars will be displayed. * Zoom levels are translated to DPI (as required by the PagePainter} using the * {@link Toolkit#getScreenResolution} method. * <p><i>This code is copyright the Big Faceless Organization. You're welcome to use, modify and distribute it in any form in your own projects, provided those projects continue to make use of the Big Faceless PDF library.</i></p> * @see DocumentPanel * @since 2.8 */public class SinglePageDocumentViewport extends DocumentViewport{ private final PagePanel pagepanel; private final JPanel viewport; private final JScrollBar sbh, sbv; private PDF pdf; // The PDF... private PDFPage renderingpage; private int maxpixels; private boolean fullimage; /** * Create a new SinglePageDocumentViewporpt */ public SinglePageDocumentViewport() { super(new BorderLayout()); setOpaque(true); setMaxPixels(1500000); pagepanel = new PagePanel(); pagepanel.setViewport(this); viewport = new JPanel(null) { public void paintComponent(Graphics g) { g.setColor(Color.gray); g.fillRect(0,0,getWidth(), getHeight()); g.setColor(Color.black); // Drop shadow Rectangle r = pagepanel.getBounds(); g.fillRect(r.x-1, r.y-1, r.width+2, r.height+2); g.fillRect(r.x+1, r.y+1, r.width+2, r.height+2); } }; viewport.add(pagepanel); Listener listener = new Listener(); sbh = new JScrollBar(JScrollBar.HORIZONTAL); sbh.setMinimum(0); sbh.setBlockIncrement(35); sbh.setUnitIncrement(32); sbh.setVisible(true); sbv = new JScrollBar(JScrollBar.VERTICAL); sbv.setMinimum(0); sbv.setBlockIncrement(32); sbv.setUnitIncrement(32); sbv.setVisible(true); sbh.addAdjustmentListener(listener); sbv.addAdjustmentListener(listener); pagepanel.addPagePanelListener(listener); viewport.addComponentListener(listener); addMouseWheelListener(listener); addMouseListener(listener); pagepanel.addMouseListener(listener); addKeyListener(listener); add(viewport, BorderLayout.CENTER); add(sbh, BorderLayout.SOUTH); add(sbv, BorderLayout.EAST); setFocusTraversalPolicy(createFocusTraversalPolicy()); } public void setRenderingHints(RenderingHints hints) { pagepanel.setRenderingHints(hints); } public void addPagePanelListener(PagePanelListener listener) { pagepanel.addPagePanelListener(listener); } public void removePagePanelListener(PagePanelListener listener) { pagepanel.removePagePanelListener(listener); } public void addPagePanelInteractionListener(PagePanelInteractionListener listener) { pagepanel.addPagePanelInteractionListener(listener); } public void removePagePanelInteractionListener(PagePanelInteractionListener listener) { pagepanel.removePagePanelInteractionListener(listener); } public void setDocumentPanel(DocumentPanel panel) { super.setDocumentPanel(panel); pagepanel.setParser(panel.getParser()); } public PagePanel getPagePanel() { return pagepanel; } public PDFPage getRenderingPage() { return renderingpage; } /** * Set the maximum number of pixels that can be displayed in the full backing * image. If the DPI is such that the image will be more than this number of * pixels, only a partial image is drawn. The default value of 1500000 usually * means the standalone viewer can run in 64MB of heap. */ public void setMaxPixels(int pixels) { this.maxpixels = pixels; } public Dimension getViewportSize() { return viewport.getSize(); } public float getZoom() { return pagepanel.getDPI() / getToolkit().getScreenResolution(); } /** * Return the section of the page returned by {@link #getPage} that's currently * being displayed, in points. Zero is the top of the page, to match the values * supplied to {@link #setPage} */ public Rectangle2D getViewport() { Rectangle2D viewpos = pagepanel.getView(); Rectangle2D fullpos = PagePanel.getFullPageView(pagepanel.getPage()); if (!PagePanel.equalsRectangle2D(viewpos, fullpos)) { return viewpos; } else { float dpi = pagepanel.getDPI(); float width = (float)(viewport.getWidth()/dpi*72); float height = (float)(viewport.getHeight()/dpi*72); if (width < fullpos.getWidth()) { fullpos.setRect(fullpos.getMinX()+sbh.getValue(), fullpos.getMinY(), width, fullpos.getHeight()); } if (height < fullpos.getHeight()) { fullpos.setRect(fullpos.getMinX(), fullpos.getMinY()+sbv.getValue(), fullpos.getWidth(), height); } return fullpos; } } public void setZoom(float zoom) { setPage(pagepanel.getPage(), sbh.getValue(), sbv.getValue(), zoom); } public synchronized void setPage(PDFPage page, double x, double y, double zoom) {// System.out.println("setPage("+(page.getPageNumber()-1)+", "+x+", "+y+", "+zoom+")"); if (zoom<=0 || zoom!=zoom || Math.abs(zoom-getZoom())<=0.005) { zoom = getZoom(); } if (zoom==0) zoom=1; if (x!=x) x = sbh.getValue(); if (y!=y) y = sbv.getValue(); float dpi = (float)(zoom*getToolkit().getScreenResolution()); Rectangle2D fullsize = PagePanel.getFullPageView(page); int pixels = (int)(fullsize.getWidth()*fullsize.getHeight()*dpi/72); int mmax = (int)Math.max(viewport.getWidth()*viewport.getHeight(), maxpixels); renderingpage = page; if (pixels > mmax) { redrawPartialImage(page, (float)x, (float)y, dpi); } else { if (page!=pagepanel.getPage() || Math.abs(dpi-pagepanel.getDPI())>=0.005) { pagepanel.setPage(page, fullsize, dpi); final int ix = (int)x; final int iy = (int)y; pagepanel.addPagePanelListener(new PagePanelListener() { public void pageUpdated(PagePanelEvent event) { if (event.getType()=="redrawn") { sbh.setValue(ix); sbv.setValue(iy); event.getPagePanel().removePagePanelListener(this); } } }); } else { sbh.setValue((int)x); sbv.setValue((int)y); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?