我正在使用muPDF在我的应用程序中阅读PDF。我不喜欢它的默认动画(水平切换)。在另一方面,我发现this辉煌的图书馆对图像的卷曲效果,this项目的翻转翻盖效果对布局。
在curl示例项目中,在CurlActivity
中,所有数据都是图像,并在PageProvider
中设置如下:
private class PageProvider implements CurlView.PageProvider {
// Bitmap resources.
private int[] mBitmapIds = { R.drawable.image1, R.drawable.image2,
R.drawable.image3, R.drawable.image4};
并像这样使用它:
private CurlView mCurlView;
mCurlView = (CurlView) findViewById(R.id.curl);
mCurlView.setPageProvider(new PageProvider());
CurlView
从GLSurfaceView
延伸并实现View.OnTouchListener, CurlRenderer.Observer
但是在muPDF中如果我没有弄错的话,数据在core
对象中。 core
是MuPDFCore
的实例。并像这样使用它:
MuPDFReaderView mDocView;
MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView();
mDocView.setAdapter(new MuPDFPageAdapter(this, this, core));
MuPDFReaderView
延伸ReaderView
和ReaderView
延伸AdapterView<Adapter>
并实施GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener, Runnable
。
我的问题是如何在muPDF中使用curl效果?我应该在哪里逐页获取页面并将其转换为位图?然后将muPDF中适配器的各个方面更改为CurlView。
在翻盖式样本项目中,在FlipHorizontalLayoutActivity
(我也喜欢这个效果),我们有这些:
private FlipViewController flipView;
flipView = new FlipViewController(this, FlipViewController.HORIZONTAL);
flipView.setAdapter(new TravelAdapter(this));
setContentView(flipView);
FlipViewController
扩展AdapterView<Adapter>
,TravelAdapter
扩展BaseAdapter
的数据集。
之前没有人这样做过吗?或者可以帮助我做到这一点?!
修改
我找到了另一个带有卷曲效果的开源PDF阅读器,名为fbreaderJ。它的开发人员说“ An additional module允许在FBReader中打开PDF文件。基于radaee pdf库。”
我很困惑!因为radaeepdf是封闭源,downloadable project仅用于演示,插入的用户名和密码用于此包。 人们希望改变整个fbreader项目,如包名。令我困惑的另一个问题是这个额外的模块源代码在哪里?!
无论如何,如果有人想帮助我,那么fbreader已经做得很好。
修改
我与开发muPDF(或其中一位开发人员)的Robin Watts谈过,他说:
你读过platform / android / ClassStructure.txt吗? MuPDF是 主要是C库。因此标准API是C语言。宁 而不是像Java那样公开api(这将是 最好的解决方案,以及我做过一些工作的东西,但有 由于时间不够而未完成,我们已经实施了MuPDFCore 总结我们需要的部分。 MuPDFCore处理打开PDF文件, 并从中获取位图以在视图中使用。或者更确切地说,MuPDFCore 返回'views',而不是'bitmaps'。如果你需要位图,那么你就要去了 需要在MuPDFCore中进行更改。
更改MuPDFReaderView类的一小部分时有太多错误。我有点迷惑不解了!这些是彼此相关的。
请更准确地回答。
修改
赏金已过期。
答案 0 :(得分:2)
如果muPDF不支持渲染到位图,除了渲染到常规视图并将屏幕转储转换为如下位图之外别无选择:
View content = findViewById(R.id.yourPdfView);
Bitmap bitmap = content.getDrawingCache();
然后使用此位图作为其他库的输入。
答案 1 :(得分:1)
我应该在哪里逐页获取页面并将其转换为位图?
在我们的应用程序(报纸应用程序)中,我们使用MuPDF来呈现PDF。 工作流程如下:
所以,最后,我们使用的是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包装在一个新的Thread中并启动它。因此,将调用RenderTask的run方法:
@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's 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.。)我认为没有必要发布代码如何将位图设置为视图的背景