在写这篇文章的时候真的是一把鼻涕一把泪,遇到了几个坑,搞了一天半才搞出来,资质愚钝了,网上查找了资料,发现基本上没有pdf转图片相关的,难道都没这个需求么,接下来我先描述下我遇到的问题和现象吧
首先我通过PdfRenderer将pdf文件转成bitmap集合,因为pdf文件可能有几页,所以需要集合装起来
然后将bitmap集合里面的每个bitmap都转化成png或者jpg存储到本地,问题来了
我将每个bitmap用imageview显示是可以的,然后去本地打开图片发现黑色,这个问题卡死我了,先预留着,下面再讲述,上代码逻辑了
- pdf转bitmap集合
private ArrayList<Bitmap> pdfToBitmap(File pdfFile) {
ArrayList<Bitmap> bitmaps = new ArrayList<>();
try {
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY));
Bitmap bitmap;
final int pageCount = renderer.getPageCount();
for (int i = 0; i < pageCount; i++) {
PdfRenderer.Page page = renderer.openPage(i);
int width = getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth();
int height = getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight();
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//todo 以下三行处理图片存储到本地出现黑屏的问题,这个涉及到背景问题
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(bitmap, 0, 0, null);
Rect r = new Rect(0, 0, width, height);
page.render(bitmap, r, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
bitmaps.add(bitmap);
// close the page
page.close();
}
// close the renderer
renderer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return bitmaps;
}
通过这个方法就可以得到bitmaps集合
然后将bitmaps集合里的每个bitmap都存储到本地
/**
* 将图片保存到文件
*/
public void saveImageToFile() {
ArrayList<Bitmap> bitmaps = pdfToBitmap(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/1/3.pdf"));
String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/3/";
for (int i = 0; i < bitmaps.size(); i++) {
try {
File file = new File(savePath);
if (!file.exists()) {
file.mkdirs();
}
String localFile = file.getAbsolutePath() + "/" + i + ".png";
Log.i("test_sign", "图片全路径localFile = " + localFile);
File f = new File(localFile);
FileOutputStream fos = new FileOutputStream(f);
bitmaps.get(i).compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样你就能在本地看到图片了,先将pdf转化得到bitmap,再将bitmap转成图片,这期间就有一个问题,就是会出现我上面描述的那种情况,不过我贴出来的代码里面已经处理了,就是TODO那里,有个原理分析,我分析也是基于个人理解,可能有误,如果有问题也希望各位大佬指教下
出现黑色原理分析:有个原理在里面,bitmap转png的时候,他本身有个空白背景是黑色的,然后当你用imageview去显示的时候,imageview会直接把图片背景变成白色,所以你能看得到,但是当你直接存储到本地的时候,那么背景为黑色的时候就会显现出来,所以看到的是黑色,所以我这个时候通过画布canvas把背景强制为白色,图片就有了
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(bitmap, 0, 0, null);
看到网上基本都没有pdf转化相关的,希望能帮到大家吧