代码修改自该处(开源 Android pdf 阅读器开发总结)作者分享到Google code的代码,经仔细阅读后整理出读取PDF文档的主要部分(vudroid so库的使用),原作者应该也是在vudroid项目下稍微进行了修改,代码有点乱,所以我整理了下,把关键地方抽了出来,项目中没有提供vudroid so库的源码,所以知道的接口只有那几个,想完整了解vudroid库接口的建议去下载vudroid官方源码,再自行通过ndk编译.(源码下载依然在最后)


1import android.os.Bundle; 2import android.app.Activity; 3import android.graphics.Bitmap; 4import android.graphics.RectF; 5import android.view.Menu; 6import android.view.MotionEvent; 7import android.widget.ImageView; 8import android.graphics.Matrix; 9import android.graphics.PointF; 10import android.util.FloatMath; 11 12import org.vudroid.pdfdroid.codec.*; 13 14 15public class MainActivity extends Activity { 16 private PdfContext pdf_conext; 17 private ImageView view; 18 19 private float screen_width = 800; 20 private float screen_height = 1280; 21 22 @Override 23 public void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 view = (ImageView)findViewById(R.id.imageView1); 27 28 pdf_conext = new PdfContext(); 29 PdfDocument d = pdf_conext.openDocument("/sdcard/test.pdf"); 30 31 PdfPage vuPage = d.getPage(1); 32 RectF rf = new RectF(); 33 rf.bottom = rf.right = (float)1.0; 34 //参数一二为生成图片的宽高,参数三Rect的top,left,bottom,right为截取部分在该页中的百分比位置 35 //例如top=0.5,left=0.5,right=1.0,1.0则截取右下角四分之一的部分 36 Bitmap bitmap = vuPage.renderBitmap((int)screen_width, (int)screen_height, rf); 37 view.setImageBitmap(bitmap); 38 } 39 40 @Override 41 public boolean onCreateOptionsMenu(Menu menu) { 42 getMenuInflater().inflate(R.menu.activity_main, menu); 43 return true; 44 } 45 46 Matrix matrix = new Matrix(); 47 Matrix savedMatrix = new Matrix(); 48 static final int NONE = 0; 49 static final int DRAG = 1; 50 static final int ZOOM = 2; 51 int mode = NONE; 52 PointF start = new PointF(); 53 PointF mid = new PointF(); 54 float oldDist = 1f; 55 @Override 56 public boolean onTouchEvent(MotionEvent event) { 57 switch (event.getAction() & MotionEvent.ACTION_MASK) { 58 case MotionEvent.ACTION_DOWN: 59 matrix.set(view.getImageMatrix()); 60 savedMatrix.set(matrix); 61 start.set(event.getX(), event.getY()); 62 mode = DRAG; 63 64 break; 65 case MotionEvent.ACTION_POINTER_DOWN: 66 oldDist = spacing(event); 67 if (oldDist > 10f) { 68 savedMatrix.set(matrix); 69 midPoint(mid, event); 70 mode = ZOOM; 71 } 72 break; 73 case MotionEvent.ACTION_UP: 74 case MotionEvent.ACTION_POINTER_UP: 75 mode = NONE; 76 break; 77 case MotionEvent.ACTION_MOVE: 78 if (mode == DRAG) { 79 matrix.set(savedMatrix); 80 matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); 81 82 keepInSight(matrix); 83 84 } else if (mode == ZOOM) { 85 float newDist = spacing(event); 86 if (newDist > 10f) { 87 matrix.set(savedMatrix); 88 float scale = newDist / oldDist; 89 matrix.postScale(scale, scale, mid.x, mid.y); 90 91 keepInSight(matrix); 92 } 93 } 94 break; 95 } 96 view.setImageMatrix(matrix); 97 return true; 98 } 99 100 private float spacing(MotionEvent event) { 101 float x = event.getX(0) - event.getX(1); 102 float y = event.getY(0) - event.getY(1); 103 return FloatMath.sqrt(x * x + y * y); 104 } 105 106 private void midPoint(PointF point, MotionEvent event) { 107 float x = event.getX(0) + event.getX(1); 108 float y = event.getY(0) + event.getY(1); 109 point.set(x / 2, y / 2); 110 } 111 112 private void keepInSight(Matrix m){ 113 float f[] = new float[9]; 114 m.getValues(f); 115 if(f[0]<1) f[0]=1; 116 if(f[4]<1) f[4]=1; 117 118 if(f[2]>0) f[2]=0; 119 if(f[5]>0) f[5]=0; 120 121 float l = screen_width-screen_width*f[0]; 122 if(f[2]<l) f[2] = l; 123 124 float t = screen_height-screen_height*f[0]; 125 if(f[5]<t) f[5] = t; 126 127 m.setValues(f); 128 } 129}
源码下载: