Android下读取PDF文件的解决方案

代码修改自该处(开源 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}

源码下载:

http://dl.vmall.com/c0x4dky4py

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )