判断PDF是否损坏,PDF合并,PDF加水印,PDF覆盖

package com.harper.util;

import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfReader;

import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.jboss.netty.util.internal.ReusableIterator;

import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
import com.lowagie.text.pdf.PdfWriter;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.PdfPageNumber;
import com.spire.pdf.PdfPageRotateAngle;
import com.spire.pdf.widget.PdfPageCollection;

import play.Logger;
import play.Play;
import sun.misc.BASE64Decoder;

/**
 * 
 * 
 * 判断PDF文件是否损坏
 * 
 * @author Administrator
 *
 */
public class PdfUtil {
	
	/**
	 * 
	 * 判断pdf 是否损坏
	 * 
	 */
	public static boolean check(String file) {
		boolean flag1 = false;
		int n = 0;
		try {
			Document document = new Document(new PdfReader(file).getPageSize(1));
			document.open();
			PdfReader reader = new PdfReader(file);
			n = reader.getNumberOfPages();
			if (n != 0)
				flag1 = true;
			document.close();
		} catch (Exception e) {
			
		}
		return flag1;
	}
	
   
	/**
	 * 
	 * 
	 * 
	 * 如果原PDF不存在或者损坏 那么就不能返回文件路径
	 * 
	 * @param outputFile (添加了sku后输出的文件路径)
	 * @param input 原始PDF文件
	 * @param waterMarkName 添加的文字信息
	 * 
	 */
	public static String setWatermark(String filename, String inputFilePath, String waterMarkName) {		
		String outputfilepath = Play.configuration.getProperty("applicationPath") + "/file/orderprint/skupdf/" + filename + ".pdf";
		File fileout = new File(outputfilepath);
		try {
			
			if(fileout.exists()){
				fileout.delete();
			}
			
			Boolean status = PdfUtil.check(inputFilePath);			
			File file = new File(inputFilePath);
			if(!file.exists() || !status){
				return "";
			}
			
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputfilepath)));			
			PdfReader reader = new PdfReader(inputFilePath);
			PdfStamper stamper = new PdfStamper(reader, bos);			
			int total = reader.getNumberOfPages() + 1;
			PdfContentByte content;
			BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);			
			for (int i = 1; i < total; i++) {				
				content = stamper.getOverContent(i);
				content.beginText();
				content.setColorFill(Color.black);
				content.setFontAndSize(base, 7);
				content.showTextAligned(Element.ALIGN_LEFT, waterMarkName, 4, 2, 0);
				content.endText();
			}
			stamper.close();
		} catch (Exception e) {

		}
		return outputfilepath;
	}
	
	
	/**
	 * 
	 * 传入一个从代理那里下载的文件流, 然后先将此文件流保存成一个文件 名字选择为传入的 "tracking_D" 保证以后如果形成错误后,可以找回原面单进行后台修改
	 * 
	 * 
	 * @param trackingNo
	 * @param labelPdfBytes
	 * @param x x轴  14
	 * @param y y轴(相对于坐标原点(0,0)) 253
	 * @param height 长度 80
	 * @param width 高度120
	 * @return
	 */
	public static byte[] setWatermarkImage(String trackingNo, byte[] labelPdfBytes, int x, int y, int height, int width) {
		try {			
			//先把文件流形成文件
			String fromOtherPdfFile = Play.configuration.getProperty("applicationPath")+"/file/orderprint/pdf/" + trackingNo+"_D" + ".pdf";                    			
			FileUtils.writeByteArrayToFile(new File(fromOtherPdfFile), labelPdfBytes);
			String outputfilepath = Play.configuration.getProperty("applicationPath")+"/file/orderprint/pdf/"+trackingNo+".pdf";
			Boolean status = PdfUtil.check(fromOtherPdfFile);
			if(!status){
				return labelPdfBytes;
			}			
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputfilepath)));			
			PdfReader reader = new PdfReader(fromOtherPdfFile);
			PdfStamper stamper = new PdfStamper(reader, bos);			
			int total = reader.getNumberOfPages() + 1;
			PdfContentByte content;
			BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
			for (int i = 1; i < total; i++) {				
				content = stamper.getOverContent(i);
				Image image = Image.getInstance(Play.configuration.getProperty("applicationPath")+"/file/imgs/white.png");	            
	            image.setAbsolutePosition(x, y); 
	            image.scaleToFit(height, width);
	            content.addImage(image);
	            content.setColorFill(Color.BLACK);
	            content.setFontAndSize(base, 8);
				content.endText();
			}
			stamper.close();
			
			return FileUtil.fileTobyte(outputfilepath);
			
		} catch (Exception e) {
			return labelPdfBytes;
		}
	}
	
	

	/***
	 * 
	 * 合并PDF
	 * 
	 * 
	 * @param files 传入文件路径数组
	 * @param savepath 形成新的文件路径
	 */
	public static void mergePdfFiles(String[] files, String savepath) {
		try {
			String firstPdf = null;
			int index = 0;
			// 第一个不为空的PDF将成为第一页
			while (firstPdf == null) {
				firstPdf = files[index];
			}
			Document document = new Document(
					new PdfReader(files[0]).getPageSize(1));
			PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
			document.open();
			for (int i = 0; i < files.length; i++) {
				if (files[i] != null) {
					File f = new File(files[i]);
					if (f.exists()) {
						PdfReader reader = null;
						try{
							reader = new PdfReader(files[i]);
						}catch (Exception e) {
							Logger.info(files[i]);
							e.printStackTrace();
						}
						if(reader != null) {
							int n = reader.getNumberOfPages();
							for (int j = 1; j <= n; j++) {
								document.newPage();
								PdfImportedPage page = copy.getImportedPage(reader, j);
								copy.addPage(page);
							}
						}
					}
				}
			}
			document.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 图片转换成PDF
	 * 
	 * @param inputFile
	 * @param outFile
	 * @param x 长 812
	 * @param y 宽 1218
	 */
	public static void pngToPdf(String inputFile, String outFile, int x, int y){		
		try {
			Rectangle rect = new Rectangle(x,y);
			Document document = new Document(rect, 0, 0, 0, 0);
			PdfWriter.getInstance(document, new FileOutputStream(outFile));
			document.open();
			Image image = Image.getInstance(inputFile);
			document.add(image);
			document.close();
		} catch (Exception e) {
			e.printStackTrace();
		} 		
	}
	
	/**
	 * 
	 * byte[] zeroLabelPdfBytes = setwaterImageAndSetMark(
				"C:\\Users\\Administrator\\Desktop\\tdw\\", 
				FileUtil.fileTobyte("C:\\Users\\Administrator\\Desktop\\tmp\\D.pdf"), 
				"C:\\Users\\Administrator\\Desktop\\tmp\\white.png", 
				"深圳夏浦物流有限公司", 
				101, 
				165, 
				82, 
				80);
	 * 
	 * 
	 * 
	 * 
	 * 先将不需要的部分用白色的图片给盖住,然后在盖住的地方打上水印也就是文字(这个方法集成了 PDF图片水印,和PDF文字水印的方式,是上面单纯盖图片和在单纯打水印的升级版)
	 * 
	 * 每次只能做一个操作 (不可以同时盖住多个地方) 每次调用这个方法,都会形成将近4个中间文件出来 ,如果不是特别的需求,建议不要使用(单纯使用盖住,或者单纯使用加水印的方式)
	 * 
	 * 如果只需要盖住某个地方 ,那么就可以不用传入水印文字(或者可以使用上面单纯的盖住某一块的方式,效率比较高)
	 * 
	 * 这个方式比上面单纯加水印的方式优点在于,会直接覆盖之前的文字(用了图片进行覆盖,之前的东西看不到了),单纯的加水印的方式, 之前的那些都还会存在,会重叠
	 * 
	 * 
	 * 
	 * @param filePath 需要保存中间文件的文件夹, 这个文件夹到时候可以找到中间环节的文件, 具体转换过程
	 * @param labelPdfBytes 传入的文件流(实体文件形成的文件流,用FileUtils封装的一个方法进行使用转换) 或者直接从代理那里下载的文件流
	 * @param pngFilepath 盖住图片的文件路径(有时候可以是自己设置的一个logo,或者是一个纯色的png图片)
	 * @param mark 在盖上图片的位置加上水印文字
	 * @param x 相对于原点的坐标 x
	 * @param y 相对于原点的坐标y
	 * @param width 图片的宽度
	 * @param height 图片的高度
	 * 
	 * @return 返回一个做了修改后的文件流 这个文件流可以直接形成文件
	 */
	public static byte[] setwaterImageAndSetMark(String filePath, byte[] labelPdfBytes, String pngFilepath, String mark, int x,int y, int width, int height ){
		byte[] endLabelPdfBytes = null;
		try {
			//首先将传入的文件流形成一个文件
			String saveFirstPathAndFileName =filePath + "first_in_" +  UUID.randomUUID() + ".pdf";
			FileUtils.writeByteArrayToFile(new File(saveFirstPathAndFileName), labelPdfBytes);
			//进行加工处理
			String outputFirstfilepathAndFileName =  filePath + "first_out_" + UUID.randomUUID() + ".pdf";
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputFirstfilepathAndFileName)));			
			PdfReader reader = new PdfReader(saveFirstPathAndFileName);
			PdfStamper stamper = new PdfStamper(reader, bos);			
			int total = reader.getNumberOfPages() + 1;
			PdfContentByte content;
			BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
			for (int i = 1; i < total; i++) {				
				content = stamper.getOverContent(i);
				Image image = Image.getInstance(pngFilepath);	            
	            image.setAbsolutePosition(x, y); 
	            image.scaleToFit(height, width);
	            content.addImage(image);
	            content.setColorFill(Color.BLACK);
	            content.setFontAndSize(base, 8);
				content.endText();
			}
			stamper.close();
			
			//已经覆盖上图片的文件流
			endLabelPdfBytes =  FileUtil.fileTobyte(outputFirstfilepathAndFileName);
			
			
			//然后再将第一次形成的文件流 设置一个水印字体
			String saveTwoFilePathAndFileName =  filePath + "two_in_" + UUID.randomUUID() +".pdf";
			FileUtils.writeByteArrayToFile(new File(saveTwoFilePathAndFileName), endLabelPdfBytes);
			
			String outputTwoFilePathAndFileName = filePath + "two_out_" + UUID.randomUUID() +".pdf";
			BufferedOutputStream bosTwo = new BufferedOutputStream(new FileOutputStream(new File(outputTwoFilePathAndFileName)));
					
			PdfReader readerTwo = new PdfReader(saveTwoFilePathAndFileName);
			PdfStamper stamperTWo = new PdfStamper(readerTwo, bosTwo);			
			int totalTwo = readerTwo.getNumberOfPages() + 1;
			PdfContentByte contentSecond;
			BaseFont baseTwo = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);			
			for (int i = 1; i < totalTwo; i++) {				
				contentSecond = stamperTWo.getOverContent(i);
				contentSecond.beginText();
				contentSecond.setColorFill(Color.BLACK);
				contentSecond.setFontAndSize(baseTwo, 7);
				contentSecond.showTextAligned(Element.ALIGN_LEFT, mark, x, y, 0);
				contentSecond.endText();
			}
			stamperTWo.close();
			
			
			endLabelPdfBytes = FileUtil.fileTobyte(outputTwoFilePathAndFileName);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return endLabelPdfBytes;
	}
	
	/**
	 * PDF 旋转 (只能旋转一个PDF)
	 * @param fromFileName
	 * @param toFileName
	 */
	public static String anglePDF(String oldFileName,String angleFileName){
		if(StringUtils.isBlank(oldFileName)){
			return "";
		}
		
		try {
			// 加载PDF文档
			PdfDocument pdf = new PdfDocument();
			pdf.loadFromFile(oldFileName);
			// 获取第一页
			PdfPageBase page = pdf.getPages().get(0);
			// 获取第一页当前的旋转角度
			int rotateAngle = page.getRotation().getValue();
			// 在当前旋转角度的基础上,将第一页顺时针旋转90度(可选0/90/180/270度)
			rotateAngle+=PdfPageRotateAngle.Rotate_Angle_90.getValue();
			page.setRotation((PdfPageRotateAngle.fromValue(rotateAngle)));
			// 保存文档
			pdf.saveToFile(angleFileName);
			
			return angleFileName;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}		
	}
}

 

