【发布时间】:2016-05-16 12:45:08
【问题描述】:
美好的一天,我几乎是 android studio 上的 pdf 渲染器的新手 > api 21,我找到了一个简单的代码来读取资产文件夹上的 pdf。 我的问题是,当它加载时,文件的第一页没有显示,除非我按下下一步按钮。我的应用程序旨在阅读用户手册 pdf。
package com.bloxofcode.phase1app;
import android.app.AlertDialog;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.pdf.PdfRenderer;
import android.os.ParcelFileDescriptor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class UsersManual extends AppCompatActivity {
private ImageView imageView;
private int currentPage = 0;
private Button next, previous;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_users_manual);
next = (Button) findViewById(R.id.next);
previous = (Button) findViewById(R.id.previous);
render();
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentPage++;
render();
}
});
previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentPage--;
render();
}
});
}
private void render() {
try{
imageView = (ImageView) findViewById(R.id.image);
int REQ_WIDTH = imageView.getWidth();
int REQ_HEIGHT = imageView.getHeight();
Bitmap bitmap = Bitmap.createBitmap(REQ_WIDTH, REQ_HEIGHT, Bitmap.Config.ARGB_8888);
//File file = new File("/sdcard/Download/sample.pdf");
AssetManager assetManager = getAssets();
InputStream in = null;
OutputStream out = null;
File file = new File(getFilesDir(), "Learning Python 5th Ed 2013.pdf");
try
{
in = assetManager.open("Learning Python 5th Ed 2013.pdf");
out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e)
{
Log.e("tag", e.getMessage());
}
//ParcelFileDescriptor p = getApplicationContext().getAssets().openFd("Learning Python 5th Ed 2013.pdf").getParcelFileDescriptor();
File f = new File(getFilesDir() + "/Learning Python 5th Ed 2013.pdf");
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
if(currentPage <= 0) {
currentPage = 0;
} else if(currentPage > renderer.getPageCount()) {
currentPage = renderer.getPageCount() - 1;
}
Matrix m = imageView.getImageMatrix();
Rect rect = new Rect(0, 0, REQ_WIDTH, REQ_HEIGHT);
renderer.openPage(currentPage).render(bitmap,rect, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
imageView.setImageMatrix(m);
imageView.setImageBitmap(bitmap);
imageView.invalidate();
} catch(Exception e) {
e.printStackTrace();
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException
{
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1)
{
out.write(buffer, 0, read);
}
}
}
【问题讨论】:
-
如果在渲染前增加 onCreate 中的页面计数器会怎样?
-
还是不行:(
-
我不明白为什么不这样做。启动活动和计时按钮之间的区别在于增加页面并再次调用渲染。也许你实际上需要调用render,增加计数器,然后在onCreate中再次渲染
标签: android pdf android-studio