Ответ 1
Где я должен получать страницы один за другим и преобразовывать их в растровые изображения?
В нашем приложении (приложение для газет) мы используем MuPDF для рендеринга PDF файлов. Рабочий процесс выглядит следующим образом:
- Загрузить PDF файл (у нас есть один PDF файл на странице газеты).
- Предоставить его с помощью MuPDF
- Сохранить растровое изображение в файловой системе
- Загрузите Bitmap из файловой системы в качестве фонового изображения в представление
Итак, наконец, мы используем MuPDFCore.java и его методы drawPage (...) и onDestroy()
Это то, что вы хотите знать, или я пропущу точку?
ИЗМЕНИТЬ
1.) Я думаю, что нет необходимости публиковать код, как загрузить файл. Но после загрузки я добавляю RenderTask (продолжается от Runnable) к Renderqueue и запускаю эту очередь. RenderTask нуждается в некоторой информации для рендеринга:
/**
* constructs a new RenderTask instance
* @param context: you need Context for MuPdfCore instance
* @param pageNumber
* @param pathToPdf
* @param renderCallback: callback to set bitmap to the view after
* rendering
* @param heightOfRenderedBitmap: this is the target height
* @param widthOfRenderedBitmap: this is the target width
*/
public RenderTask (Context context, Integer pageNumber, String pathToPdf, IRenderCallback,
renderCallback, int heightOfRenderedBitmap,
int widthOfRenderedBitmap) {
//store things in fields
}
2.) + 3.) Renderqueue обертывает RenderTask в новом потоке и запускает его. Таким образом будет запущен метод запуска RenderTask:
@Override
public void run () {
//do not render it if file exists
if (exists () == true) {
finish();
return;
}
Bitmap bitmap = render();
//if something went wrong, we can't store the bitmap
if (bitmap == null) {
finish();
return;
}
//now save the bitmap
// in my case i save the destination path in a String field
imagePath = save(bitmap, new File("path/to/your/destination/folder/" + pageNumber + ".jpg"));
bitmap.recycle();
finish();
}
/**
* let trigger the callback
*/
private void finish () {
if (renderCallback != null) {
// i send the whole Rendertask to callback
// maybe in your case it is enough to send the pageNumber or path to
// renderend bitmap
renderCallback.finished(this);
}
}
/**
* renders a bitmap
* @return
*/
private Bitmap render() {
MuPDFCore core = null;
try {
core = new MuPDFCore(context, pathToPdf);
} catch (Exception e) {
return null;
}
Bitmap bm = Bitmap.createBitmap(widthOfRenderedBitmap, heightOfRenderedBitmap, Config.ARGB_8888);
// here you render the WHOLE pdf cause patch-x/-y == 0
core.drawPage(bm, 0, widthOfRenderedBitmap, heightOfRenderedBitmap, 0, 0, widthOfRenderedBitmap, heightOfRenderedBitmap, core.new Cookie());
core.onDestroy();
core = null;
return bm;
}
/**
* saves bitmap to filesystem
* @param bitmap
* @param image
* @return
*/
private String save(Bitmap bitmap, File image) {
FileOutputStream out = null;
try {
out = new FileOutputStream(image.getAbsolutePath());
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
return image.getAbsolutePath();
} catch (Exception e) {
return null;
}
finally {
try {
if (out != null) {
out.close();
}
} catch(Throwable ignore) {}
}
}
}
4.) Я думаю, что нет необходимости публиковать код, как установить растровое изображение в качестве фона вида