android打开office资源

本文介绍了如何在Android中利用poi库打开和显示Office资源,包括doc文件的HTML转换展示,以及通过转化成图片展示ppt文件。对于pdf和txt文件,也提供了相应的处理方式。此外,分享了android-poi的源码地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道安卓打开office资源可以用浏览器打开,但是需要翻墙,而iOS打开只需要自带的webview就能打开。真是坑人啊大哭大哭大哭

我找了半天找到poi,然后自己改了下,实现了office资源的展示。下面就为大家来介绍我的思路


工具:eclipse,android-poi.jar

1 .android打开doc资源

思路:把下载下来的doc文档转化为webview支持的html文件,用webview打开

步骤:先下载资源到sd卡里面,拿到路径。可能用到的类有

import org.apache.poi.hwpf.HWPFDocument;

import org.apache.poi.hwpf.converter.PicturesManager;

import org.apache.poi.hwpf.converter.WordToHtmlConverter;

import org.apache.poi.hwpf.usermodel.Picture;

import org.apache.poi.hwpf.usermodel.PictureType;

import org.w3c.dom.Document;

这么几个poi的类

拿到文件路径,用下面的方法
public void convert2Html(String fileName, String outPutFile)
			throws TransformerException, IOException,
			ParserConfigurationException,OutOfMemoryError{
		HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(
				fileName));
		WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
				DocumentBuilderFactory.newInstance().newDocumentBuilder()
						.newDocument());
		// 设置图片路径
		wordToHtmlConverter.setPicturesManager(new PicturesManager() {
			public String savePicture(byte[] content, PictureType pictureType,
					String suggestedName, float widthInches, float heightInches) {
				// 相对html路径
				return suggestedName;
			}
		});
		// 保存图片
		List<Picture> pics = wordDocument.getPicturesTable().getAllPictures();
		File file1 = new File(savePath);
		if (pics != null) {
			for (int i = 0; i < pics.size(); i++) {
				Picture pic = (Picture) pics.get(i);
				try {
					pic.writeImageContent(new FileOutputStream(new File(file1
							.getPath() + "/" + pic.suggestFullFileName())));
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}
			}
		}
		wordToHtmlConverter.processDocument(wordDocument);
		Document htmlDocument = wordToHtmlConverter.getDocument();
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		DOMSource domSource = new DOMSource(htmlDocument);
		StreamResult streamResult = new StreamResult(out);

		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer serializer = tf.newTransformer();
		serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
		serializer.setOutputProperty(OutputKeys.INDENT, "yes");
		serializer.setOutputProperty(OutputKeys.METHOD, "html");
		serializer.transform(domSource, streamResult);
		out.close();
		// 保存html文件
		writeFile(new String(out.toByteArray()), outPutFile);

	}

	// 将html文件保存到sd卡
	public void writeFile(String content, String path) {
		FileOutputStream fos = null;
		BufferedWriter bw = null;
		try {
			File file = new File(path);
			if (!file.exists()) {
				file.createNewFile();
			}
			fos = new FileOutputStream(file);
			bw = new BufferedWriter(new OutputStreamWriter(fos, "utf-8"));
			bw.write(content);
		} catch (FileNotFoundException fnfe) {
			fnfe.printStackTrace();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			try {
				if (bw != null)
					bw.close();
				if (fos != null)
					fos.close();
			} catch (IOException ie) {
			}
		}
	}
filename是文件路径,ouputfile是转化后的文件保存路径。
转化完成后用webview加载本地html即可

// WebView加载显示本地html文件

webView.loadUrl("file://" + savePath + docName + ".html");

现在这个方法支持doc文件,docx文件不支持,还没找到方法。


2.打开ppt文件(这个功能可能有点简单,只是单纯的展示作用)

思路:ppt文件--转化为多张图片--用webview来展示(原因:由于功能需求:做成展示功能,所以ppt里面的东西不能点击,播放声音)

用到的poi的类有

import org.apache.poi.hslf.model.Slide;

import org.apache.poi.hslf.usermodel.SlideShow;


将ppt转换为图片

初始化slide和slideshow

//path文件路径
ppt = new SlideShow(new File(path));
//ppt总页数
		pgsize = ppt.getPageSize();

		slide = ppt.getSlides();

		slideCount = slide.length;

