PdfPage:
package org.vudroid.pdfdroid.codec;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.RectF;
import com.poqop.document.codec.CodecPage;
import java.nio.ByteBuffer;
public class PdfPage implements CodecPage
{
private long pageHandle;
private long docHandle;
private PdfPage(long pageHandle, long docHandle)
{
this.pageHandle = pageHandle;
this.docHandle = docHandle;
}
@Override
public Bitmap getbitMap() {
return renderBitmap(800,600,new RectF(0,0,1,1));
}
public boolean isDecoding()
{
return false; //TODO
}
public void waitForDecode()
{
//TODO
}
public int getWidth()
{
return (int) getMediaBox().width();
}
public int getHeight()
{
return (int) getMediaBox().height();
}
public Bitmap renderBitmap(int width, int height, RectF pageSliceBounds)
{
Matrix matrix = new Matrix();
matrix.postScale(width / getMediaBox().width(), -height / getMediaBox().height());
matrix.postTranslate(0, height);
matrix.postTranslate(-pageSliceBounds.left*width, -pageSliceBounds.top*height);
matrix.postScale(1/pageSliceBounds.width(), 1/pageSliceBounds.height());
return render(new Rect(0,0,width,height), matrix);
}
static PdfPage createPage(long dochandle, int pageno)
{
return new PdfPage(open(dochandle, pageno), dochandle);
}
@Override
protected void finalize() throws Throwable
{
recycle();
super.finalize();
}
public synchronized void recycle() {
if (pageHandle != 0) {
free(pageHandle);
pageHandle = 0;
}
}
private RectF getMediaBox()
{
float[] box = new float[4];
getMediaBox(pageHandle, box);
return new RectF(box[0], box[1], box[2], box[3]);
}
public Bitmap render(Rect viewbox, Matrix matrix)
{
int[] mRect = new int[4];
mRect[0] = viewbox.left;
mRect[1] = viewbox.top;
mRect[2] = viewbox.right;
mRect[3] = viewbox.bottom;
float[] matrixSource = new float[9];
float[] matrixArray = new float[6];
matrix.getValues(matrixSource);
matrixArray[0] = matrixSource[0];
matrixArray[1] = matrixSource[3];
matrixArray[2] = matrixSource[1];
matrixArray[3] = matrixSource[4];
matrixArray[4] = matrixSource[2];
matrixArray[5] = matrixSource[5];
int width = viewbox.width();
int height = viewbox.height();
int[] bufferarray = new int[width * height];
nativeCreateView(docHandle, pageHandle, mRect, matrixArray, bufferarray);
return Bitmap.createBitmap(bufferarray, width, height, Bitmap.Config.RGB_565);
/*ByteBuffer buffer = ByteBuffer.allocateDirect(width * height * 2);
render(docHandle, docHandle, mRect, matrixArray, buffer, ByteBuffer.allocateDirect(width * height * 8));
final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.copyPixelsFromBuffer(buffer);
return bitmap;*/
}
private static native void getMediaBox(long handle, float[] mediabox);
private static native void free(long handle);
private static native long open(long dochandle, int pageno);
private static native void render(long dochandle, long pagehandle,
int[] viewboxarray, float[] matrixarray,
ByteBuffer byteBuffer, ByteBuffer tempBuffer);
private native void nativeCreateView(long dochandle, long pagehandle,
int[] viewboxarray, float[] matrixarray,
int[] bufferarray);
}
PdfDocument:
package org.vudroid.pdfdroid.codec; import com.poqop.document.codec.CodecDocument; import com.poqop.document.codec.CodecPage; public class PdfDocument implements CodecDocument { private long docHandle; private static final int FITZMEMORY = 512 * 1024; private PdfDocument(long docHandle) { this.docHandle = docHandle; } public CodecPage getPage(int pageNumber) { return PdfPage.createPage(docHandle, pageNumber + 1); } public int getPageCount() { return getPageCount(docHandle); } static PdfDocument openDocument(String fname, String pwd) { return new PdfDocument(open(FITZMEMORY, fname, pwd)); } private static native long open(int fitzmemory, String fname, String pwd); private static native void free(long handle); private static native int getPageCount(long handle); @Override protected void finalize() throws Throwable { recycle(); super.finalize(); } public synchronized void recycle() { if (docHandle != 0) { free(docHandle); docHandle = 0; } } }
PdfContext:
package org.vudroid.pdfdroid.codec; import com.poqop.document.codec.CodecContext; import com.poqop.document.codec.CodecDocument; import com.poqop.document.codec.VuDroidLibraryLoader; import android.content.ContentResolver; public class PdfContext implements CodecContext { static { VuDroidLibraryLoader.load(); } public CodecDocument openDocument(String fileName) { return PdfDocument.openDocument(fileName, ""); } public void setContentResolver(ContentResolver contentResolver) { //TODO } public void recycle() { } }
VuDroidLibraryLoader
package com.poqop.document.codec; public class VuDroidLibraryLoader { private static boolean alreadyLoaded = false; public static void load() { if (alreadyLoaded) { return; } System.loadLibrary("vudroid"); alreadyLoaded = true; } }interface CodecContext:
package com.poqop.document.codec; import android.content.ContentResolver; public interface CodecContext { CodecDocument openDocument(String fileName); void setContentResolver(ContentResolver contentResolver); void recycle(); }
CodecDocument:
package com.poqop.document.codec; public interface CodecDocument { CodecPage getPage(int pageNumber); int getPageCount(); void recycle(); }
CodecContext:
package com.poqop.document.codec; import android.content.ContentResolver; public interface CodecContext { CodecDocument openDocument(String fileName); void setContentResolver(ContentResolver contentResolver); void recycle(); }
PdfToBitmapFactory:
package org.vudroid.pdfdroid.codec; import com.poqop.document.codec.CodecDocument; import com.poqop.document.codec.CodecPage; import com.poqop.document.utils.FileUtils; import com.poqop.document.utils.PathFromUri; import android.content.ContentResolver; import android.graphics.Bitmap; import android.net.Uri; import android.os.Handler; import android.util.Log; import java.io.File; public class PdfToBitmapFactory { private static PdfContext codecContext; private static CodecDocument document; private static CodecPage cod; public static void startParsePdf(final Handler handler, final ContentResolver contentResolver,final String pdfFilePath, final String bitmapSavePath){ new Thread(){ public void run(){ codecContext = new PdfContext(); Uri uri = Uri.fromFile(new File(pdfFilePath)); document = codecContext.openDocument(PathFromUri.retrieve( contentResolver, uri)); int a = document.getPageCount(); for (int i = 0; i < a; i++) { cod = document.getPage(i); Bitmap bitmap = cod.getbitMap(); Log.i("test","produce bitmap "+bitmap); FileUtils.saveBitmapToFile(bitmap, bitmapSavePath+"/"+"page_"+i); } handler.sendEmptyMessage(0); } }.start(); } }
PathFromUri:
package com.poqop.document.utils; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; public class PathFromUri { public static String retrieve(ContentResolver resolver, Uri uri) { if (uri.getScheme().equals("file")) { return uri.getPath(); } final Cursor cursor = resolver.query(uri, new String[]{"_data"}, null, null, null); if (cursor.moveToFirst()) { return cursor.getString(0); } throw new RuntimeException("Can't retrieve path from uri: " + uri.toString()); } }权限:<uses-permission android:name="com.android.email.permission.ACCESS_PROVIDER" />
<uses-permission android:name="com.android.email.permission.READ_ATTACHMENT" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在 libs下 放 libvudroid.so 文件,以给JNI调用。