* $Id: PDFViewer.java,v 1.10 2009-08-07 23:18:33 tomoke Exp $ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package com.sun.pdfview; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.Rectangle2D; import java.awt.print.Book; import java.awt.print.PageFormat; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.awt.Toolkit; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.*; import java.io.IOException; import java.io.RandomAccessFile; import java.net.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.filechooser.FileFilter; import javax.swing.SwingUtilities; import com.sun.pdfview.action.GoToAction; import com.sun.pdfview.action.PDFAction; import java.lang.reflect.InvocationTargetException; /** * A demo PDF Viewer application. */ public class PDFViewer extends JFrame implements KeyListener, TreeSelectionListener, PageChangeListener { public final static String TITLE = "SwingLabs PDF Viewer"; /** The current PDFFile */ PDFFile curFile; /** the name of the current document */ String docName; /** The split between thumbs and page */ JSplitPane split; /** The thumbnail scroll pane */ JScrollPane thumbscroll; /** The thumbnail display */ ThumbPanel thumbs; /** The page display */ PagePanel page; /** The full screen page display, or null if not in full screen mode */ PagePanel fspp; // Thread anim; /** The current page number (starts at 0), or -1 if no page */ int curpage = -1; /** the full screen button */ JToggleButton fullScreenButton; /** the current page number text field */ JTextField pageField; /** the full screen window, or null if not in full screen mode */ FullScreenWindow fullScreen; /** the root of the outline, or null if there is no outline */ OutlineNode outline = null; /** The page format for printing */ PageFormat pformat = PrinterJob.getPrinterJob().defaultPage(); /** true if the thumb panel should exist at all */ boolean doThumb = true; /** flag to indicate when a newly added document has been announced */ Flag docWaiter; /** a thread that pre-loads the next page for faster response */ PagePreparer pagePrep; /** the window containing the pdf outline, or null if one doesn't exist */ JDialog olf; /** the document menu */ JMenu docMenu; /** * utility method to get an icon from the resources of this class * @param name the name of the icon * @return the icon, or null if the icon wasn't found. */ public Icon getIcon(String name) { Icon icon = null; URL url = null; try { url = getClass().getResource(name); icon = new ImageIcon(url); if (icon == null) { System.out.println("Couldn't find " + url); } } catch (Exception e) { System.out.println("Couldn't find " + getClass().getName() + "/" + name); e.printStackTrace(); } return icon; } /// FILE MENU Action openAction = new AbstractAction("Open...") { public void actionPerformed(ActionEvent evt) { doOpen(); } }; Action pageSetupAction = new AbstractAction("Page setup...") { public void actionPerformed(ActionEvent evt) { doPageSetup(); } }; Action printAction = new AbstractAction("Print...", getIcon("gfx/print.gif")) { public void actionPerformed(ActionEvent evt) { doPrint(); } }; Action closeAction = new AbstractAction("Close") { public void actionPerformed(ActionEvent evt) { doClose(); } }; Action quitAction = new AbstractAction("Quit") { public void actionPerformed(ActionEvent evt) { doQuit(); } }; class ZoomAction extends AbstractAction { double zoomfactor = 1.0; public ZoomAction(String name, double factor) { super(name); zoomfactor = factor; } public ZoomAction(String name, Icon icon, double factor) { super(name, icon); zoomfactor = factor; } public void actionPerformed(ActionEvent evt) { doZoom(zoomfactor); } } ZoomAction zoomInAction = new ZoomAction("Zoom in", getIcon("gfx/zoomin.gif"), 2.0); ZoomAction zoomOutAction = new ZoomAction("Zoom out", getIcon("gfx/zoomout.gif"), 0.5); Action zoomToolAction = new AbstractAction("", getIcon("gfx/zoom.gif")) { public void actionPerformed(ActionEvent evt) { doZoomTool(); } }; Action fitInWindowAction = new AbstractAction("Fit in window", getIcon("gfx/fit.gif")) { public void actionPerformed(ActionEvent evt) { doFitInWindow(); } }; class ThumbAction extends AbstractAction implements PropertyChangeListener { boolean isOpen = true; public ThumbAction() { super("Hide thumbnails"); } public void propertyChange(PropertyChangeEvent evt) { int v = ((Integer) evt.getNewValue()).intValue(); if (v <= 1) { isOpen = false; putValue(ACTION_COMMAND_KEY, "Show thumbnails"); putValue(NAME, "Show thumbnails"); } else { isOpen = true; putValue(ACTION_COMMAND_KEY, "Hide thumbnails"); putValue(NAME, "Hide thumbnails"); } } public void actionPerformed(ActionEvent evt) { doThumbs(!isOpen); } } ThumbAction thumbAction = new ThumbAction(); Action fullScreenAction = new AbstractAction("Full screen", getIcon("gfx/fullscrn.gif")) { public void actionPerformed(ActionEvent evt) { doFullScreen((evt.getModifiers() & evt.SHIFT_MASK) != 0); } }; Action nextAction = new AbstractAction("Next", getIcon("gfx/next.gif")) { public void actionPerformed(ActionEvent evt) { doNext(); } }; Action firstAction = new AbstractAction("First", getIcon("gfx/first.gif")) { public void actionPerformed(ActionEvent evt) { doFirst(); } }; Action lastAction = new AbstractAction("Last", getIcon("gfx/last.gif")) { public void actionPerformed(ActionEvent evt) { doLast(); } }; Action prevAction = new AbstractAction("Prev", getIcon("gfx/prev.gif")) { public void actionPerformed(ActionEvent evt) { doPrev(); } }; /** * Create a new PDFViewer based on a user, with or without a thumbnail * panel. * @param useThumbs true if the thumb panel should exist, false if not. */ public PDFViewer(boolean useThumbs) { super(TITLE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { doQuit(); } }); doThumb = useThumbs; init(); } /** * Initialize this PDFViewer by creating the GUI. */ protected void init() { page = new PagePanel(); page.addKeyListener(this); if (doThumb) { split = new JSplitPane(split.HORIZONTAL_SPLIT); split.addPropertyChangeListener(split.DIVIDER_LOCATION_PROPERTY, thumbAction); split.setOneTouchExpandable(true); thumbs = new ThumbPanel(null); thumbscroll = new JScrollPane(thumbs, thumbscroll.VERTICAL_SCROLLBAR_ALWAYS, thumbscroll.HORIZONTAL_SCROLLBAR_NEVER); split.setLeftComponent(thumbscroll); split.setRightComponent(page); getContentPane().add(split, BorderLayout.CENTER); } else { getContentPane().add(page, BorderLayout.CENTER); } JToolBar toolbar = new JToolBar(); toolbar.setFloatable(false); JButton jb; jb = new JButton(firstAction); jb.setText(""); toolbar.add(jb); jb = new JButton(prevAction); jb.setText(""); toolbar.add(jb); pageField = new JTextField("-", 3); // pageField.setEnabled(false); pageField.setMaximumSize(new Dimension(45, 32)); pageField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { doPageTyped(); } }); toolbar.add(pageField); jb = new JButton(nextAction); jb.setText(""); toolbar.add(jb); jb = new JButton(lastAction); jb.setText(""); toolbar.add(jb); toolbar.add(Box.createHorizontalGlue()); fullScreenButton = new JToggleButton(fullScreenAction); fullScreenButton.setText(""); toolbar.add(fullScreenButton); fullScreenButton.setEnabled(true); toolbar.add(Box.createHorizontalGlue()); JToggleButton jtb; ButtonGroup bg = new ButtonGroup(); jtb = new JToggleButton(zoomToolAction); jtb.setText(""); bg.add(jtb); toolbar.add(jtb); jtb = new JToggleButton(fitInWindowAction); jtb.setText(""); bg.add(jtb); jtb.setSelected(true); toolbar.add(jtb); toolbar.add(Box.createHorizontalGlue()); jb = new JButton(printAction); jb.setText(""); toolbar.add(jb); getContentPane().add(toolbar, BorderLayout.NORTH); JMenuBar mb = new JMenuBar(); JMenu file = new JMenu("File"); file.add(openAction); file.add(closeAction); file.addSeparator(); file.add(pageSetupAction); file.add(printAction); file.addSeparator(); file.add(quitAction); mb.add(file); JMenu view = new JMenu("View"); JMenu zoom = new JMenu("Zoom"); zoom.add(zoomInAction); zoom.add(zoomOutAction); zoom.add(fitInWindowAction); zoom.setEnabled(false); view.add(zoom); view.add(fullScreenAction); if (doThumb) { view.addSeparator(); view.add(thumbAction); } mb.add(view); setJMenuBar(mb); setEnabling(); pack(); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); int x = (screen.width - getWidth()) / 2; int y = (screen.height - getHeight()) / 2; setLocation(x, y); if (SwingUtilities.isEventDispatchThread()) { setVisible(true); } else { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { setVisible(true); } }); } catch (InvocationTargetException ie) { // ignore } catch (InterruptedException ie) { // ignore } } } /** * Changes the displayed page, desyncing if we're not on the * same page as a presenter.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值