转化png

	/**
	 * 生成图片
	 */

	private void addImageView(final int pos) {
		final Bitmap bmp = Bitmap.createBitmap((int) pgsize.getWidth(), (int) pgsize.getHeight(), Config.RGB_565);
		Canvas canvas = new Canvas(bmp);
		Paint paint = new Paint();
		paint.setColor(android.graphics.Color.WHITE);
		paint.setFlags(Paint.ANTI_ALIAS_FLAG);
		canvas.drawPaint(paint);
		final Graphics2D graphics2d = new Graphics2D(canvas);
		final AtomicBoolean isCanceled = new AtomicBoolean(false);
		// render
		Thread runnable = new Thread() {
			@Override
			public void run() {
				try {
					if(slide==null){
						return;
					}
					slide[pos].draw(graphics2d, isCanceled, handler, pos);
					Message msg = handler.obtainMessage();
					// msg.obj = imageView;
					// imageView.setTag(bmp);
					write(Bitmap2Bytes(bmp), pos);
					msg.what = 3;
					msg.arg1 = pos;
					handler.sendMessage(msg);
					if(bmp!=null&&!bmp.isRecycled()){
						bmp.recycle();
					}
				} catch (Exception e) {
					Message msg = handler.obtainMessage();
					try {
						slide[pos + 1].draw(graphics2d, isCanceled, handler, pos);
					
						// msg.obj = imageView;
						// imageView.setTag(bmp);
						try {
							write(Bitmap2Bytes(bmp), pos + 1);
						} catch (IOException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						msg.what = 3;
						msg.arg1 = pos + 1;
						handler.sendMessage(msg);
						if (bmp != null && !bmp.isRecycled()) {
							bmp.recycle();
						}
					} catch (Exception e2) {
						msg.what = 3;
						msg.arg1 = pos + 1;
						handler.sendMessage(msg);
					}
				} catch (OutOfMemoryError e) {
					// Toast.makeText(getActivity(), "打开异常,请重新打开",
					// Toast.LENGTH_LONG).show();
					System.gc();
				}
			}
		};
		runnable.start();
	}

这个poi有些图片会生成不出来,所以有时候就会缺失,但是大部分的ppt都是能够完整生成出来的。

最后图片在一个file里面,按生成的顺序,里面的排列也是按顺序来的,所以可以直接用webview展示

private void loadWebView() {
		File fiele = new File(pptPath);
		File[] files = fiele.listFiles();
		if (files.length != 0) {
			loadingdialog.dismiss();
			String data = "<html>" + "<body align=center>" +
			getImagesHtml(files) + "</body>" +
			"</html>";
			Log.e("网页html", data);
			mWebView.getSettings().setAllowFileAccess(true);
			mWebView.loadDataWithBaseURL("file://" + pptPath, data, "text/html", "UTF-8", null);
		}
	}

	private String getImagesHtml(File[] file) {
		String data = "";
		for (File file2 : file) {
			data += "<img" + " src=file://" + file2.getAbsolutePath() + " width=" + pgsize.getWidth() + " height="
					+ (pgsize.getHeight() + ScreenSizeUtil.Dp2Px(getActivity(), 48))  + " display:block; margin:0 auto;" + "><br/>";
		}
		return data;
	}




3.打开pdf资源


直接上主代码

package org.ebookdroid.core;

import java.io.File;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

import org.ebookdroid.core.actions.ActionDialogBuilder;
import org.ebookdroid.core.actions.ActionEx;
import org.ebookdroid.core.actions.ActionMethod;
import org.ebookdroid.core.actions.ActionMethodDef;
import org.ebookdroid.core.actions.ActionTarget;
import org.ebookdroid.core.actions.IActionController;
import org.ebookdroid.core.actions.params.EditableValue;
import org.ebookdroid.core.cache.CacheManager;
import org.ebookdroid.core.events.CurrentPageListener;
import org.ebookdroid.core.events.DecodingProgressListener;
import org.ebookdroid.core.log.LogContext;
import org.ebookdroid.core.models.DecodingProgressModel;
import org.ebookdroid.core.models.DocumentModel;
import org.ebookdroid.core.models.ZoomModel;
import org.ebookdroid.core.presentation.OutlineAdapter;
import org.ebookdroid.core.settings.AppSettings;
import org.ebookdroid.core.settings.ISettingsChangeListener;
import org.ebookdroid.core.settings.SettingsManager;
import org.ebookdroid.core.settings.books.BookSettings;
import org.ebookdroid.core.settings.books.Bookmark;
import org.ebookdroid.core.settings.ui.SettingsUI;
import org.ebookdroid.core.touch.IMultiTouchListener;
import org.ebookdroid.core.touch.TouchManager;
import org.ebookdroid.core.touch.TouchManagerView;
import org.ebookdroid.core.utils.AndroidVersion;
import org.ebookdroid.core.utils.PathFromUri;
import org.ebookdroid.core.views.PageViewZoomControls;
import org.ebookdroid.core.views.ViewEffects;
import org.ebookdroid.utils.LengthUtils;
import org.ebookdroid.utils.StringUtils;


import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.text.Editable;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

@ActionTarget(
// action list
actions = {
		// start
		@ActionMethodDef(id = R.id.actions_addBookmark, method = "addBookmark"),
		@ActionMethodDef(id = R.id.mainmenu_close, method = "closeActivity"),
		@ActionMethodDef(id = R.id.actions_gotoOutlineItem, method = "gotoOutlineItem"),
		@ActionMethodDef(id = R.id.actions_redecodingWithPassord, method = "redecodingWithPassord"),
		@ActionMethodDef(id = R.id.mainmenu_settings, method = "showAppSettings"),
		@ActionMethodDef(id = R.id.mainmenu_bookmark, method = "showBookmarkDialog"),
		@ActionMethodDef(id = R.id.mainmenu_booksettings, method = "showBookSettings"),
		@ActionMethodDef(id = R.id.mainmenu_goto_page, method = "showDialog"),
		@ActionMethodDef(id = R.id.mainmenu_outline, method = "showOutline"),
		@ActionMethodDef(id = R.id.mainmenu_nightmode, method = "toggleNightMode"),
		@ActionMethodDef(id = R.id.mainmenu_zoom, method = "toggleControls"),
		@ActionMethodDef(id = R.id.mainmenu_thumbnail, method = "setCurrentPageAsThumbnail"),
		@ActionMethodDef(id = R.id.mainmenu_about, method = "showAbout"),
		@ActionMethodDef(id = R.id.actions_toggleTouchManagerView, method = "toggleControls"),
		@ActionMethodDef(id = R.id.actions_openOptionsMenu, method = "openOptionsMenu")
// finish
})
public abstract class BaseViewerActivity extends AbstractActionActivity
		implements IViewerActivity, DecodingProgressListener,
		CurrentPageListener, ISettingsChangeListener {

	public static final LogContext LCTX = LogContext.ROOT.lctx("Core");

	private static final String E_MAIL_ATTACHMENT = "[E-mail Attachment]";

	private static final int DIALOG_GOTO = 0;

	public static final DisplayMetrics DM = new DisplayMetrics();

	private IDocumentView view;

	private final AtomicReference<IDocumentViewController> ctrl = new AtomicReference<IDocumentViewController>(
			new EmptyContoller());

	private Toast pageNumberToast;

	private ZoomModel zoomModel;

	private PageViewZoomControls zoomControls;

	private CustormFramLayout frameLayout;

	private DecodingProgressModel progressModel;

	private DocumentModel documentModel;

	private String currentFilename;

	private TouchManagerView touchView;

	private boolean menuClosedCalled;

	private boolean temporaryBook;

	private IMultiTouchListener mtl;

	private UserApp userApp;

	private String url;

	private String isTasking;
	private boolean isTemp;
	private String code;
	MsgReceiver msgReceiver;
	private ActionBar actionBar;
	private Boolean actionBarIsShow = true;
	// 是否为服务启动PDF查看器
	private Boolean commondServiceStart = false;

	private RelativeLayout allRelayout;

	private boolean isLessonBefore = false;

	/**
	 * Instantiates a new base viewer activity.
	 */
	public BaseViewerActivity() {
		super();
	}
private boolean isOpenByService = false;
	/**
	 * Called when the activity is first created.
	 */
	@Override
	public void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindowManager().getDefaultDisplay().getMetrics(DM);
		SettingsManager.addListener(this);
		Intent intent = getIntent();// 获取意图
		url = intent.getData().toString();
		openUtils = new OpenFileUtils(this);
		// 11
		// actions.createAction(R.id.mainmenu_goto_page, new
		// Constant("dialogId", DIALOG_GOTO));
		allRelayout = new RelativeLayout(this);
		frameLayout = createMainContainer();
		view = new BaseDocumentView(this);
		
		userApp = UserApp.getInstance();
		isTasking = intent.getStringExtra("isTasking");
		isTemp = intent.getBooleanExtra("isTemp", false);
		code = intent.getStringExtra("code");
		isOpenByService =intent.getBooleanExtra("isSyncOpen", false);
		isLessonBefore = intent.getBooleanExtra("isLessonBefore", false);
		actionBar = getActionBar();
		actionBar.hide();
		actions.createAction(R.id.mainmenu_zoom).putValue("view",
				getZoomControls());
		actions.createAction(R.id.actions_toggleTouchManagerView).putValue(
				"view", getTouchView());
		NoteButtonWindow.ACTIVITY_MAP.put(this.getClass().getName(), this);
		initActivity();
		initView();
		// 动态注册广播接收器
		msgReceiver = new MsgReceiver();
		IntentFilter intentFilter = new IntentFilter();
		// 动态注册Action
		intentFilter.addAction("com.iteach2.app.COMMOND");
		registerReceiver(msgReceiver, intentFilter);
	}

	@Override
	protected void onPause() {
		super.onPause();

		SettingsManager.storeBookSettings();
	}

	/**
	 * 广播接收器
	 * 
	 * @author len
	 * 
	 */
	public class MsgReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			Boolean sycn = intent.getBooleanExtra("sycn", false);
			Boolean isSync = intent.getBooleanExtra("cancelSync", false);
			try {
				if (sycn) {
					// 获取广播 显示文档Y轴
					frameLayout.setSync(true);
					commondServiceStart = true;
					String y = intent.getStringExtra("pdfPageY");
					if (y == null)
						y = "0";
					view.scrollTo(0, Integer.parseInt(y));
					back_btn.setVisibility(View.INVISIBLE);
					layout.setVisibility(View.INVISIBLE);

				} else {
					// 判断是否为服务启动的activity true:销毁
					frameLayout.setSync(false);
					commondServiceStart = false;
					back_btn.setVisibility(View.VISIBLE);
					if(isSync&&isOpenByService){
						 BaseViewerActivity.this.finish();
					}
					
				}
			} catch (Exception e) {
			}

		}

	}

	private View initTitleView() {
		View view = LayoutInflater.from(this).inflate(R.layout.newtitle_layout,
				null);
		return view;
	}

	@Override
	protected void onDestroy() {
		if (documentModel != null) {
			documentModel.recycle();
			documentModel = null;
		}
		if (temporaryBook) {
			CacheManager.clear(E_MAIL_ATTACHMENT);
		}
		SettingsManager.removeListener(this);
		StudentCommentService.syncPdf = false;
		unregisterReceiver(msgReceiver);
		super.onDestroy();
	}

	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		String code = intent.getStringExtra("code");
		if (this.code == null || !this.code.equals(code)) {
			toPdf(intent);
		}

	}

	private void initActivity() {
		final AppSettings oldSettings = null;
		if (SettingsManager.getAppSettings() == null) {
			SettingsManager.init(this);
		}
		final AppSettings newSettings = SettingsManager.getAppSettings();

		final AppSettings.Diff diff = new AppSettings.Diff(oldSettings,
				newSettings);
		this.onAppSettingsChanged(oldSettings, newSettings, diff);
	}

	private Button back_btn;
	private DecodeService decodeService;
	private String fileName;
	private LinearLayout linearLayout;

	private void initView() {
		View title_view = initTitleView();
		RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
				FrameLayout.LayoutParams.MATCH_PARENT, ScreenSizeUtil.Dp2Px(
						this, 48));
		title_view.setLayoutParams(p);
		view.getView().setLayoutParams(
				new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
						ViewGroup.LayoutParams.FILL_PARENT));
		frameLayout.addView(view.getView());
		frameLayout.addView(getZoomControls());
		frameLayout.addView(getTouchView());
		frameLayout.setLayoutParams(new RelativeLayout.LayoutParams(
				android.widget.RelativeLayout.LayoutParams.FILL_PARENT,
				android.widget.RelativeLayout.LayoutParams.FILL_PARENT));
		allRelayout.addView(frameLayout);
		LinearLayout.LayoutParams p1 = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
		allRelayout.setLayoutParams(p1);
		linearLayout = new LinearLayout(this);
		linearLayout.setOrientation(LinearLayout.VERTICAL);
		linearLayout.addView(title_view);
		linearLayout.addView(allRelayout);
		if (isLessonBefore) {
			initFeed();
			initFeedListView();
		}
		initLayout();
		setContentView(linearLayout);
		back_btn = (Button) title_view.findViewById(R.id.openfile_back_btn);
		decodeService = createDecodeService();
		documentModel = new DocumentModel(decodeService);
		documentModel.addListener(BaseViewerActivity.this);
		progressModel = new DecodingProgressModel();
		progressModel.addListener(BaseViewerActivity.this);
		toPdf(getIntent());
		back_btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				BaseViewerActivity.this.finish();
			}
		});
	}

	/**
	 * 增加收藏控件
	 */
	private void initFeed() {/*
							 * CheckBox image = (CheckBox)
							 * getLayoutInflater().from
							 * (this).inflate(R.layout.collect_checkbox, null);
							 * RelativeLayout.LayoutParams p = new
							 * RelativeLayout
							 * .LayoutParams(RelativeLayout.LayoutParams
							 * .WRAP_CONTENT,
							 * RelativeLayout.LayoutParams.WRAP_CONTENT);
							 * p.rightMargin = ScreenSizeUtil.Dp2Px(this, 20);
							 * p.topMargin = ScreenSizeUtil.Dp2Px(this, 20);
							 * p.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
							 * image.setLayoutParams(p);
							 * image.setBackgroundResource
							 * (R.drawable.collext_checkbox_bg); //分割线 View
							 * fengeView = new View(this);
							 * RelativeLayout.LayoutParams fp = new
							 * RelativeLayout
							 * .LayoutParams(ScreenSizeUtil.Dp2Px(this, 1),
							 * RelativeLayout.LayoutParams.MATCH_PARENT);
							 * fp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
							 * fengeView.setBackgroundColor(Color.BLACK);
							 * fengeView.setLayoutParams(fp);
							 * frameLayout.addView(image);
							 * frameLayout.addView(fengeView);
							 */
	}

	/**
	 * 增加反馈列表
	 */
	private void initFeedListView() {/*
									 * // LinearLayout feedlistlayout =
									 * (LinearLayout)
									 * getLayoutInflater().from(this) //
									 * .inflate(R.layout.feedlistview_layout,
									 * null); RelativeLayout.LayoutParams p =
									 * new
									 * RelativeLayout.LayoutParams(ScreenSizeUtil
									 * .Dp2Px(this, 150),
									 * RelativeLayout.LayoutParams
									 * .MATCH_PARENT);
									 * p.addRule(RelativeLayout.ALIGN_PARENT_RIGHT
									 * ); feedlistlayout.setLayoutParams(p);
									 * RelativeLayout.LayoutParams layoutParams
									 * =
									 * (android.widget.RelativeLayout.LayoutParams
									 * ) frameLayout.getLayoutParams();
									 * layoutParams
									 * .rightMargin=ScreenSizeUtil.Dp2Px(this,
									 * 150);
									 * feedlistlayout.setBackgroundColor(Color
									 * .WHITE); TextView feedText = (TextView)
									 * feedlistlayout.findViewById(R.id.
									 * openfile_fankui_record_textView);
									 * ListView listView = (ListView)
									 * feedlistlayout
									 * .findViewById(R.id.openfiles_fankui_listView
									 * ); allRelayout.addView(feedlistlayout);
									 */
	}

	private OpenFileUtils openUtils;
	RelateLayout layout;

	private void initLayout() {
		layout = new RelateLayout(this);
		RelativeLayout.LayoutParams pa = new RelativeLayout.LayoutParams(
				RelativeLayout.LayoutParams.WRAP_CONTENT,
				RelativeLayout.LayoutParams.MATCH_PARENT);
		pa.rightMargin = -ScreenSizeUtil.Dp2Px(this, 200);
		pa.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
		layout.setLayoutParams(pa);
		layout.setType(getIntent().getIntExtra("fileType", 1));
		layout.setOnitemClickListener(new onItemClickListener() {

			@Override
			public void goToRescourse(ResouceAdapterJson item) {
				finish();
				openUtils.openFile(item.getId(), item.getType(), item.getPath());
			}
		});
		allRelayout.addView(layout);
	}

	private void toPdf(Intent intent) {
		Uri data = intent.getData();
		if (getIntent().getScheme().equals("content")) {
			temporaryBook = true;
			fileName = E_MAIL_ATTACHMENT;
			CacheManager.clear(fileName);
		} else {
			fileName = PathFromUri.retrieve(getContentResolver(), data);
		}
		SettingsManager.init(fileName);
		SettingsManager.applyBookSettingsChanges(null,
				SettingsManager.getBookSettings(), null);
		startDecoding(decodeService, fileName, "");
	}

	private TouchManagerView getTouchView() {
		if (touchView == null) {
			// pdfView 工具类
			touchView = new TouchManagerView(this);
		}
		return touchView;
	}

	// pdf解码(加载)
	private void startDecoding(final DecodeService decodeService,
			final String fileName, final String password) {
		view.getView()
				.post(new BookLoadTask(decodeService, fileName, password));
	}

	// 输入密码
	private void askPassword(final DecodeService decodeService,
			final String fileName) {
		setContentView(R.layout.password);
		final Button ok = (Button) findViewById(R.id.pass_ok);

		ok.setOnClickListener(actions
				.getOrCreateAction(R.id.actions_redecodingWithPassord)
				.putValue("decodeService", decodeService)
				.putValue("fileName", fileName));

		final Button cancel = (Button) findViewById(R.id.pass_cancel);
		cancel.setOnClickListener(actions
				.getOrCreateAction(R.id.mainmenu_close));
	}

	// 重新解码
	@ActionMethod(ids = R.id.actions_redecodingWithPassord)
	public void redecodingWithPassord(final ActionEx action) {
		final EditText te = (EditText) findViewById(R.id.pass_req);
		final DecodeService decodeService = action
				.getParameter("decodeService");
		final String fileName = action.getParameter("fileName");

		startDecoding(decodeService, fileName, te.getText().toString());
	}

	// 显示错误信息
	private void showErrorDlg(final String msg) {
		setContentView(R.layout.error);
		final TextView errortext = (TextView) findViewById(R.id.error_text);
		if (msg != null && msg.length() > 0) {
			errortext.setText(msg);
		} else {
			errortext.setText("Unexpected error occured!");
		}
		final Button cancel = (Button) findViewById(R.id.error_close);
		finish();
	}

	// 切换文档
	@Override
	public IDocumentViewController switchDocumentController() {
		try {
			final BookSettings bs = SettingsManager.getBookSettings();

			final IDocumentViewController newDc = bs.viewMode.create(this);
			final IDocumentViewController oldDc = ctrl.getAndSet(newDc);

			getZoomModel().removeListener(oldDc);
			getZoomModel().addListener(newDc);

			return newDc;
		} catch (final Throwable e) {
			throw new RuntimeException(e);
		}
	}

	// pdf解码(加载)进度条
	@Override
	public void decodingProgressChanged(final int currentlyDecoding) {
		runOnUiThread(new Runnable() {

			@Override
			public void run() {
				try {
					setProgressBarIndeterminateVisibility(false);
					getWindow().setFeatureInt(
							Window.FEATURE_INDETERMINATE_PROGRESS,
							currentlyDecoding == 0 ? 10000 : currentlyDecoding);
				} catch (final Throwable e) {
				}
			}
		});
	}

	@Override
	public void currentPageChanged(final PageIndex oldIndex,
			final PageIndex newIndex) {
		final int pageCount = documentModel.getPageCount();
		String prefix = "";

		if (pageCount > 0) {
			final String pageText = (newIndex.viewIndex + 1) + "/" + pageCount;
			if (SettingsManager.getAppSettings().getPageInTitle()) {
				prefix = "(" + pageText + ") ";
			} else {
				if (pageNumberToast != null) {
					pageNumberToast.setText(pageText);
				} else {
					pageNumberToast = Toast.makeText(this, pageText, 300);
				}
				pageNumberToast.setGravity(Gravity.TOP | Gravity.LEFT, 0, 0);
				pageNumberToast.show();
			}
		}

		getWindow().setTitle(prefix + currentFilename);
		SettingsManager.currentPageChanged(oldIndex, newIndex);
	}

	private void setWindowTitle() {
		currentFilename = LengthUtils.safeString(getIntent().getData()
				.getLastPathSegment(), E_MAIL_ATTACHMENT);
		currentFilename = StringUtils.cleanupTitle(currentFilename);
		getWindow().setTitle(currentFilename);
	}

	@Override
	protected void onPostCreate(final Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		setWindowTitle();
	}

	private PageViewZoomControls getZoomControls() {
		if (zoomControls == null) {
			zoomControls = new PageViewZoomControls(this, getZoomModel());
			zoomControls.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
		}
		return zoomControls;
	}

	private CustormFramLayout createMainContainer() {
		return new CustormFramLayout(this);
	}

	protected abstract DecodeService createDecodeService();

	/**
	 * Called on creation options menu
	 * 
	 * @param menu
	 *            the main menu
	 * @return true, if successful
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 */
	public boolean sync = false;
	TextView control_close;

	public Thread thread;
	public String SYCN_WAIT = "START";

	@Override
	protected void onResume() {

		super.onResume();
	}

	@Override
	protected void onStop() {
		super.onStop();
	}

	@Override
	public boolean onMenuOpened(final int featureId, final Menu menu) {
		getDocView().changeLayoutLock(true);
		getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		return super.onMenuOpened(featureId, menu);
	}

	@Override
	public void onPanelClosed(final int featureId, final Menu menu) {
		menuClosedCalled = false;
		super.onPanelClosed(featureId, menu);
		if (!menuClosedCalled) {
			onOptionsMenuClosed(menu);
		}
	}

	@Override
	public void onOptionsMenuClosed(final Menu menu) {
		menuClosedCalled = true;
		final Window w = getWindow();
		if (SettingsManager.getAppSettings().getFullScreen()) {
			w.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
					WindowManager.LayoutParams.FLAG_FULLSCREEN);
		} else {
			w.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		}
		view.changeLayoutLock(false);
	}

	@ActionMethod(ids = R.id.actions_openOptionsMenu)
	public void openOptionsMenu(final ActionEx action) {
		if (!getDocView().isLayoutLocked()) {
			this.openOptionsMenu();
		}
	}

	@ActionMethod(ids = R.id.actions_gotoOutlineItem)
	public void gotoOutlineItem(final ActionEx action) {
		final Integer item = action
				.getParameter(IActionController.DIALOG_ITEM_PROPERTY);
		final List<OutlineLink> outline = action.getParameter("outline");

		final String link = outline.get(item).getLink();
		if (link.startsWith("#")) {
			int pageNumber = 0;
			try {
				pageNumber = Integer.parseInt(link.substring(1)
						.replace(" ", ""));
			} catch (final Exception e) {
				pageNumber = 0;
			}
			if (pageNumber < 1 || pageNumber > documentModel.getPageCount()) {
				Toast.makeText(
						getApplicationContext(),
						getResources()
								.getString(
										R.string.error_page_out_of_rande,
										documentModel.getDecodeService()
												.getPageCount()), 2000).show();
				return;
			}
			getDocumentController().goToPage(pageNumber - 1);
		} else if (link.startsWith("http:")) {
			final Intent i = new Intent(Intent.ACTION_VIEW);
			i.setData(Uri.parse(link));
			startActivity(i);
		}
	}

	@ActionMethod(ids = R.id.mainmenu_outline)
	public void showOutline(final ActionEx action) {
		final List<OutlineLink> outline = documentModel.getDecodeService()
				.getOutline();
		if ((outline != null) && (outline.size() > 0)) {
			final AlertDialog.Builder builder = new AlertDialog.Builder(this);
			builder.setTitle(R.string.outline_title);
			builder.setAdapter(new OutlineAdapter(this, outline),
					actions.getOrCreateAction(R.id.actions_gotoOutlineItem)
							.putValue("outline", outline));
			final AlertDialog alert = builder.create();
			alert.show();
		} else {
			Toast.makeText(getApplicationContext(), R.string.outline_missed,
					Toast.LENGTH_SHORT).show();
		}
	}

	@ActionMethod(ids = R.id.mainmenu_goto_page)
	public void showDialog(final ActionEx action) {
		final Integer dialogId = action.getParameter("dialogId");
		showDialog(dialogId);
	}

	@ActionMethod(ids = R.id.mainmenu_booksettings)
	public void showBookSettings(final ActionEx action) {
		SettingsUI.showBookSettings(this,
				SettingsManager.getBookSettings().fileName);
	}

	@ActionMethod(ids = R.id.mainmenu_settings)
	public void showAppSettings(final ActionEx action) {
		SettingsUI.showAppSettings(this);
	}

	@ActionMethod(ids = R.id.mainmenu_nightmode)
	public void toggleNightMode(final ActionEx action) {
		SettingsManager.getAppSettings().switchNightMode();
		getDocumentController().toggleNightMode(
				SettingsManager.getAppSettings().getNightMode());
	}

	@ActionMethod(ids = R.id.mainmenu_thumbnail)
	public void setCurrentPageAsThumbnail(final ActionEx action) {
		final Page page = getDocumentModel().getCurrentPageObject();
		if (page != null) {
			getDocumentModel().createBookThumbnail(
					SettingsManager.getBookSettings(), page, true);
		}
	}

	@ActionMethod(ids = R.id.mainmenu_bookmark)
	public void showBookmarkDialog(final ActionEx action) {
		final int page = getDocumentModel().getCurrentViewPageIndex();

		final String message = getString(R.string.add_bookmark_name);

		final EditText input = new EditText(this);
		input.setText(getString(R.string.text_page) + " " + (page + 1));
		input.selectAll();

		final ActionDialogBuilder builder = new ActionDialogBuilder(actions);
		builder.setTitle(R.string.menu_add_bookmark).setMessage(message)
				.setView(input);
		builder.setPositiveButton(R.id.actions_addBookmark, new EditableValue(
				"input", input));
		builder.setNegativeButton().show();
	}

	@ActionMethod(ids = R.id.actions_addBookmark)
	public void addBookmark(final ActionEx action) {
		final Editable value = action.getParameter("input");
		final String name = value.toString();
		final BookSettings bs = SettingsManager.getBookSettings();
		bs.bookmarks.add(new Bookmark(name, getDocumentModel()
				.getCurrentIndex(), 0, 0));
		SettingsManager.edit(bs).commit();
	}

	@Override
	protected Dialog onCreateDialog(final int id) {
		switch (id) {
		case DIALOG_GOTO:
			return new GoToPageDialog(this);
		}
		return null;
	}

	/**
	 * Gets the zoom model.
	 * 
	 * @return the zoom model
	 */
	@Override
	public ZoomModel getZoomModel() {
		if (zoomModel == null) {
			zoomModel = new ZoomModel();
		}
		return zoomModel;
	}

	@Override
	public IMultiTouchListener getMultiTouchListener() {
		if (mtl == null) {
			mtl = new IMultiTouchListener() {

				@Override
				public void onTwoFingerPinchEnd() {
					getZoomModel().commit();
				}

				@Override
				public void onTwoFingerPinch(float oldDistance,
						float newDistance) {
					zoomModel.setZoom(zoomModel.getZoom() * newDistance
							/ oldDistance);

				}

				@Override
				public void onTwoFingerTap() {
					Toast.makeText(BaseViewerActivity.this, "TWO FINGER TAP", 0);
				}

			};
		}
		return mtl;
	}

	@Override
	public DecodeService getDecodeService() {
		return documentModel != null ? documentModel.getDecodeService() : null;
	}

	/**
	 * Gets the decoding progress model.
	 * 
	 * @return the decoding progress model
	 */
	@Override
	public DecodingProgressModel getDecodingProgressModel() {
		return progressModel;
	}

	@Override
	public DocumentModel getDocumentModel() {
		return documentModel;
	}

	@Override
	public IDocumentViewController getDocumentController() {
		return ctrl.get();
	}

	@Override
	public Context getContext() {
		return this;
	}

	@Override
	public IDocumentView getDocView() {
		return view;
	}

	@Override
	public Activity getActivity() {
		return this;
	}

	@Override
	public IActionController<?> getActionController() {
		return actions;
	}

	@ActionMethod(ids = { R.id.mainmenu_zoom,
			R.id.actions_toggleTouchManagerView })
	public void toggleControls(final ActionEx action) {
		final View view = action.getParameter("view");
		ViewEffects.toggleControls(view);
	}

	@Override
	public final boolean dispatchKeyEvent(final KeyEvent event) {
		if (getDocumentController().dispatchKeyEvent(event)) {
			return true;
		}

		switch (event.getKeyCode()) {
		case KeyEvent.KEYCODE_BACK:
			if (event.getRepeatCount() == 0) {
				closeActivity(null);
			}
			return true;
		default:
			return super.dispatchKeyEvent(event);
		}
	}

	@ActionMethod(ids = R.id.mainmenu_close)
	public void closeActivity(final ActionEx action) {
		if (documentModel != null) {
			documentModel.recycle();
			documentModel = null;
		}
		if (temporaryBook) {
			CacheManager.clear(E_MAIL_ATTACHMENT);
			SettingsManager.removeCurrentBookSettings();
		} else {
			SettingsManager.clearCurrentBookSettings();
		}
		finish();
	}

	@Override
	public void onAppSettingsChanged(final AppSettings oldSettings,
			final AppSettings newSettings, final AppSettings.Diff diff) {
		if (diff.isRotationChanged()) {
			setRequestedOrientation(newSettings.getRotation().getOrientation());
		}

		if (diff.isFullScreenChanged() && !AndroidVersion.is3x) {
			final Window window = getWindow();
			if (newSettings.getFullScreen()) {
				window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
						WindowManager.LayoutParams.FLAG_FULLSCREEN);
			} else {
				window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
			}
		}

		if (diff.isShowTitleChanged() && diff.isFirstTime()) {
			final Window window = getWindow();
			try {
				if (!newSettings.getShowTitle()) {
					window.requestFeature(Window.FEATURE_NO_TITLE);
				} else {
					// Android 3.0+ you need both progress!!!
					window.requestFeature(Window.FEATURE_PROGRESS);
					window.requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
					setProgressBarIndeterminate(true);
				}
			} catch (final Throwable th) {
				LCTX.e("Error on requestFeature call: " + th.getMessage());
			}
		}
		if (diff.isKeepScreenOnChanged()) {
			view.getView().setKeepScreenOn(newSettings.isKeepScreenOn());
		}

		if (diff.isNightModeChanged() && !diff.isFirstTime()) {
			getDocumentController().toggleNightMode(newSettings.getNightMode());
		}
		TouchManager.applyOldStyleSettings(newSettings);
	}

	@Override
	public void onBookSettingsChanged(final BookSettings oldSettings,
			final BookSettings newSettings, final BookSettings.Diff diff,
			final AppSettings.Diff appDiff) {

		boolean redrawn = false;
		if (diff.isViewModeChanged() || diff.isSplitPagesChanged()
				|| diff.isCropPagesChanged()) {
			redrawn = true;
			final IDocumentViewController newDc = switchDocumentController();
			if (!diff.isFirstTime()) {
				newDc.init(null);
				newDc.show();
			}
		}

		if (diff.isFirstTime()) {
			getZoomModel().initZoom(newSettings.getZoom());
		}

		final IDocumentViewController dc = getDocumentController();
		if (diff.isPageAlignChanged()) {
			dc.setAlign(newSettings.pageAlign);
		}

		if (diff.isAnimationTypeChanged()) {
			dc.updateAnimationType();
		}

		if (!redrawn && appDiff != null) {
			if (appDiff.isMaxImageSizeChanged()
					|| appDiff.isPagesInMemoryChanged()
					|| appDiff.isDecodeModeChanged()) {
				dc.updateMemorySettings();
			}
		}

		final DocumentModel dm = getDocumentModel();
		if (dm != null) {
			currentPageChanged(PageIndex.NULL, dm.getCurrentIndex());
		}
	}

	final class BookLoadTask extends AsyncTask<String, String, Exception>
			implements IBookLoadTask, Runnable {

		private final DecodeService m_decodeService;
		private String m_fileName;
		private String m_password;
		private ProgressDialog progressDialog;

		public BookLoadTask(final DecodeService decodeService,
				final String fileName, final String password) {
			m_decodeService = decodeService;
			m_fileName = fileName;
			m_password = password;
		}

		@Override
		public void run() {
			execute(" ");
		}

		@Override
		protected void onPreExecute() {
			LCTX.d("onPreExecute(): start");
			try {
				final String message = getString(R.string.msg_loading);
				progressDialog = ProgressDialog.show(BaseViewerActivity.this,
						"", message, true);
			} catch (final Throwable th) {
				LCTX.e("Unexpected error", th);
			} finally {
				LCTX.d("onPreExecute(): finish");
			}
		}

		@Override
		protected Exception doInBackground(final String... params) {
			LCTX.d("doInBackground(): start");
			try {
				if (getIntent().getScheme().equals("content")) {
					final File tempFile = CacheManager
							.createTempFile(getIntent().getData());
					m_fileName = tempFile.getAbsolutePath();
				}
				getDocView().waitForInitialization();
				m_decodeService.open(m_fileName, m_password);
				getDocumentController().init(this);
				return null;
			} catch (final Exception e) {
				LCTX.e(e.getMessage(), e);
				return e;
			} catch (final Throwable th) {
				LCTX.e("Unexpected error", th);
				return new Exception(th.getMessage());
			} finally {
				LCTX.d("doInBackground(): finish");
			}
		}

		@Override
		protected void onPostExecute(final Exception result) {
			LCTX.d("onPostExecute(): start");
			try {
				if (result == null) {
					getDocumentController().show();

					final DocumentModel dm = getDocumentModel();
					currentPageChanged(PageIndex.NULL, dm.getCurrentIndex());
					setProgressBarIndeterminateVisibility(false);

					progressDialog.dismiss();
				} else {
					progressDialog.dismiss();

					final String msg = result.getMessage();
					if ("PDF needs a password!".equals(msg)) {
						askPassword(m_decodeService, m_fileName);
					} else {
						showErrorDlg(msg);
					}
				}
			} catch (final Throwable th) {
				LCTX.e("Unexpected error", th);
			} finally {
				LCTX.d("onPostExecute(): finish");
			}
		}

		@Override
		public void setProgressDialogMessage(final int resourceID,
				final Object... args) {
			final String message = getString(resourceID, args);
			publishProgress(message);
		}

		@Override
		protected void onProgressUpdate(final String... values) {
			if (values != null && values.length > 0) {
				progressDialog.setMessage(values[0]);
			}
		}

	}

	private class EmptyContoller implements IDocumentViewController {

		@Override
		public void zoomChanged(final float newZoom, final float oldZoom) {
		}

		@Override
		public void commitZoom() {
		}

		@Override
		public void goToPage(final int page) {
		}

		@Override
		public void invalidatePageSizes(final InvalidateSizeReason reason,
				final Page changedPage) {
		}

		@Override
		public int getFirstVisiblePage() {
			return 0;
		}

		@Override
		public int calculateCurrentPage(final ViewState viewState) {
			return 0;
		}

		@Override
		public int getLastVisiblePage() {
			return 0;
		}

		@Override
		public void verticalConfigScroll(final int i) {
		}

		@Override
		public void redrawView() {
		}

		@Override
		public void redrawView(final ViewState viewState) {
		}

		@Override
		public void setAlign(final PageAlign byResValue) {
		}

		@Override
		public IViewerActivity getBase() {
			return BaseViewerActivity.this;
		}

		@Override
		public IDocumentView getView() {
			return view;
		}

		@Override
		public void updateAnimationType() {
		}

		@Override
		public void updateMemorySettings() {
		}

		@Override
		public void drawView(final Canvas canvas, final ViewState viewState) {
		}

		@Override
		public boolean onLayoutChanged(final boolean layoutChanged,
				final boolean layoutLocked, final Rect oldLaout,
				final Rect newLayout) {
			return false;
		}

		@Override
		public Rect getScrollLimits() {
			return new Rect(0, 0, 0, 0);
		}

		@Override
		public boolean onTouchEvent(final MotionEvent ev) {
			return false;
		}

		@Override
		public void onScrollChanged(final int newPage, final int direction) {
		}

		@Override
		public boolean dispatchKeyEvent(final KeyEvent event) {
			return false;
		}

		@Override
		public ViewState updatePageVisibility(final int newPage,
				final int direction, final float zoom) {
			return new ViewState(this);
		}

		@Override
		public void show() {
		}

		@Override
		public final void init(final IBookLoadTask task) {
		}

		@Override
		public void pageUpdated(final int viewIndex) {
		}

		@Override
		public void toggleNightMode(boolean nightMode) {
		}
	}

	@Override
	public void onBackPressed() {
		finish();
		overridePendingTransition(R.anim.in_from_left, R.anim.out_of_right);
		unregisterReceiver(msgReceiver);
		super.onBackPressed();
	}

}
这个可能长,这是找的第三方的,主代码就是解码和topdf这个方法中,稍后会贴上这pdf的源代码

启动这块的代码为

	Uri uri = Uri.parse("file://" + file.getPath());
						Intent pdfIntent = new Intent(Intent.ACTION_VIEW, uri);
						pdfIntent.putExtra("isTasking", "false");
						pdfIntent.putExtra("code", fileName);
						pdfIntent.putExtra("url", url);
						pdfIntent.setClass(context, PdfViewerActivity.class);
						context.startActivity(pdfIntent);

有些参数可以不传(这是项目需要)




4.打开txt文件

这个就简单了直接读取txt文件

读取方法

	new Thread() {
			public void run() {
				File file = new File(SdCardUtil.getSourcePath() + code);
				if (file.exists()) {
					try {
						InputStream in = new FileInputStream(file);
						String string = getString(in);
						Message msg = handler.obtainMessage();
						msg.obj = string;
						handler.sendMessage(msg);
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			};
		}.start();
getString方法

public static String getString(InputStream inputStream) {
		InputStreamReader inputStreamReader = null;
		try {
			inputStreamReader = new InputStreamReader(inputStream, "gbk");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		BufferedReader reader = new BufferedReader(inputStreamReader);
		StringBuffer sb = new StringBuffer("");
		String line;
		try {
			while ((line = reader.readLine()) != null) {
				sb.append(line);
				sb.append("\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sb.toString();
	}


pdf源码下载地址

点击打开链接

android-poi源码地址

点击打开链接


有什么不对的地方请指出,我也是刚学习奋斗奋斗








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值